SemaExprObjC.cpp revision 9670e179a67d868e171feac44fb8f9e2f108c5e8
1//===--- SemaExprObjC.cpp - Semantic Analysis for ObjC Expressions --------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements semantic analysis for Objective-C expressions. 11// 12//===----------------------------------------------------------------------===// 13 14#include "clang/Sema/SemaInternal.h" 15#include "clang/Sema/Lookup.h" 16#include "clang/Sema/Scope.h" 17#include "clang/Sema/ScopeInfo.h" 18#include "clang/Sema/Initialization.h" 19#include "clang/AST/ASTContext.h" 20#include "clang/AST/DeclObjC.h" 21#include "clang/AST/ExprObjC.h" 22#include "clang/AST/StmtVisitor.h" 23#include "clang/AST/TypeLoc.h" 24#include "llvm/ADT/SmallString.h" 25#include "clang/Lex/Preprocessor.h" 26 27using namespace clang; 28using namespace sema; 29 30ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs, 31 Expr **strings, 32 unsigned NumStrings) { 33 StringLiteral **Strings = reinterpret_cast<StringLiteral**>(strings); 34 35 // Most ObjC strings are formed out of a single piece. However, we *can* 36 // have strings formed out of multiple @ strings with multiple pptokens in 37 // each one, e.g. @"foo" "bar" @"baz" "qux" which need to be turned into one 38 // StringLiteral for ObjCStringLiteral to hold onto. 39 StringLiteral *S = Strings[0]; 40 41 // If we have a multi-part string, merge it all together. 42 if (NumStrings != 1) { 43 // Concatenate objc strings. 44 llvm::SmallString<128> StrBuf; 45 llvm::SmallVector<SourceLocation, 8> StrLocs; 46 47 for (unsigned i = 0; i != NumStrings; ++i) { 48 S = Strings[i]; 49 50 // ObjC strings can't be wide. 51 if (S->isWide()) { 52 Diag(S->getLocStart(), diag::err_cfstring_literal_not_string_constant) 53 << S->getSourceRange(); 54 return true; 55 } 56 57 // Append the string. 58 StrBuf += S->getString(); 59 60 // Get the locations of the string tokens. 61 StrLocs.append(S->tokloc_begin(), S->tokloc_end()); 62 } 63 64 // Create the aggregate string with the appropriate content and location 65 // information. 66 S = StringLiteral::Create(Context, StrBuf, 67 /*Wide=*/false, /*Pascal=*/false, 68 Context.getPointerType(Context.CharTy), 69 &StrLocs[0], StrLocs.size()); 70 } 71 72 // Verify that this composite string is acceptable for ObjC strings. 73 if (CheckObjCString(S)) 74 return true; 75 76 // Initialize the constant string interface lazily. This assumes 77 // the NSString interface is seen in this translation unit. Note: We 78 // don't use NSConstantString, since the runtime team considers this 79 // interface private (even though it appears in the header files). 80 QualType Ty = Context.getObjCConstantStringInterface(); 81 if (!Ty.isNull()) { 82 Ty = Context.getObjCObjectPointerType(Ty); 83 } else if (getLangOptions().NoConstantCFStrings) { 84 IdentifierInfo *NSIdent=0; 85 std::string StringClass(getLangOptions().ObjCConstantStringClass); 86 87 if (StringClass.empty()) 88 NSIdent = &Context.Idents.get("NSConstantString"); 89 else 90 NSIdent = &Context.Idents.get(StringClass); 91 92 NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLocs[0], 93 LookupOrdinaryName); 94 if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) { 95 Context.setObjCConstantStringInterface(StrIF); 96 Ty = Context.getObjCConstantStringInterface(); 97 Ty = Context.getObjCObjectPointerType(Ty); 98 } else { 99 // If there is no NSConstantString interface defined then treat this 100 // as error and recover from it. 101 Diag(S->getLocStart(), diag::err_no_nsconstant_string_class) << NSIdent 102 << S->getSourceRange(); 103 Ty = Context.getObjCIdType(); 104 } 105 } else { 106 IdentifierInfo *NSIdent = &Context.Idents.get("NSString"); 107 NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLocs[0], 108 LookupOrdinaryName); 109 if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) { 110 Context.setObjCConstantStringInterface(StrIF); 111 Ty = Context.getObjCConstantStringInterface(); 112 Ty = Context.getObjCObjectPointerType(Ty); 113 } else { 114 // If there is no NSString interface defined then treat constant 115 // strings as untyped objects and let the runtime figure it out later. 116 Ty = Context.getObjCIdType(); 117 } 118 } 119 120 return new (Context) ObjCStringLiteral(S, Ty, AtLocs[0]); 121} 122 123ExprResult Sema::BuildObjCEncodeExpression(SourceLocation AtLoc, 124 TypeSourceInfo *EncodedTypeInfo, 125 SourceLocation RParenLoc) { 126 QualType EncodedType = EncodedTypeInfo->getType(); 127 QualType StrTy; 128 if (EncodedType->isDependentType()) 129 StrTy = Context.DependentTy; 130 else { 131 if (!EncodedType->getAsArrayTypeUnsafe() && //// Incomplete array is handled. 132 !EncodedType->isVoidType()) // void is handled too. 133 if (RequireCompleteType(AtLoc, EncodedType, 134 PDiag(diag::err_incomplete_type_objc_at_encode) 135 << EncodedTypeInfo->getTypeLoc().getSourceRange())) 136 return ExprError(); 137 138 std::string Str; 139 Context.getObjCEncodingForType(EncodedType, Str); 140 141 // The type of @encode is the same as the type of the corresponding string, 142 // which is an array type. 143 StrTy = Context.CharTy; 144 // A C++ string literal has a const-qualified element type (C++ 2.13.4p1). 145 if (getLangOptions().CPlusPlus || getLangOptions().ConstStrings) 146 StrTy.addConst(); 147 StrTy = Context.getConstantArrayType(StrTy, llvm::APInt(32, Str.size()+1), 148 ArrayType::Normal, 0); 149 } 150 151 return new (Context) ObjCEncodeExpr(StrTy, EncodedTypeInfo, AtLoc, RParenLoc); 152} 153 154ExprResult Sema::ParseObjCEncodeExpression(SourceLocation AtLoc, 155 SourceLocation EncodeLoc, 156 SourceLocation LParenLoc, 157 ParsedType ty, 158 SourceLocation RParenLoc) { 159 // FIXME: Preserve type source info ? 160 TypeSourceInfo *TInfo; 161 QualType EncodedType = GetTypeFromParser(ty, &TInfo); 162 if (!TInfo) 163 TInfo = Context.getTrivialTypeSourceInfo(EncodedType, 164 PP.getLocForEndOfToken(LParenLoc)); 165 166 return BuildObjCEncodeExpression(AtLoc, TInfo, RParenLoc); 167} 168 169ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, 170 SourceLocation AtLoc, 171 SourceLocation SelLoc, 172 SourceLocation LParenLoc, 173 SourceLocation RParenLoc) { 174 ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel, 175 SourceRange(LParenLoc, RParenLoc), false, false); 176 if (!Method) 177 Method = LookupFactoryMethodInGlobalPool(Sel, 178 SourceRange(LParenLoc, RParenLoc)); 179 if (!Method) 180 Diag(SelLoc, diag::warn_undeclared_selector) << Sel; 181 182 llvm::DenseMap<Selector, SourceLocation>::iterator Pos 183 = ReferencedSelectors.find(Sel); 184 if (Pos == ReferencedSelectors.end()) 185 ReferencedSelectors.insert(std::make_pair(Sel, SelLoc)); 186 187 // In ARC, forbid the user from using @selector for 188 // retain/release/autorelease/dealloc/retainCount. 189 if (getLangOptions().ObjCAutoRefCount) { 190 switch (Sel.getMethodFamily()) { 191 case OMF_retain: 192 case OMF_release: 193 case OMF_autorelease: 194 case OMF_retainCount: 195 case OMF_dealloc: 196 Diag(AtLoc, diag::err_arc_illegal_selector) << 197 Sel << SourceRange(LParenLoc, RParenLoc); 198 break; 199 200 case OMF_None: 201 case OMF_alloc: 202 case OMF_copy: 203 case OMF_init: 204 case OMF_mutableCopy: 205 case OMF_new: 206 case OMF_self: 207 case OMF_performSelector: 208 break; 209 } 210 } 211 QualType Ty = Context.getObjCSelType(); 212 return new (Context) ObjCSelectorExpr(Ty, Sel, AtLoc, RParenLoc); 213} 214 215ExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId, 216 SourceLocation AtLoc, 217 SourceLocation ProtoLoc, 218 SourceLocation LParenLoc, 219 SourceLocation RParenLoc) { 220 ObjCProtocolDecl* PDecl = LookupProtocol(ProtocolId, ProtoLoc); 221 if (!PDecl) { 222 Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId; 223 return true; 224 } 225 226 QualType Ty = Context.getObjCProtoType(); 227 if (Ty.isNull()) 228 return true; 229 Ty = Context.getObjCObjectPointerType(Ty); 230 return new (Context) ObjCProtocolExpr(Ty, PDecl, AtLoc, RParenLoc); 231} 232 233/// Try to capture an implicit reference to 'self'. 234ObjCMethodDecl *Sema::tryCaptureObjCSelf() { 235 // Ignore block scopes: we can capture through them. 236 DeclContext *DC = CurContext; 237 while (true) { 238 if (isa<BlockDecl>(DC)) DC = cast<BlockDecl>(DC)->getDeclContext(); 239 else if (isa<EnumDecl>(DC)) DC = cast<EnumDecl>(DC)->getDeclContext(); 240 else break; 241 } 242 243 // If we're not in an ObjC method, error out. Note that, unlike the 244 // C++ case, we don't require an instance method --- class methods 245 // still have a 'self', and we really do still need to capture it! 246 ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(DC); 247 if (!method) 248 return 0; 249 250 ImplicitParamDecl *self = method->getSelfDecl(); 251 assert(self && "capturing 'self' in non-definition?"); 252 253 // Mark that we're closing on 'this' in all the block scopes, if applicable. 254 for (unsigned idx = FunctionScopes.size() - 1; 255 isa<BlockScopeInfo>(FunctionScopes[idx]); 256 --idx) { 257 BlockScopeInfo *blockScope = cast<BlockScopeInfo>(FunctionScopes[idx]); 258 unsigned &captureIndex = blockScope->CaptureMap[self]; 259 if (captureIndex) break; 260 261 bool nested = isa<BlockScopeInfo>(FunctionScopes[idx-1]); 262 blockScope->Captures.push_back( 263 BlockDecl::Capture(self, /*byref*/ false, nested, /*copy*/ 0)); 264 captureIndex = blockScope->Captures.size(); // +1 265 } 266 267 return method; 268} 269 270QualType Sema::getMessageSendResultType(QualType ReceiverType, 271 ObjCMethodDecl *Method, 272 bool isClassMessage, bool isSuperMessage) { 273 assert(Method && "Must have a method"); 274 if (!Method->hasRelatedResultType()) 275 return Method->getSendResultType(); 276 277 // If a method has a related return type: 278 // - if the method found is an instance method, but the message send 279 // was a class message send, T is the declared return type of the method 280 // found 281 if (Method->isInstanceMethod() && isClassMessage) 282 return Method->getSendResultType(); 283 284 // - if the receiver is super, T is a pointer to the class of the 285 // enclosing method definition 286 if (isSuperMessage) { 287 if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 288 if (ObjCInterfaceDecl *Class = CurMethod->getClassInterface()) 289 return Context.getObjCObjectPointerType( 290 Context.getObjCInterfaceType(Class)); 291 } 292 293 // - if the receiver is the name of a class U, T is a pointer to U 294 if (ReceiverType->getAs<ObjCInterfaceType>() || 295 ReceiverType->isObjCQualifiedInterfaceType()) 296 return Context.getObjCObjectPointerType(ReceiverType); 297 // - if the receiver is of type Class or qualified Class type, 298 // T is the declared return type of the method. 299 if (ReceiverType->isObjCClassType() || 300 ReceiverType->isObjCQualifiedClassType()) 301 return Method->getSendResultType(); 302 303 // - if the receiver is id, qualified id, Class, or qualified Class, T 304 // is the receiver type, otherwise 305 // - T is the type of the receiver expression. 306 return ReceiverType; 307} 308 309void Sema::EmitRelatedResultTypeNote(const Expr *E) { 310 E = E->IgnoreParenImpCasts(); 311 const ObjCMessageExpr *MsgSend = dyn_cast<ObjCMessageExpr>(E); 312 if (!MsgSend) 313 return; 314 315 const ObjCMethodDecl *Method = MsgSend->getMethodDecl(); 316 if (!Method) 317 return; 318 319 if (!Method->hasRelatedResultType()) 320 return; 321 322 if (Context.hasSameUnqualifiedType(Method->getResultType() 323 .getNonReferenceType(), 324 MsgSend->getType())) 325 return; 326 327 Diag(Method->getLocation(), diag::note_related_result_type_inferred) 328 << Method->isInstanceMethod() << Method->getSelector() 329 << MsgSend->getType(); 330} 331 332bool Sema::CheckMessageArgumentTypes(QualType ReceiverType, 333 Expr **Args, unsigned NumArgs, 334 Selector Sel, ObjCMethodDecl *Method, 335 bool isClassMessage, bool isSuperMessage, 336 SourceLocation lbrac, SourceLocation rbrac, 337 QualType &ReturnType, ExprValueKind &VK) { 338 if (!Method) { 339 // Apply default argument promotion as for (C99 6.5.2.2p6). 340 for (unsigned i = 0; i != NumArgs; i++) { 341 if (Args[i]->isTypeDependent()) 342 continue; 343 344 ExprResult Result = DefaultArgumentPromotion(Args[i]); 345 if (Result.isInvalid()) 346 return true; 347 Args[i] = Result.take(); 348 } 349 350 unsigned DiagID; 351 if (getLangOptions().ObjCAutoRefCount) 352 DiagID = diag::err_arc_method_not_found; 353 else 354 DiagID = isClassMessage ? diag::warn_class_method_not_found 355 : diag::warn_inst_method_not_found; 356 Diag(lbrac, DiagID) 357 << Sel << isClassMessage << SourceRange(lbrac, rbrac); 358 ReturnType = Context.getObjCIdType(); 359 VK = VK_RValue; 360 return false; 361 } 362 363 ReturnType = getMessageSendResultType(ReceiverType, Method, isClassMessage, 364 isSuperMessage); 365 VK = Expr::getValueKindForType(Method->getResultType()); 366 367 unsigned NumNamedArgs = Sel.getNumArgs(); 368 // Method might have more arguments than selector indicates. This is due 369 // to addition of c-style arguments in method. 370 if (Method->param_size() > Sel.getNumArgs()) 371 NumNamedArgs = Method->param_size(); 372 // FIXME. This need be cleaned up. 373 if (NumArgs < NumNamedArgs) { 374 Diag(lbrac, diag::err_typecheck_call_too_few_args) 375 << 2 << NumNamedArgs << NumArgs; 376 return false; 377 } 378 379 bool IsError = false; 380 for (unsigned i = 0; i < NumNamedArgs; i++) { 381 // We can't do any type-checking on a type-dependent argument. 382 if (Args[i]->isTypeDependent()) 383 continue; 384 385 Expr *argExpr = Args[i]; 386 387 ParmVarDecl *Param = Method->param_begin()[i]; 388 assert(argExpr && "CheckMessageArgumentTypes(): missing expression"); 389 390 if (RequireCompleteType(argExpr->getSourceRange().getBegin(), 391 Param->getType(), 392 PDiag(diag::err_call_incomplete_argument) 393 << argExpr->getSourceRange())) 394 return true; 395 396 InitializedEntity Entity = InitializedEntity::InitializeParameter(Context, 397 Param); 398 ExprResult ArgE = PerformCopyInitialization(Entity, lbrac, Owned(argExpr)); 399 if (ArgE.isInvalid()) 400 IsError = true; 401 else 402 Args[i] = ArgE.takeAs<Expr>(); 403 } 404 405 // Promote additional arguments to variadic methods. 406 if (Method->isVariadic()) { 407 for (unsigned i = NumNamedArgs; i < NumArgs; ++i) { 408 if (Args[i]->isTypeDependent()) 409 continue; 410 411 ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod, 0); 412 IsError |= Arg.isInvalid(); 413 Args[i] = Arg.take(); 414 } 415 } else { 416 // Check for extra arguments to non-variadic methods. 417 if (NumArgs != NumNamedArgs) { 418 Diag(Args[NumNamedArgs]->getLocStart(), 419 diag::err_typecheck_call_too_many_args) 420 << 2 /*method*/ << NumNamedArgs << NumArgs 421 << Method->getSourceRange() 422 << SourceRange(Args[NumNamedArgs]->getLocStart(), 423 Args[NumArgs-1]->getLocEnd()); 424 } 425 } 426 // diagnose nonnull arguments. 427 for (specific_attr_iterator<NonNullAttr> 428 i = Method->specific_attr_begin<NonNullAttr>(), 429 e = Method->specific_attr_end<NonNullAttr>(); i != e; ++i) { 430 CheckNonNullArguments(*i, Args, lbrac); 431 } 432 433 DiagnoseSentinelCalls(Method, lbrac, Args, NumArgs); 434 return IsError; 435} 436 437bool Sema::isSelfExpr(Expr *receiver) { 438 // 'self' is objc 'self' in an objc method only. 439 DeclContext *DC = CurContext; 440 while (isa<BlockDecl>(DC)) 441 DC = DC->getParent(); 442 if (DC && !isa<ObjCMethodDecl>(DC)) 443 return false; 444 receiver = receiver->IgnoreParenLValueCasts(); 445 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(receiver)) 446 if (DRE->getDecl()->getIdentifier() == &Context.Idents.get("self")) 447 return true; 448 return false; 449} 450 451// Helper method for ActOnClassMethod/ActOnInstanceMethod. 452// Will search "local" class/category implementations for a method decl. 453// If failed, then we search in class's root for an instance method. 454// Returns 0 if no method is found. 455ObjCMethodDecl *Sema::LookupPrivateClassMethod(Selector Sel, 456 ObjCInterfaceDecl *ClassDecl) { 457 ObjCMethodDecl *Method = 0; 458 // lookup in class and all superclasses 459 while (ClassDecl && !Method) { 460 if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 461 Method = ImpDecl->getClassMethod(Sel); 462 463 // Look through local category implementations associated with the class. 464 if (!Method) 465 Method = ClassDecl->getCategoryClassMethod(Sel); 466 467 // Before we give up, check if the selector is an instance method. 468 // But only in the root. This matches gcc's behaviour and what the 469 // runtime expects. 470 if (!Method && !ClassDecl->getSuperClass()) { 471 Method = ClassDecl->lookupInstanceMethod(Sel); 472 // Look through local category implementations associated 473 // with the root class. 474 if (!Method) 475 Method = LookupPrivateInstanceMethod(Sel, ClassDecl); 476 } 477 478 ClassDecl = ClassDecl->getSuperClass(); 479 } 480 return Method; 481} 482 483ObjCMethodDecl *Sema::LookupPrivateInstanceMethod(Selector Sel, 484 ObjCInterfaceDecl *ClassDecl) { 485 ObjCMethodDecl *Method = 0; 486 while (ClassDecl && !Method) { 487 // If we have implementations in scope, check "private" methods. 488 if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 489 Method = ImpDecl->getInstanceMethod(Sel); 490 491 // Look through local category implementations associated with the class. 492 if (!Method) 493 Method = ClassDecl->getCategoryInstanceMethod(Sel); 494 ClassDecl = ClassDecl->getSuperClass(); 495 } 496 return Method; 497} 498 499/// LookupMethodInQualifiedType - Lookups up a method in protocol qualifier 500/// list of a qualified objective pointer type. 501ObjCMethodDecl *Sema::LookupMethodInQualifiedType(Selector Sel, 502 const ObjCObjectPointerType *OPT, 503 bool Instance) 504{ 505 ObjCMethodDecl *MD = 0; 506 for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 507 E = OPT->qual_end(); I != E; ++I) { 508 ObjCProtocolDecl *PROTO = (*I); 509 if ((MD = PROTO->lookupMethod(Sel, Instance))) { 510 return MD; 511 } 512 } 513 return 0; 514} 515 516/// HandleExprPropertyRefExpr - Handle foo.bar where foo is a pointer to an 517/// objective C interface. This is a property reference expression. 518ExprResult Sema:: 519HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT, 520 Expr *BaseExpr, SourceLocation OpLoc, 521 DeclarationName MemberName, 522 SourceLocation MemberLoc, 523 SourceLocation SuperLoc, QualType SuperType, 524 bool Super) { 525 const ObjCInterfaceType *IFaceT = OPT->getInterfaceType(); 526 ObjCInterfaceDecl *IFace = IFaceT->getDecl(); 527 528 if (MemberName.getNameKind() != DeclarationName::Identifier) { 529 Diag(MemberLoc, diag::err_invalid_property_name) 530 << MemberName << QualType(OPT, 0); 531 return ExprError(); 532 } 533 534 IdentifierInfo *Member = MemberName.getAsIdentifierInfo(); 535 536 if (IFace->isForwardDecl()) { 537 Diag(MemberLoc, diag::err_property_not_found_forward_class) 538 << MemberName << QualType(OPT, 0); 539 Diag(IFace->getLocation(), diag::note_forward_class); 540 return ExprError(); 541 } 542 // Search for a declared property first. 543 if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(Member)) { 544 // Check whether we can reference this property. 545 if (DiagnoseUseOfDecl(PD, MemberLoc)) 546 return ExprError(); 547 QualType ResTy = PD->getType(); 548 ResTy = ResTy.getNonLValueExprType(Context); 549 Selector Sel = PP.getSelectorTable().getNullarySelector(Member); 550 ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel); 551 if (Getter && 552 (Getter->hasRelatedResultType() 553 || DiagnosePropertyAccessorMismatch(PD, Getter, MemberLoc))) 554 ResTy = getMessageSendResultType(QualType(OPT, 0), Getter, false, 555 Super); 556 557 if (Super) 558 return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy, 559 VK_LValue, OK_ObjCProperty, 560 MemberLoc, 561 SuperLoc, SuperType)); 562 else 563 return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy, 564 VK_LValue, OK_ObjCProperty, 565 MemberLoc, BaseExpr)); 566 } 567 // Check protocols on qualified interfaces. 568 for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 569 E = OPT->qual_end(); I != E; ++I) 570 if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(Member)) { 571 // Check whether we can reference this property. 572 if (DiagnoseUseOfDecl(PD, MemberLoc)) 573 return ExprError(); 574 575 QualType T = PD->getType(); 576 if (ObjCMethodDecl *Getter = PD->getGetterMethodDecl()) 577 T = getMessageSendResultType(QualType(OPT, 0), Getter, false, Super); 578 if (Super) 579 return Owned(new (Context) ObjCPropertyRefExpr(PD, T, 580 VK_LValue, 581 OK_ObjCProperty, 582 MemberLoc, 583 SuperLoc, SuperType)); 584 else 585 return Owned(new (Context) ObjCPropertyRefExpr(PD, T, 586 VK_LValue, 587 OK_ObjCProperty, 588 MemberLoc, 589 BaseExpr)); 590 } 591 // If that failed, look for an "implicit" property by seeing if the nullary 592 // selector is implemented. 593 594 // FIXME: The logic for looking up nullary and unary selectors should be 595 // shared with the code in ActOnInstanceMessage. 596 597 Selector Sel = PP.getSelectorTable().getNullarySelector(Member); 598 ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel); 599 600 // May be founf in property's qualified list. 601 if (!Getter) 602 Getter = LookupMethodInQualifiedType(Sel, OPT, true); 603 604 // If this reference is in an @implementation, check for 'private' methods. 605 if (!Getter) 606 Getter = IFace->lookupPrivateMethod(Sel); 607 608 // Look through local category implementations associated with the class. 609 if (!Getter) 610 Getter = IFace->getCategoryInstanceMethod(Sel); 611 if (Getter) { 612 // Check if we can reference this property. 613 if (DiagnoseUseOfDecl(Getter, MemberLoc)) 614 return ExprError(); 615 } 616 // If we found a getter then this may be a valid dot-reference, we 617 // will look for the matching setter, in case it is needed. 618 Selector SetterSel = 619 SelectorTable::constructSetterName(PP.getIdentifierTable(), 620 PP.getSelectorTable(), Member); 621 ObjCMethodDecl *Setter = IFace->lookupInstanceMethod(SetterSel); 622 623 // May be founf in property's qualified list. 624 if (!Setter) 625 Setter = LookupMethodInQualifiedType(SetterSel, OPT, true); 626 627 if (!Setter) { 628 // If this reference is in an @implementation, also check for 'private' 629 // methods. 630 Setter = IFace->lookupPrivateMethod(SetterSel); 631 } 632 // Look through local category implementations associated with the class. 633 if (!Setter) 634 Setter = IFace->getCategoryInstanceMethod(SetterSel); 635 636 if (Setter && DiagnoseUseOfDecl(Setter, MemberLoc)) 637 return ExprError(); 638 639 if (Getter || Setter) { 640 QualType PType; 641 if (Getter) 642 PType = getMessageSendResultType(QualType(OPT, 0), Getter, false, Super); 643 else { 644 ParmVarDecl *ArgDecl = *Setter->param_begin(); 645 PType = ArgDecl->getType(); 646 } 647 648 ExprValueKind VK = VK_LValue; 649 ExprObjectKind OK = OK_ObjCProperty; 650 if (!getLangOptions().CPlusPlus && !PType.hasQualifiers() && 651 PType->isVoidType()) 652 VK = VK_RValue, OK = OK_Ordinary; 653 654 if (Super) 655 return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter, 656 PType, VK, OK, 657 MemberLoc, 658 SuperLoc, SuperType)); 659 else 660 return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter, 661 PType, VK, OK, 662 MemberLoc, BaseExpr)); 663 664 } 665 666 // Attempt to correct for typos in property names. 667 TypoCorrection Corrected = CorrectTypo( 668 DeclarationNameInfo(MemberName, MemberLoc), LookupOrdinaryName, NULL, 669 NULL, IFace, false, CTC_NoKeywords, OPT); 670 if (ObjCPropertyDecl *Property = 671 Corrected.getCorrectionDeclAs<ObjCPropertyDecl>()) { 672 DeclarationName TypoResult = Corrected.getCorrection(); 673 Diag(MemberLoc, diag::err_property_not_found_suggest) 674 << MemberName << QualType(OPT, 0) << TypoResult 675 << FixItHint::CreateReplacement(MemberLoc, TypoResult.getAsString()); 676 Diag(Property->getLocation(), diag::note_previous_decl) 677 << Property->getDeclName(); 678 return HandleExprPropertyRefExpr(OPT, BaseExpr, OpLoc, 679 TypoResult, MemberLoc, 680 SuperLoc, SuperType, Super); 681 } 682 ObjCInterfaceDecl *ClassDeclared; 683 if (ObjCIvarDecl *Ivar = 684 IFace->lookupInstanceVariable(Member, ClassDeclared)) { 685 QualType T = Ivar->getType(); 686 if (const ObjCObjectPointerType * OBJPT = 687 T->getAsObjCInterfacePointerType()) { 688 const ObjCInterfaceType *IFaceT = OBJPT->getInterfaceType(); 689 if (ObjCInterfaceDecl *IFace = IFaceT->getDecl()) 690 if (IFace->isForwardDecl()) { 691 Diag(MemberLoc, diag::err_property_not_as_forward_class) 692 << MemberName << IFace; 693 Diag(IFace->getLocation(), diag::note_forward_class); 694 return ExprError(); 695 } 696 } 697 Diag(MemberLoc, 698 diag::err_ivar_access_using_property_syntax_suggest) 699 << MemberName << QualType(OPT, 0) << Ivar->getDeclName() 700 << FixItHint::CreateReplacement(OpLoc, "->"); 701 return ExprError(); 702 } 703 704 Diag(MemberLoc, diag::err_property_not_found) 705 << MemberName << QualType(OPT, 0); 706 if (Setter) 707 Diag(Setter->getLocation(), diag::note_getter_unavailable) 708 << MemberName << BaseExpr->getSourceRange(); 709 return ExprError(); 710} 711 712 713 714ExprResult Sema:: 715ActOnClassPropertyRefExpr(IdentifierInfo &receiverName, 716 IdentifierInfo &propertyName, 717 SourceLocation receiverNameLoc, 718 SourceLocation propertyNameLoc) { 719 720 IdentifierInfo *receiverNamePtr = &receiverName; 721 ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(receiverNamePtr, 722 receiverNameLoc); 723 724 bool IsSuper = false; 725 if (IFace == 0) { 726 // If the "receiver" is 'super' in a method, handle it as an expression-like 727 // property reference. 728 if (receiverNamePtr->isStr("super")) { 729 IsSuper = true; 730 731 if (ObjCMethodDecl *CurMethod = tryCaptureObjCSelf()) { 732 if (CurMethod->isInstanceMethod()) { 733 QualType T = 734 Context.getObjCInterfaceType(CurMethod->getClassInterface()); 735 T = Context.getObjCObjectPointerType(T); 736 737 return HandleExprPropertyRefExpr(T->getAsObjCInterfacePointerType(), 738 /*BaseExpr*/0, 739 SourceLocation()/*OpLoc*/, 740 &propertyName, 741 propertyNameLoc, 742 receiverNameLoc, T, true); 743 } 744 745 // Otherwise, if this is a class method, try dispatching to our 746 // superclass. 747 IFace = CurMethod->getClassInterface()->getSuperClass(); 748 } 749 } 750 751 if (IFace == 0) { 752 Diag(receiverNameLoc, diag::err_expected_ident_or_lparen); 753 return ExprError(); 754 } 755 } 756 757 // Search for a declared property first. 758 Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName); 759 ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel); 760 761 // If this reference is in an @implementation, check for 'private' methods. 762 if (!Getter) 763 if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) 764 if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) 765 if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 766 Getter = ImpDecl->getClassMethod(Sel); 767 768 if (Getter) { 769 // FIXME: refactor/share with ActOnMemberReference(). 770 // Check if we can reference this property. 771 if (DiagnoseUseOfDecl(Getter, propertyNameLoc)) 772 return ExprError(); 773 } 774 775 // Look for the matching setter, in case it is needed. 776 Selector SetterSel = 777 SelectorTable::constructSetterName(PP.getIdentifierTable(), 778 PP.getSelectorTable(), &propertyName); 779 780 ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); 781 if (!Setter) { 782 // If this reference is in an @implementation, also check for 'private' 783 // methods. 784 if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) 785 if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) 786 if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 787 Setter = ImpDecl->getClassMethod(SetterSel); 788 } 789 // Look through local category implementations associated with the class. 790 if (!Setter) 791 Setter = IFace->getCategoryClassMethod(SetterSel); 792 793 if (Setter && DiagnoseUseOfDecl(Setter, propertyNameLoc)) 794 return ExprError(); 795 796 if (Getter || Setter) { 797 QualType PType; 798 799 ExprValueKind VK = VK_LValue; 800 if (Getter) { 801 PType = getMessageSendResultType(Context.getObjCInterfaceType(IFace), 802 Getter, true, 803 receiverNamePtr->isStr("super")); 804 if (!getLangOptions().CPlusPlus && 805 !PType.hasQualifiers() && PType->isVoidType()) 806 VK = VK_RValue; 807 } else { 808 for (ObjCMethodDecl::param_iterator PI = Setter->param_begin(), 809 E = Setter->param_end(); PI != E; ++PI) 810 PType = (*PI)->getType(); 811 VK = VK_LValue; 812 } 813 814 ExprObjectKind OK = (VK == VK_RValue ? OK_Ordinary : OK_ObjCProperty); 815 816 if (IsSuper) 817 return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter, 818 PType, VK, OK, 819 propertyNameLoc, 820 receiverNameLoc, 821 Context.getObjCInterfaceType(IFace))); 822 823 return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter, 824 PType, VK, OK, 825 propertyNameLoc, 826 receiverNameLoc, IFace)); 827 } 828 return ExprError(Diag(propertyNameLoc, diag::err_property_not_found) 829 << &propertyName << Context.getObjCInterfaceType(IFace)); 830} 831 832Sema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S, 833 IdentifierInfo *Name, 834 SourceLocation NameLoc, 835 bool IsSuper, 836 bool HasTrailingDot, 837 ParsedType &ReceiverType) { 838 ReceiverType = ParsedType(); 839 840 // If the identifier is "super" and there is no trailing dot, we're 841 // messaging super. If the identifier is "super" and there is a 842 // trailing dot, it's an instance message. 843 if (IsSuper && S->isInObjcMethodScope()) 844 return HasTrailingDot? ObjCInstanceMessage : ObjCSuperMessage; 845 846 LookupResult Result(*this, Name, NameLoc, LookupOrdinaryName); 847 LookupName(Result, S); 848 849 switch (Result.getResultKind()) { 850 case LookupResult::NotFound: 851 // Normal name lookup didn't find anything. If we're in an 852 // Objective-C method, look for ivars. If we find one, we're done! 853 // FIXME: This is a hack. Ivar lookup should be part of normal 854 // lookup. 855 if (ObjCMethodDecl *Method = getCurMethodDecl()) { 856 ObjCInterfaceDecl *ClassDeclared; 857 if (Method->getClassInterface()->lookupInstanceVariable(Name, 858 ClassDeclared)) 859 return ObjCInstanceMessage; 860 } 861 862 // Break out; we'll perform typo correction below. 863 break; 864 865 case LookupResult::NotFoundInCurrentInstantiation: 866 case LookupResult::FoundOverloaded: 867 case LookupResult::FoundUnresolvedValue: 868 case LookupResult::Ambiguous: 869 Result.suppressDiagnostics(); 870 return ObjCInstanceMessage; 871 872 case LookupResult::Found: { 873 // If the identifier is a class or not, and there is a trailing dot, 874 // it's an instance message. 875 if (HasTrailingDot) 876 return ObjCInstanceMessage; 877 // We found something. If it's a type, then we have a class 878 // message. Otherwise, it's an instance message. 879 NamedDecl *ND = Result.getFoundDecl(); 880 QualType T; 881 if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND)) 882 T = Context.getObjCInterfaceType(Class); 883 else if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 884 T = Context.getTypeDeclType(Type); 885 else 886 return ObjCInstanceMessage; 887 888 // We have a class message, and T is the type we're 889 // messaging. Build source-location information for it. 890 TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc); 891 ReceiverType = CreateParsedType(T, TSInfo); 892 return ObjCClassMessage; 893 } 894 } 895 896 // Determine our typo-correction context. 897 CorrectTypoContext CTC = CTC_Expression; 898 if (ObjCMethodDecl *Method = getCurMethodDecl()) 899 if (Method->getClassInterface() && 900 Method->getClassInterface()->getSuperClass()) 901 CTC = CTC_ObjCMessageReceiver; 902 903 if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(), 904 Result.getLookupKind(), S, NULL, 905 NULL, false, CTC)) { 906 if (NamedDecl *ND = Corrected.getCorrectionDecl()) { 907 // If we found a declaration, correct when it refers to an Objective-C 908 // class. 909 if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND)) { 910 Diag(NameLoc, diag::err_unknown_receiver_suggest) 911 << Name << Corrected.getCorrection() 912 << FixItHint::CreateReplacement(SourceRange(NameLoc), 913 ND->getNameAsString()); 914 Diag(ND->getLocation(), diag::note_previous_decl) 915 << Corrected.getCorrection(); 916 917 QualType T = Context.getObjCInterfaceType(Class); 918 TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc); 919 ReceiverType = CreateParsedType(T, TSInfo); 920 return ObjCClassMessage; 921 } 922 } else if (Corrected.isKeyword() && 923 Corrected.getCorrectionAsIdentifierInfo()->isStr("super")) { 924 // If we've found the keyword "super", this is a send to super. 925 Diag(NameLoc, diag::err_unknown_receiver_suggest) 926 << Name << Corrected.getCorrection() 927 << FixItHint::CreateReplacement(SourceRange(NameLoc), "super"); 928 return ObjCSuperMessage; 929 } 930 } 931 932 // Fall back: let the parser try to parse it as an instance message. 933 return ObjCInstanceMessage; 934} 935 936ExprResult Sema::ActOnSuperMessage(Scope *S, 937 SourceLocation SuperLoc, 938 Selector Sel, 939 SourceLocation LBracLoc, 940 SourceLocation SelectorLoc, 941 SourceLocation RBracLoc, 942 MultiExprArg Args) { 943 // Determine whether we are inside a method or not. 944 ObjCMethodDecl *Method = tryCaptureObjCSelf(); 945 if (!Method) { 946 Diag(SuperLoc, diag::err_invalid_receiver_to_message_super); 947 return ExprError(); 948 } 949 950 ObjCInterfaceDecl *Class = Method->getClassInterface(); 951 if (!Class) { 952 Diag(SuperLoc, diag::error_no_super_class_message) 953 << Method->getDeclName(); 954 return ExprError(); 955 } 956 957 ObjCInterfaceDecl *Super = Class->getSuperClass(); 958 if (!Super) { 959 // The current class does not have a superclass. 960 Diag(SuperLoc, diag::error_root_class_cannot_use_super) 961 << Class->getIdentifier(); 962 return ExprError(); 963 } 964 965 // We are in a method whose class has a superclass, so 'super' 966 // is acting as a keyword. 967 if (Method->isInstanceMethod()) { 968 // Since we are in an instance method, this is an instance 969 // message to the superclass instance. 970 QualType SuperTy = Context.getObjCInterfaceType(Super); 971 SuperTy = Context.getObjCObjectPointerType(SuperTy); 972 return BuildInstanceMessage(0, SuperTy, SuperLoc, 973 Sel, /*Method=*/0, 974 LBracLoc, SelectorLoc, RBracLoc, move(Args)); 975 } 976 977 // Since we are in a class method, this is a class message to 978 // the superclass. 979 return BuildClassMessage(/*ReceiverTypeInfo=*/0, 980 Context.getObjCInterfaceType(Super), 981 SuperLoc, Sel, /*Method=*/0, 982 LBracLoc, SelectorLoc, RBracLoc, move(Args)); 983} 984 985/// \brief Build an Objective-C class message expression. 986/// 987/// This routine takes care of both normal class messages and 988/// class messages to the superclass. 989/// 990/// \param ReceiverTypeInfo Type source information that describes the 991/// receiver of this message. This may be NULL, in which case we are 992/// sending to the superclass and \p SuperLoc must be a valid source 993/// location. 994 995/// \param ReceiverType The type of the object receiving the 996/// message. When \p ReceiverTypeInfo is non-NULL, this is the same 997/// type as that refers to. For a superclass send, this is the type of 998/// the superclass. 999/// 1000/// \param SuperLoc The location of the "super" keyword in a 1001/// superclass message. 1002/// 1003/// \param Sel The selector to which the message is being sent. 1004/// 1005/// \param Method The method that this class message is invoking, if 1006/// already known. 1007/// 1008/// \param LBracLoc The location of the opening square bracket ']'. 1009/// 1010/// \param RBrac The location of the closing square bracket ']'. 1011/// 1012/// \param Args The message arguments. 1013ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, 1014 QualType ReceiverType, 1015 SourceLocation SuperLoc, 1016 Selector Sel, 1017 ObjCMethodDecl *Method, 1018 SourceLocation LBracLoc, 1019 SourceLocation SelectorLoc, 1020 SourceLocation RBracLoc, 1021 MultiExprArg ArgsIn) { 1022 SourceLocation Loc = SuperLoc.isValid()? SuperLoc 1023 : ReceiverTypeInfo->getTypeLoc().getSourceRange().getBegin(); 1024 if (LBracLoc.isInvalid()) { 1025 Diag(Loc, diag::err_missing_open_square_message_send) 1026 << FixItHint::CreateInsertion(Loc, "["); 1027 LBracLoc = Loc; 1028 } 1029 1030 if (ReceiverType->isDependentType()) { 1031 // If the receiver type is dependent, we can't type-check anything 1032 // at this point. Build a dependent expression. 1033 unsigned NumArgs = ArgsIn.size(); 1034 Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 1035 assert(SuperLoc.isInvalid() && "Message to super with dependent type"); 1036 return Owned(ObjCMessageExpr::Create(Context, ReceiverType, 1037 VK_RValue, LBracLoc, ReceiverTypeInfo, 1038 Sel, SelectorLoc, /*Method=*/0, 1039 Args, NumArgs, RBracLoc)); 1040 } 1041 1042 // Find the class to which we are sending this message. 1043 ObjCInterfaceDecl *Class = 0; 1044 const ObjCObjectType *ClassType = ReceiverType->getAs<ObjCObjectType>(); 1045 if (!ClassType || !(Class = ClassType->getInterface())) { 1046 Diag(Loc, diag::err_invalid_receiver_class_message) 1047 << ReceiverType; 1048 return ExprError(); 1049 } 1050 assert(Class && "We don't know which class we're messaging?"); 1051 (void)DiagnoseUseOfDecl(Class, Loc); 1052 // Find the method we are messaging. 1053 if (!Method) { 1054 if (Class->isForwardDecl()) { 1055 if (getLangOptions().ObjCAutoRefCount) { 1056 Diag(Loc, diag::err_arc_receiver_forward_class) << ReceiverType; 1057 } else { 1058 Diag(Loc, diag::warn_receiver_forward_class) << Class->getDeclName(); 1059 } 1060 1061 // A forward class used in messaging is treated as a 'Class' 1062 Method = LookupFactoryMethodInGlobalPool(Sel, 1063 SourceRange(LBracLoc, RBracLoc)); 1064 if (Method && !getLangOptions().ObjCAutoRefCount) 1065 Diag(Method->getLocation(), diag::note_method_sent_forward_class) 1066 << Method->getDeclName(); 1067 } 1068 if (!Method) 1069 Method = Class->lookupClassMethod(Sel); 1070 1071 // If we have an implementation in scope, check "private" methods. 1072 if (!Method) 1073 Method = LookupPrivateClassMethod(Sel, Class); 1074 1075 if (Method && DiagnoseUseOfDecl(Method, Loc)) 1076 return ExprError(); 1077 } 1078 1079 // Check the argument types and determine the result type. 1080 QualType ReturnType; 1081 ExprValueKind VK = VK_RValue; 1082 1083 unsigned NumArgs = ArgsIn.size(); 1084 Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 1085 if (CheckMessageArgumentTypes(ReceiverType, Args, NumArgs, Sel, Method, true, 1086 SuperLoc.isValid(), LBracLoc, RBracLoc, 1087 ReturnType, VK)) 1088 return ExprError(); 1089 1090 if (Method && !Method->getResultType()->isVoidType() && 1091 RequireCompleteType(LBracLoc, Method->getResultType(), 1092 diag::err_illegal_message_expr_incomplete_type)) 1093 return ExprError(); 1094 1095 // Construct the appropriate ObjCMessageExpr. 1096 Expr *Result; 1097 if (SuperLoc.isValid()) 1098 Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc, 1099 SuperLoc, /*IsInstanceSuper=*/false, 1100 ReceiverType, Sel, SelectorLoc, 1101 Method, Args, NumArgs, RBracLoc); 1102 else 1103 Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc, 1104 ReceiverTypeInfo, Sel, SelectorLoc, 1105 Method, Args, NumArgs, RBracLoc); 1106 return MaybeBindToTemporary(Result); 1107} 1108 1109// ActOnClassMessage - used for both unary and keyword messages. 1110// ArgExprs is optional - if it is present, the number of expressions 1111// is obtained from Sel.getNumArgs(). 1112ExprResult Sema::ActOnClassMessage(Scope *S, 1113 ParsedType Receiver, 1114 Selector Sel, 1115 SourceLocation LBracLoc, 1116 SourceLocation SelectorLoc, 1117 SourceLocation RBracLoc, 1118 MultiExprArg Args) { 1119 TypeSourceInfo *ReceiverTypeInfo; 1120 QualType ReceiverType = GetTypeFromParser(Receiver, &ReceiverTypeInfo); 1121 if (ReceiverType.isNull()) 1122 return ExprError(); 1123 1124 1125 if (!ReceiverTypeInfo) 1126 ReceiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType, LBracLoc); 1127 1128 return BuildClassMessage(ReceiverTypeInfo, ReceiverType, 1129 /*SuperLoc=*/SourceLocation(), Sel, /*Method=*/0, 1130 LBracLoc, SelectorLoc, RBracLoc, move(Args)); 1131} 1132 1133/// \brief Build an Objective-C instance message expression. 1134/// 1135/// This routine takes care of both normal instance messages and 1136/// instance messages to the superclass instance. 1137/// 1138/// \param Receiver The expression that computes the object that will 1139/// receive this message. This may be empty, in which case we are 1140/// sending to the superclass instance and \p SuperLoc must be a valid 1141/// source location. 1142/// 1143/// \param ReceiverType The (static) type of the object receiving the 1144/// message. When a \p Receiver expression is provided, this is the 1145/// same type as that expression. For a superclass instance send, this 1146/// is a pointer to the type of the superclass. 1147/// 1148/// \param SuperLoc The location of the "super" keyword in a 1149/// superclass instance message. 1150/// 1151/// \param Sel The selector to which the message is being sent. 1152/// 1153/// \param Method The method that this instance message is invoking, if 1154/// already known. 1155/// 1156/// \param LBracLoc The location of the opening square bracket ']'. 1157/// 1158/// \param RBrac The location of the closing square bracket ']'. 1159/// 1160/// \param Args The message arguments. 1161ExprResult Sema::BuildInstanceMessage(Expr *Receiver, 1162 QualType ReceiverType, 1163 SourceLocation SuperLoc, 1164 Selector Sel, 1165 ObjCMethodDecl *Method, 1166 SourceLocation LBracLoc, 1167 SourceLocation SelectorLoc, 1168 SourceLocation RBracLoc, 1169 MultiExprArg ArgsIn) { 1170 // The location of the receiver. 1171 SourceLocation Loc = SuperLoc.isValid()? SuperLoc : Receiver->getLocStart(); 1172 1173 if (LBracLoc.isInvalid()) { 1174 Diag(Loc, diag::err_missing_open_square_message_send) 1175 << FixItHint::CreateInsertion(Loc, "["); 1176 LBracLoc = Loc; 1177 } 1178 1179 // If we have a receiver expression, perform appropriate promotions 1180 // and determine receiver type. 1181 if (Receiver) { 1182 if (Receiver->isTypeDependent()) { 1183 // If the receiver is type-dependent, we can't type-check anything 1184 // at this point. Build a dependent expression. 1185 unsigned NumArgs = ArgsIn.size(); 1186 Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 1187 assert(SuperLoc.isInvalid() && "Message to super with dependent type"); 1188 return Owned(ObjCMessageExpr::Create(Context, Context.DependentTy, 1189 VK_RValue, LBracLoc, Receiver, Sel, 1190 SelectorLoc, /*Method=*/0, 1191 Args, NumArgs, RBracLoc)); 1192 } 1193 1194 // If necessary, apply function/array conversion to the receiver. 1195 // C99 6.7.5.3p[7,8]. 1196 ExprResult Result = DefaultFunctionArrayLvalueConversion(Receiver); 1197 if (Result.isInvalid()) 1198 return ExprError(); 1199 Receiver = Result.take(); 1200 ReceiverType = Receiver->getType(); 1201 } 1202 1203 if (!Method) { 1204 // Handle messages to id. 1205 bool receiverIsId = ReceiverType->isObjCIdType(); 1206 if (receiverIsId || ReceiverType->isBlockPointerType() || 1207 (Receiver && Context.isObjCNSObjectType(Receiver->getType()))) { 1208 Method = LookupInstanceMethodInGlobalPool(Sel, 1209 SourceRange(LBracLoc, RBracLoc), 1210 receiverIsId); 1211 if (!Method) 1212 Method = LookupFactoryMethodInGlobalPool(Sel, 1213 SourceRange(LBracLoc, RBracLoc), 1214 receiverIsId); 1215 } else if (ReceiverType->isObjCClassType() || 1216 ReceiverType->isObjCQualifiedClassType()) { 1217 // Handle messages to Class. 1218 // We allow sending a message to a qualified Class ("Class<foo>"), which 1219 // is ok as long as one of the protocols implements the selector (if not, warn). 1220 if (const ObjCObjectPointerType *QClassTy 1221 = ReceiverType->getAsObjCQualifiedClassType()) { 1222 // Search protocols for class methods. 1223 Method = LookupMethodInQualifiedType(Sel, QClassTy, false); 1224 if (!Method) { 1225 Method = LookupMethodInQualifiedType(Sel, QClassTy, true); 1226 // warn if instance method found for a Class message. 1227 if (Method) { 1228 Diag(Loc, diag::warn_instance_method_on_class_found) 1229 << Method->getSelector() << Sel; 1230 Diag(Method->getLocation(), diag::note_method_declared_at); 1231 } 1232 } 1233 } else { 1234 if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) { 1235 if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) { 1236 // First check the public methods in the class interface. 1237 Method = ClassDecl->lookupClassMethod(Sel); 1238 1239 if (!Method) 1240 Method = LookupPrivateClassMethod(Sel, ClassDecl); 1241 } 1242 if (Method && DiagnoseUseOfDecl(Method, Loc)) 1243 return ExprError(); 1244 } 1245 if (!Method) { 1246 // If not messaging 'self', look for any factory method named 'Sel'. 1247 if (!Receiver || !isSelfExpr(Receiver)) { 1248 Method = LookupFactoryMethodInGlobalPool(Sel, 1249 SourceRange(LBracLoc, RBracLoc), 1250 true); 1251 if (!Method) { 1252 // If no class (factory) method was found, check if an _instance_ 1253 // method of the same name exists in the root class only. 1254 Method = LookupInstanceMethodInGlobalPool(Sel, 1255 SourceRange(LBracLoc, RBracLoc), 1256 true); 1257 if (Method) 1258 if (const ObjCInterfaceDecl *ID = 1259 dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) { 1260 if (ID->getSuperClass()) 1261 Diag(Loc, diag::warn_root_inst_method_not_found) 1262 << Sel << SourceRange(LBracLoc, RBracLoc); 1263 } 1264 } 1265 } 1266 } 1267 } 1268 } else { 1269 ObjCInterfaceDecl* ClassDecl = 0; 1270 1271 // We allow sending a message to a qualified ID ("id<foo>"), which is ok as 1272 // long as one of the protocols implements the selector (if not, warn). 1273 if (const ObjCObjectPointerType *QIdTy 1274 = ReceiverType->getAsObjCQualifiedIdType()) { 1275 // Search protocols for instance methods. 1276 Method = LookupMethodInQualifiedType(Sel, QIdTy, true); 1277 if (!Method) 1278 Method = LookupMethodInQualifiedType(Sel, QIdTy, false); 1279 } else if (const ObjCObjectPointerType *OCIType 1280 = ReceiverType->getAsObjCInterfacePointerType()) { 1281 // We allow sending a message to a pointer to an interface (an object). 1282 ClassDecl = OCIType->getInterfaceDecl(); 1283 1284 if (ClassDecl->isForwardDecl() && getLangOptions().ObjCAutoRefCount) { 1285 Diag(Loc, diag::err_arc_receiver_forward_instance) 1286 << OCIType->getPointeeType() 1287 << (Receiver ? Receiver->getSourceRange() : SourceRange(SuperLoc)); 1288 return ExprError(); 1289 } 1290 1291 // FIXME: consider using LookupInstanceMethodInGlobalPool, since it will be 1292 // faster than the following method (which can do *many* linear searches). 1293 // The idea is to add class info to MethodPool. 1294 Method = ClassDecl->lookupInstanceMethod(Sel); 1295 1296 if (!Method) 1297 // Search protocol qualifiers. 1298 Method = LookupMethodInQualifiedType(Sel, OCIType, true); 1299 1300 const ObjCInterfaceDecl *forwardClass = 0; 1301 if (!Method) { 1302 // If we have implementations in scope, check "private" methods. 1303 Method = LookupPrivateInstanceMethod(Sel, ClassDecl); 1304 1305 if (!Method && getLangOptions().ObjCAutoRefCount) { 1306 Diag(Loc, diag::err_arc_may_not_respond) 1307 << OCIType->getPointeeType() << Sel; 1308 return ExprError(); 1309 } 1310 1311 if (!Method && (!Receiver || !isSelfExpr(Receiver))) { 1312 // If we still haven't found a method, look in the global pool. This 1313 // behavior isn't very desirable, however we need it for GCC 1314 // compatibility. FIXME: should we deviate?? 1315 if (OCIType->qual_empty()) { 1316 Method = LookupInstanceMethodInGlobalPool(Sel, 1317 SourceRange(LBracLoc, RBracLoc)); 1318 if (OCIType->getInterfaceDecl()->isForwardDecl()) 1319 forwardClass = OCIType->getInterfaceDecl(); 1320 if (Method && !forwardClass) 1321 Diag(Loc, diag::warn_maynot_respond) 1322 << OCIType->getInterfaceDecl()->getIdentifier() << Sel; 1323 } 1324 } 1325 } 1326 if (Method && DiagnoseUseOfDecl(Method, Loc, forwardClass)) 1327 return ExprError(); 1328 } else if (!getLangOptions().ObjCAutoRefCount && 1329 !Context.getObjCIdType().isNull() && 1330 (ReceiverType->isPointerType() || 1331 ReceiverType->isIntegerType())) { 1332 // Implicitly convert integers and pointers to 'id' but emit a warning. 1333 // But not in ARC. 1334 Diag(Loc, diag::warn_bad_receiver_type) 1335 << ReceiverType 1336 << Receiver->getSourceRange(); 1337 if (ReceiverType->isPointerType()) 1338 Receiver = ImpCastExprToType(Receiver, Context.getObjCIdType(), 1339 CK_BitCast).take(); 1340 else { 1341 // TODO: specialized warning on null receivers? 1342 bool IsNull = Receiver->isNullPointerConstant(Context, 1343 Expr::NPC_ValueDependentIsNull); 1344 Receiver = ImpCastExprToType(Receiver, Context.getObjCIdType(), 1345 IsNull ? CK_NullToPointer : CK_IntegralToPointer).take(); 1346 } 1347 ReceiverType = Receiver->getType(); 1348 } 1349 else { 1350 ExprResult ReceiverRes; 1351 if (getLangOptions().CPlusPlus) 1352 ReceiverRes = PerformContextuallyConvertToObjCId(Receiver); 1353 if (ReceiverRes.isUsable()) { 1354 Receiver = ReceiverRes.take(); 1355 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Receiver)) { 1356 Receiver = ICE->getSubExpr(); 1357 ReceiverType = Receiver->getType(); 1358 } 1359 return BuildInstanceMessage(Receiver, 1360 ReceiverType, 1361 SuperLoc, 1362 Sel, 1363 Method, 1364 LBracLoc, 1365 SelectorLoc, 1366 RBracLoc, 1367 move(ArgsIn)); 1368 } else { 1369 // Reject other random receiver types (e.g. structs). 1370 Diag(Loc, diag::err_bad_receiver_type) 1371 << ReceiverType << Receiver->getSourceRange(); 1372 return ExprError(); 1373 } 1374 } 1375 } 1376 } 1377 1378 // Check the message arguments. 1379 unsigned NumArgs = ArgsIn.size(); 1380 Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 1381 QualType ReturnType; 1382 ExprValueKind VK = VK_RValue; 1383 bool ClassMessage = (ReceiverType->isObjCClassType() || 1384 ReceiverType->isObjCQualifiedClassType()); 1385 if (CheckMessageArgumentTypes(ReceiverType, Args, NumArgs, Sel, Method, 1386 ClassMessage, SuperLoc.isValid(), 1387 LBracLoc, RBracLoc, ReturnType, VK)) 1388 return ExprError(); 1389 1390 if (Method && !Method->getResultType()->isVoidType() && 1391 RequireCompleteType(LBracLoc, Method->getResultType(), 1392 diag::err_illegal_message_expr_incomplete_type)) 1393 return ExprError(); 1394 1395 // In ARC, forbid the user from sending messages to 1396 // retain/release/autorelease/dealloc/retainCount explicitly. 1397 if (getLangOptions().ObjCAutoRefCount) { 1398 ObjCMethodFamily family = 1399 (Method ? Method->getMethodFamily() : Sel.getMethodFamily()); 1400 switch (family) { 1401 case OMF_init: 1402 if (Method) 1403 checkInitMethod(Method, ReceiverType); 1404 1405 case OMF_None: 1406 case OMF_alloc: 1407 case OMF_copy: 1408 case OMF_mutableCopy: 1409 case OMF_new: 1410 case OMF_self: 1411 break; 1412 1413 case OMF_dealloc: 1414 case OMF_retain: 1415 case OMF_release: 1416 case OMF_autorelease: 1417 case OMF_retainCount: 1418 Diag(Loc, diag::err_arc_illegal_explicit_message) 1419 << Sel << SelectorLoc; 1420 break; 1421 1422 case OMF_performSelector: 1423 if (Method && NumArgs >= 1) { 1424 if (ObjCSelectorExpr *SelExp = dyn_cast<ObjCSelectorExpr>(Args[0])) { 1425 Selector ArgSel = SelExp->getSelector(); 1426 ObjCMethodDecl *SelMethod = 1427 LookupInstanceMethodInGlobalPool(ArgSel, 1428 SelExp->getSourceRange()); 1429 if (!SelMethod) 1430 SelMethod = 1431 LookupFactoryMethodInGlobalPool(ArgSel, 1432 SelExp->getSourceRange()); 1433 if (SelMethod) { 1434 ObjCMethodFamily SelFamily = SelMethod->getMethodFamily(); 1435 switch (SelFamily) { 1436 case OMF_alloc: 1437 case OMF_copy: 1438 case OMF_mutableCopy: 1439 case OMF_new: 1440 case OMF_self: 1441 case OMF_init: 1442 // Issue error, unless ns_returns_not_retained. 1443 if (!SelMethod->hasAttr<NSReturnsNotRetainedAttr>()) { 1444 // selector names a +1 method 1445 Diag(SelectorLoc, 1446 diag::err_arc_perform_selector_retains); 1447 Diag(SelMethod->getLocation(), diag::note_method_declared_at); 1448 } 1449 break; 1450 default: 1451 // +0 call. OK. unless ns_returns_retained. 1452 if (SelMethod->hasAttr<NSReturnsRetainedAttr>()) { 1453 // selector names a +1 method 1454 Diag(SelectorLoc, 1455 diag::err_arc_perform_selector_retains); 1456 Diag(SelMethod->getLocation(), diag::note_method_declared_at); 1457 } 1458 break; 1459 } 1460 } 1461 } else { 1462 // error (may leak). 1463 Diag(SelectorLoc, diag::warn_arc_perform_selector_leaks); 1464 Diag(Args[0]->getExprLoc(), diag::note_used_here); 1465 } 1466 } 1467 break; 1468 } 1469 } 1470 1471 // Construct the appropriate ObjCMessageExpr instance. 1472 ObjCMessageExpr *Result; 1473 if (SuperLoc.isValid()) 1474 Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc, 1475 SuperLoc, /*IsInstanceSuper=*/true, 1476 ReceiverType, Sel, SelectorLoc, Method, 1477 Args, NumArgs, RBracLoc); 1478 else 1479 Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc, 1480 Receiver, Sel, SelectorLoc, Method, 1481 Args, NumArgs, RBracLoc); 1482 1483 if (getLangOptions().ObjCAutoRefCount) { 1484 // In ARC, annotate delegate init calls. 1485 if (Result->getMethodFamily() == OMF_init && 1486 (SuperLoc.isValid() || isSelfExpr(Receiver))) { 1487 // Only consider init calls *directly* in init implementations, 1488 // not within blocks. 1489 ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(CurContext); 1490 if (method && method->getMethodFamily() == OMF_init) { 1491 // The implicit assignment to self means we also don't want to 1492 // consume the result. 1493 Result->setDelegateInitCall(true); 1494 return Owned(Result); 1495 } 1496 } 1497 1498 // In ARC, check for message sends which are likely to introduce 1499 // retain cycles. 1500 checkRetainCycles(Result); 1501 } 1502 1503 return MaybeBindToTemporary(Result); 1504} 1505 1506// ActOnInstanceMessage - used for both unary and keyword messages. 1507// ArgExprs is optional - if it is present, the number of expressions 1508// is obtained from Sel.getNumArgs(). 1509ExprResult Sema::ActOnInstanceMessage(Scope *S, 1510 Expr *Receiver, 1511 Selector Sel, 1512 SourceLocation LBracLoc, 1513 SourceLocation SelectorLoc, 1514 SourceLocation RBracLoc, 1515 MultiExprArg Args) { 1516 if (!Receiver) 1517 return ExprError(); 1518 1519 return BuildInstanceMessage(Receiver, Receiver->getType(), 1520 /*SuperLoc=*/SourceLocation(), Sel, /*Method=*/0, 1521 LBracLoc, SelectorLoc, RBracLoc, move(Args)); 1522} 1523 1524enum ARCConversionTypeClass { 1525 ACTC_none, 1526 ACTC_retainable, 1527 ACTC_indirectRetainable 1528}; 1529static ARCConversionTypeClass classifyTypeForARCConversion(QualType type) { 1530 ARCConversionTypeClass ACTC = ACTC_retainable; 1531 1532 // Ignore an outermost reference type. 1533 if (const ReferenceType *ref = type->getAs<ReferenceType>()) 1534 type = ref->getPointeeType(); 1535 1536 // Drill through pointers and arrays recursively. 1537 while (true) { 1538 if (const PointerType *ptr = type->getAs<PointerType>()) { 1539 type = ptr->getPointeeType(); 1540 } else if (const ArrayType *array = type->getAsArrayTypeUnsafe()) { 1541 type = QualType(array->getElementType()->getBaseElementTypeUnsafe(), 0); 1542 } else { 1543 break; 1544 } 1545 ACTC = ACTC_indirectRetainable; 1546 } 1547 1548 if (!type->isObjCRetainableType()) return ACTC_none; 1549 return ACTC; 1550} 1551 1552namespace { 1553 /// Return true if the given expression can be reasonably converted 1554 /// between a retainable pointer type and a C pointer type. 1555 struct ARCCastChecker : StmtVisitor<ARCCastChecker, bool> { 1556 ASTContext &Context; 1557 ARCCastChecker(ASTContext &Context) : Context(Context) {} 1558 bool VisitStmt(Stmt *s) { 1559 return false; 1560 } 1561 bool VisitExpr(Expr *e) { 1562 return e->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull); 1563 } 1564 1565 bool VisitParenExpr(ParenExpr *e) { 1566 return Visit(e->getSubExpr()); 1567 } 1568 bool VisitCastExpr(CastExpr *e) { 1569 switch (e->getCastKind()) { 1570 case CK_NullToPointer: 1571 return true; 1572 case CK_NoOp: 1573 case CK_LValueToRValue: 1574 case CK_BitCast: 1575 case CK_AnyPointerToObjCPointerCast: 1576 case CK_AnyPointerToBlockPointerCast: 1577 return Visit(e->getSubExpr()); 1578 default: 1579 return false; 1580 } 1581 } 1582 bool VisitUnaryExtension(UnaryOperator *e) { 1583 return Visit(e->getSubExpr()); 1584 } 1585 bool VisitBinComma(BinaryOperator *e) { 1586 return Visit(e->getRHS()); 1587 } 1588 bool VisitConditionalOperator(ConditionalOperator *e) { 1589 // Conditional operators are okay if both sides are okay. 1590 return Visit(e->getTrueExpr()) && Visit(e->getFalseExpr()); 1591 } 1592 bool VisitObjCStringLiteral(ObjCStringLiteral *e) { 1593 // Always white-list Objective-C string literals. 1594 return true; 1595 } 1596 bool VisitStmtExpr(StmtExpr *e) { 1597 return Visit(e->getSubStmt()->body_back()); 1598 } 1599 bool VisitDeclRefExpr(DeclRefExpr *e) { 1600 // White-list references to global extern strings from system 1601 // headers. 1602 if (VarDecl *var = dyn_cast<VarDecl>(e->getDecl())) 1603 if (var->getStorageClass() == SC_Extern && 1604 var->getType().isConstQualified() && 1605 Context.getSourceManager().isInSystemHeader(var->getLocation())) 1606 return true; 1607 return false; 1608 } 1609 }; 1610} 1611 1612bool 1613Sema::ValidObjCARCNoBridgeCastExpr(Expr *&Exp, QualType castType) { 1614 Expr *NewExp = Exp->IgnoreParenCasts(); 1615 1616 if (!isa<ObjCMessageExpr>(NewExp) && !isa<ObjCPropertyRefExpr>(NewExp) 1617 && !isa<CallExpr>(NewExp)) 1618 return false; 1619 ObjCMethodDecl *method = 0; 1620 bool MethodReturnsPlusOne = false; 1621 1622 if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(NewExp)) { 1623 method = PRE->getExplicitProperty()->getGetterMethodDecl(); 1624 } 1625 else if (ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(NewExp)) 1626 method = ME->getMethodDecl(); 1627 else { 1628 CallExpr *CE = cast<CallExpr>(NewExp); 1629 Decl *CallDecl = CE->getCalleeDecl(); 1630 if (!CallDecl) 1631 return false; 1632 if (CallDecl->hasAttr<CFReturnsNotRetainedAttr>()) 1633 return true; 1634 MethodReturnsPlusOne = CallDecl->hasAttr<CFReturnsRetainedAttr>(); 1635 if (!MethodReturnsPlusOne) { 1636 if (NamedDecl *ND = dyn_cast<NamedDecl>(CallDecl)) 1637 if (const IdentifierInfo *Id = ND->getIdentifier()) 1638 if (Id->isStr("__builtin___CFStringMakeConstantString")) 1639 return true; 1640 } 1641 } 1642 1643 if (!MethodReturnsPlusOne) { 1644 if (!method) 1645 return false; 1646 if (method->hasAttr<CFReturnsNotRetainedAttr>()) 1647 return true; 1648 MethodReturnsPlusOne = method->hasAttr<CFReturnsRetainedAttr>(); 1649 if (!MethodReturnsPlusOne) { 1650 ObjCMethodFamily family = method->getSelector().getMethodFamily(); 1651 switch (family) { 1652 case OMF_alloc: 1653 case OMF_copy: 1654 case OMF_mutableCopy: 1655 case OMF_new: 1656 MethodReturnsPlusOne = true; 1657 break; 1658 default: 1659 break; 1660 } 1661 } 1662 } 1663 1664 if (MethodReturnsPlusOne) { 1665 TypeSourceInfo *TSInfo = 1666 Context.getTrivialTypeSourceInfo(castType, SourceLocation()); 1667 ExprResult ExpRes = BuildObjCBridgedCast(SourceLocation(), OBC_BridgeTransfer, 1668 SourceLocation(), TSInfo, Exp); 1669 Exp = ExpRes.take(); 1670 } 1671 return true; 1672} 1673 1674void 1675Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType, 1676 Expr *&castExpr, CheckedConversionKind CCK) { 1677 QualType castExprType = castExpr->getType(); 1678 1679 ARCConversionTypeClass exprACTC = classifyTypeForARCConversion(castExprType); 1680 ARCConversionTypeClass castACTC = classifyTypeForARCConversion(castType); 1681 if (exprACTC == castACTC) return; 1682 if (exprACTC && castType->isIntegralType(Context)) return; 1683 1684 // Allow casts between pointers to lifetime types (e.g., __strong id*) 1685 // and pointers to void (e.g., cv void *). Casting from void* to lifetime* 1686 // must be explicit. 1687 if (const PointerType *CastPtr = castType->getAs<PointerType>()) { 1688 if (const PointerType *CastExprPtr = castExprType->getAs<PointerType>()) { 1689 QualType CastPointee = CastPtr->getPointeeType(); 1690 QualType CastExprPointee = CastExprPtr->getPointeeType(); 1691 if ((CCK != CCK_ImplicitConversion && 1692 CastPointee->isObjCIndirectLifetimeType() && 1693 CastExprPointee->isVoidType()) || 1694 (CastPointee->isVoidType() && 1695 CastExprPointee->isObjCIndirectLifetimeType())) 1696 return; 1697 } 1698 } 1699 1700 if (ARCCastChecker(Context).Visit(castExpr)) 1701 return; 1702 1703 SourceLocation loc = 1704 (castRange.isValid() ? castRange.getBegin() : castExpr->getExprLoc()); 1705 1706 if (makeUnavailableInSystemHeader(loc, 1707 "converts between Objective-C and C pointers in -fobjc-arc")) 1708 return; 1709 1710 unsigned srcKind = 0; 1711 switch (exprACTC) { 1712 case ACTC_none: 1713 srcKind = (castExprType->isPointerType() ? 1 : 0); 1714 break; 1715 case ACTC_retainable: 1716 srcKind = (castExprType->isBlockPointerType() ? 2 : 3); 1717 break; 1718 case ACTC_indirectRetainable: 1719 srcKind = 4; 1720 break; 1721 } 1722 1723 if (CCK == CCK_CStyleCast) { 1724 // Check whether this could be fixed with a bridge cast. 1725 SourceLocation AfterLParen = PP.getLocForEndOfToken(castRange.getBegin()); 1726 SourceLocation NoteLoc = AfterLParen.isValid()? AfterLParen : loc; 1727 1728 if (castType->isObjCARCBridgableType() && 1729 castExprType->isCARCBridgableType()) { 1730 // explicit unbridged casts are allowed if the source of the cast is a 1731 // message sent to an objc method (or property access) 1732 if (ValidObjCARCNoBridgeCastExpr(castExpr, castType)) 1733 return; 1734 Diag(loc, diag::err_arc_cast_requires_bridge) 1735 << 2 1736 << castExprType 1737 << (castType->isBlockPointerType()? 1 : 0) 1738 << castType 1739 << castRange 1740 << castExpr->getSourceRange(); 1741 Diag(NoteLoc, diag::note_arc_bridge) 1742 << FixItHint::CreateInsertion(AfterLParen, "__bridge "); 1743 Diag(NoteLoc, diag::note_arc_bridge_transfer) 1744 << castExprType 1745 << FixItHint::CreateInsertion(AfterLParen, "__bridge_transfer "); 1746 1747 return; 1748 } 1749 1750 if (castType->isCARCBridgableType() && 1751 castExprType->isObjCARCBridgableType()){ 1752 Diag(loc, diag::err_arc_cast_requires_bridge) 1753 << (castExprType->isBlockPointerType()? 1 : 0) 1754 << castExprType 1755 << 2 1756 << castType 1757 << castRange 1758 << castExpr->getSourceRange(); 1759 1760 Diag(NoteLoc, diag::note_arc_bridge) 1761 << FixItHint::CreateInsertion(AfterLParen, "__bridge "); 1762 Diag(NoteLoc, diag::note_arc_bridge_retained) 1763 << castType 1764 << FixItHint::CreateInsertion(AfterLParen, "__bridge_retained "); 1765 return; 1766 } 1767 } 1768 1769 Diag(loc, diag::err_arc_mismatched_cast) 1770 << (CCK != CCK_ImplicitConversion) << srcKind << castExprType << castType 1771 << castRange << castExpr->getSourceRange(); 1772} 1773 1774ExprResult Sema::BuildObjCBridgedCast(SourceLocation LParenLoc, 1775 ObjCBridgeCastKind Kind, 1776 SourceLocation BridgeKeywordLoc, 1777 TypeSourceInfo *TSInfo, 1778 Expr *SubExpr) { 1779 QualType T = TSInfo->getType(); 1780 QualType FromType = SubExpr->getType(); 1781 1782 bool MustConsume = false; 1783 if (T->isDependentType() || SubExpr->isTypeDependent()) { 1784 // Okay: we'll build a dependent expression type. 1785 } else if (T->isObjCARCBridgableType() && FromType->isCARCBridgableType()) { 1786 // Casting CF -> id 1787 switch (Kind) { 1788 case OBC_Bridge: 1789 break; 1790 1791 case OBC_BridgeRetained: 1792 Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind) 1793 << 2 1794 << FromType 1795 << (T->isBlockPointerType()? 1 : 0) 1796 << T 1797 << SubExpr->getSourceRange() 1798 << Kind; 1799 Diag(BridgeKeywordLoc, diag::note_arc_bridge) 1800 << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge"); 1801 Diag(BridgeKeywordLoc, diag::note_arc_bridge_transfer) 1802 << FromType 1803 << FixItHint::CreateReplacement(BridgeKeywordLoc, 1804 "__bridge_transfer "); 1805 1806 Kind = OBC_Bridge; 1807 break; 1808 1809 case OBC_BridgeTransfer: 1810 // We must consume the Objective-C object produced by the cast. 1811 MustConsume = true; 1812 break; 1813 } 1814 } else if (T->isCARCBridgableType() && FromType->isObjCARCBridgableType()) { 1815 // Okay: id -> CF 1816 switch (Kind) { 1817 case OBC_Bridge: 1818 break; 1819 1820 case OBC_BridgeRetained: 1821 // Produce the object before casting it. 1822 SubExpr = ImplicitCastExpr::Create(Context, FromType, 1823 CK_ObjCProduceObject, 1824 SubExpr, 0, VK_RValue); 1825 break; 1826 1827 case OBC_BridgeTransfer: 1828 Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind) 1829 << (FromType->isBlockPointerType()? 1 : 0) 1830 << FromType 1831 << 2 1832 << T 1833 << SubExpr->getSourceRange() 1834 << Kind; 1835 1836 Diag(BridgeKeywordLoc, diag::note_arc_bridge) 1837 << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge "); 1838 Diag(BridgeKeywordLoc, diag::note_arc_bridge_retained) 1839 << T 1840 << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge_retained "); 1841 1842 Kind = OBC_Bridge; 1843 break; 1844 } 1845 } else { 1846 Diag(LParenLoc, diag::err_arc_bridge_cast_incompatible) 1847 << FromType << T << Kind 1848 << SubExpr->getSourceRange() 1849 << TSInfo->getTypeLoc().getSourceRange(); 1850 return ExprError(); 1851 } 1852 1853 Expr *Result = new (Context) ObjCBridgedCastExpr(LParenLoc, Kind, 1854 BridgeKeywordLoc, 1855 TSInfo, SubExpr); 1856 1857 if (MustConsume) { 1858 ExprNeedsCleanups = true; 1859 Result = ImplicitCastExpr::Create(Context, T, CK_ObjCConsumeObject, Result, 1860 0, VK_RValue); 1861 } 1862 1863 return Result; 1864} 1865 1866ExprResult Sema::ActOnObjCBridgedCast(Scope *S, 1867 SourceLocation LParenLoc, 1868 ObjCBridgeCastKind Kind, 1869 SourceLocation BridgeKeywordLoc, 1870 ParsedType Type, 1871 SourceLocation RParenLoc, 1872 Expr *SubExpr) { 1873 TypeSourceInfo *TSInfo = 0; 1874 QualType T = GetTypeFromParser(Type, &TSInfo); 1875 if (!TSInfo) 1876 TSInfo = Context.getTrivialTypeSourceInfo(T, LParenLoc); 1877 return BuildObjCBridgedCast(LParenLoc, Kind, BridgeKeywordLoc, TSInfo, 1878 SubExpr); 1879} 1880