SemaExprObjC.cpp revision 77328d1bb92c2c46bc3e4badc4b4b97c517903b7
185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner//===--- SemaExprObjC.cpp - Semantic Analysis for ObjC Expressions --------===// 285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// 385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// The LLVM Compiler Infrastructure 485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// 585a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// This file is distributed under the University of Illinois Open Source 685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// License. See LICENSE.TXT for details. 785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// 885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner//===----------------------------------------------------------------------===// 985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// 1085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// This file implements semantic analysis for Objective-C expressions. 1185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// 1285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner//===----------------------------------------------------------------------===// 1385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 142d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h" 15e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h" 165f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/Scope.h" 17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Initialization.h" 1885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner#include "clang/AST/ASTContext.h" 1985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner#include "clang/AST/DeclObjC.h" 20f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroff#include "clang/AST/ExprObjC.h" 212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor#include "clang/AST/TypeLoc.h" 2239c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner#include "llvm/ADT/SmallString.h" 2361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff#include "clang/Lex/Preprocessor.h" 2461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 2585a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattnerusing namespace clang; 2685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 27f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs, 28f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Expr **strings, 29f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall unsigned NumStrings) { 3039c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner StringLiteral **Strings = reinterpret_cast<StringLiteral**>(strings); 3139c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner 32f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // Most ObjC strings are formed out of a single piece. However, we *can* 33f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // have strings formed out of multiple @ strings with multiple pptokens in 34f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // each one, e.g. @"foo" "bar" @"baz" "qux" which need to be turned into one 35f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // StringLiteral for ObjCStringLiteral to hold onto. 3639c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner StringLiteral *S = Strings[0]; 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // If we have a multi-part string, merge it all together. 39f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner if (NumStrings != 1) { 4085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner // Concatenate objc strings. 4139c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner llvm::SmallString<128> StrBuf; 4239c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner llvm::SmallVector<SourceLocation, 8> StrLocs; 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner for (unsigned i = 0; i != NumStrings; ++i) { 4539c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner S = Strings[i]; 461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4739c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // ObjC strings can't be wide. 48f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner if (S->isWide()) { 49f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner Diag(S->getLocStart(), diag::err_cfstring_literal_not_string_constant) 50f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner << S->getSourceRange(); 51f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner return true; 52f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner } 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 542f4eaef37476ae6891ede8ba215d0f6fd093629bBenjamin Kramer // Append the string. 552f4eaef37476ae6891ede8ba215d0f6fd093629bBenjamin Kramer StrBuf += S->getString(); 561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5739c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // Get the locations of the string tokens. 5839c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner StrLocs.append(S->tokloc_begin(), S->tokloc_end()); 5985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner } 601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6139c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // Create the aggregate string with the appropriate content and location 6239c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // information. 6339c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner S = StringLiteral::Create(Context, &StrBuf[0], StrBuf.size(), false, 642085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner Context.getPointerType(Context.CharTy), 6539c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner &StrLocs[0], StrLocs.size()); 6685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner } 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner // Verify that this composite string is acceptable for ObjC strings. 69690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner if (CheckObjCString(S)) 7085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner return true; 71a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner 72a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner // Initialize the constant string interface lazily. This assumes 73d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff // the NSString interface is seen in this translation unit. Note: We 74d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff // don't use NSConstantString, since the runtime team considers this 75d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff // interface private (even though it appears in the header files). 76a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner QualType Ty = Context.getObjCConstantStringInterface(); 77a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner if (!Ty.isNull()) { 7814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff Ty = Context.getObjCObjectPointerType(Ty); 798a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian } else if (getLangOptions().NoConstantCFStrings) { 808a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian IdentifierInfo *NSIdent = &Context.Idents.get("NSConstantString"); 818a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLocs[0], 828a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian LookupOrdinaryName); 838a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) { 848a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian Context.setObjCConstantStringInterface(StrIF); 858a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian Ty = Context.getObjCConstantStringInterface(); 868a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian Ty = Context.getObjCObjectPointerType(Ty); 878a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian } else { 888a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian // If there is no NSConstantString interface defined then treat this 898a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian // as error and recover from it. 908a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian Diag(S->getLocStart(), diag::err_no_nsconstant_string_class) << NSIdent 918a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian << S->getSourceRange(); 928a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian Ty = Context.getObjCIdType(); 938a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian } 9413fd7e5111032f54b538dd66d035b0ccc1f82467Chris Lattner } else { 95d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff IdentifierInfo *NSIdent = &Context.Idents.get("NSString"); 96c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLocs[0], 97c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor LookupOrdinaryName); 98a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) { 99a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner Context.setObjCConstantStringInterface(StrIF); 100a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner Ty = Context.getObjCConstantStringInterface(); 10114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff Ty = Context.getObjCObjectPointerType(Ty); 102a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner } else { 103d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff // If there is no NSString interface defined then treat constant 104a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner // strings as untyped objects and let the runtime figure it out later. 105a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner Ty = Context.getObjCIdType(); 106a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner } 10713fd7e5111032f54b538dd66d035b0ccc1f82467Chris Lattner } 1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 109f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner return new (Context) ObjCStringLiteral(S, Ty, AtLocs[0]); 11085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 11185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 1121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpExpr *Sema::BuildObjCEncodeExpression(SourceLocation AtLoc, 11381d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *EncodedTypeInfo, 114fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson SourceLocation RParenLoc) { 11581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor QualType EncodedType = EncodedTypeInfo->getType(); 116fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson QualType StrTy; 1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (EncodedType->isDependentType()) 118fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson StrTy = Context.DependentTy; 119fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson else { 120fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson std::string Str; 121fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson Context.getObjCEncodingForType(EncodedType, Str); 122fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson 123fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson // The type of @encode is the same as the type of the corresponding string, 124fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson // which is an array type. 125fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson StrTy = Context.CharTy; 126fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson // A C++ string literal has a const-qualified element type (C++ 2.13.4p1). 1274b7a834e0fecddd9eaf1f4567867c718e4eebf50John McCall if (getLangOptions().CPlusPlus || getLangOptions().ConstStrings) 128fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson StrTy.addConst(); 129fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson StrTy = Context.getConstantArrayType(StrTy, llvm::APInt(32, Str.size()+1), 130fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson ArrayType::Normal, 0); 131fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson } 1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13381d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor return new (Context) ObjCEncodeExpr(StrTy, EncodedTypeInfo, AtLoc, RParenLoc); 134fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson} 135fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson 136f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallExprResult Sema::ParseObjCEncodeExpression(SourceLocation AtLoc, 137f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation EncodeLoc, 138f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation LParenLoc, 139f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall ParsedType ty, 140f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation RParenLoc) { 141e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis // FIXME: Preserve type source info ? 14281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *TInfo; 14381d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor QualType EncodedType = GetTypeFromParser(ty, &TInfo); 14481d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor if (!TInfo) 14581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TInfo = Context.getTrivialTypeSourceInfo(EncodedType, 14681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor PP.getLocForEndOfToken(LParenLoc)); 14785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 14881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor return BuildObjCEncodeExpression(AtLoc, TInfo, RParenLoc); 14985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 15085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 151f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallExprResult Sema::ParseObjCSelectorExpression(Selector Sel, 152f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation AtLoc, 153f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation SelLoc, 154f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation LParenLoc, 155f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation RParenLoc) { 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel, 1576b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian SourceRange(LParenLoc, RParenLoc), false, false); 1587ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian if (!Method) 1597ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian Method = LookupFactoryMethodInGlobalPool(Sel, 1607ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian SourceRange(LParenLoc, RParenLoc)); 1617ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian if (!Method) 1627ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian Diag(SelLoc, diag::warn_undeclared_selector) << Sel; 1637ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian 1643fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian llvm::DenseMap<Selector, SourceLocation>::iterator Pos 1653fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian = ReferencedSelectors.find(Sel); 1663fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian if (Pos == ReferencedSelectors.end()) 1673fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian ReferencedSelectors.insert(std::make_pair(Sel, SelLoc)); 1683fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian 169a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner QualType Ty = Context.getObjCSelType(); 1706d5a1c28593443f3973ef38f8fa042d59182412dDaniel Dunbar return new (Context) ObjCSelectorExpr(Ty, Sel, AtLoc, RParenLoc); 17185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 17285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 173f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId, 174f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation AtLoc, 175f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation ProtoLoc, 176f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation LParenLoc, 177f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation RParenLoc) { 178c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor ObjCProtocolDecl* PDecl = LookupProtocol(ProtocolId, ProtoLoc); 17985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner if (!PDecl) { 1803c73c41cefcfe76f36b7bed72c9f1ec195490951Chris Lattner Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId; 18185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner return true; 18285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner } 1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 184a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner QualType Ty = Context.getObjCProtoType(); 185a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner if (Ty.isNull()) 18685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner return true; 18714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff Ty = Context.getObjCObjectPointerType(Ty); 188a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner return new (Context) ObjCProtocolExpr(Ty, PDecl, AtLoc, RParenLoc); 18985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 19085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 1911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Sema::CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs, 1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Selector Sel, ObjCMethodDecl *Method, 193077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner bool isClassMessage, 194637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar SourceLocation lbrac, SourceLocation rbrac, 1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &ReturnType) { 196637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar if (!Method) { 1976660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar // Apply default argument promotion as for (C99 6.5.2.2p6). 19892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor for (unsigned i = 0; i != NumArgs; i++) { 19992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Args[i]->isTypeDependent()) 20092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor continue; 20192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 2026660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar DefaultArgumentPromotion(Args[i]); 20392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 2046660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar 205077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner unsigned DiagID = isClassMessage ? diag::warn_class_method_not_found : 206077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner diag::warn_inst_method_not_found; 207077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner Diag(lbrac, DiagID) 208077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner << Sel << isClassMessage << SourceRange(lbrac, rbrac); 209637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar ReturnType = Context.getObjCIdType(); 210637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar return false; 211637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar } 2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2135291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor ReturnType = Method->getSendResultType(); 2141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21591e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar unsigned NumNamedArgs = Sel.getNumArgs(); 2164f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian // Method might have more arguments than selector indicates. This is due 2174f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian // to addition of c-style arguments in method. 2184f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian if (Method->param_size() > Sel.getNumArgs()) 2194f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian NumNamedArgs = Method->param_size(); 2204f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian // FIXME. This need be cleaned up. 2214f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian if (NumArgs < NumNamedArgs) { 222d77b9a29651d748f0e30a8dad8969635fc04f725Eric Christopher Diag(lbrac, diag::err_typecheck_call_too_few_args) << 2 223d77b9a29651d748f0e30a8dad8969635fc04f725Eric Christopher << NumNamedArgs << NumArgs; 2244f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian return false; 2254f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian } 22691e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar 227312531a8cd69c562d5687bd69fd334be99d87320Chris Lattner bool IsError = false; 22891e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar for (unsigned i = 0; i < NumNamedArgs; i++) { 22992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // We can't do any type-checking on a type-dependent argument. 23092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Args[i]->isTypeDependent()) 23192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor continue; 23292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 23385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner Expr *argExpr = Args[i]; 23492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 235688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor ParmVarDecl *Param = Method->param_begin()[i]; 23685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner assert(argExpr && "CheckMessageArgumentTypes(): missing expression"); 2371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 238688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor if (RequireCompleteType(argExpr->getSourceRange().getBegin(), 239688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor Param->getType(), 240688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor PDiag(diag::err_call_incomplete_argument) 241688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor << argExpr->getSourceRange())) 242688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor return true; 243688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor 244688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor InitializedEntity Entity = InitializedEntity::InitializeParameter(Param); 24560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult ArgE = PerformCopyInitialization(Entity, 246688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor SourceLocation(), 247688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor Owned(argExpr->Retain())); 248688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor if (ArgE.isInvalid()) 249688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor IsError = true; 250688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor else 251688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor Args[i] = ArgE.takeAs<Expr>(); 25285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner } 25391e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar 25491e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar // Promote additional arguments to variadic methods. 25591e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar if (Method->isVariadic()) { 25692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor for (unsigned i = NumNamedArgs; i < NumArgs; ++i) { 25792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Args[i]->isTypeDependent()) 25892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor continue; 25992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 260403783337fc06ce46bc2adeb7f09e0c0471f758eChris Lattner IsError |= DefaultVariadicArgumentPromotion(Args[i], VariadicMethod, 0); 26192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 26291e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar } else { 26391e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar // Check for extra arguments to non-variadic methods. 26491e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar if (NumArgs != NumNamedArgs) { 2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Diag(Args[NumNamedArgs]->getLocStart(), 266fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner diag::err_typecheck_call_too_many_args) 267ccfa9639f8d09733bcf1c2572c5bd3daba5bd632Eric Christopher << 2 /*method*/ << NumNamedArgs << NumArgs 268ccfa9639f8d09733bcf1c2572c5bd3daba5bd632Eric Christopher << Method->getSourceRange() 269fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner << SourceRange(Args[NumNamedArgs]->getLocStart(), 270fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner Args[NumArgs-1]->getLocEnd()); 27191e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar } 27291e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar } 27391e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar 2742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor DiagnoseSentinelCalls(Method, lbrac, Args, NumArgs); 275312531a8cd69c562d5687bd69fd334be99d87320Chris Lattner return IsError; 27685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 27785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 2786b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroffbool Sema::isSelfExpr(Expr *RExpr) { 2796b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(RExpr)) 2806b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff if (DRE->getDecl()->getIdentifier() == &Context.Idents.get("self")) 2816b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff return true; 2826b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff return false; 2836b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff} 2846b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff 285f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff// Helper method for ActOnClassMethod/ActOnInstanceMethod. 286f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff// Will search "local" class/category implementations for a method decl. 287175ba1e8180083927aabd7cc8137baa16be75646Fariborz Jahanian// If failed, then we search in class's root for an instance method. 288f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff// Returns 0 if no method is found. 2895609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve NaroffObjCMethodDecl *Sema::LookupPrivateClassMethod(Selector Sel, 290f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff ObjCInterfaceDecl *ClassDecl) { 291f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff ObjCMethodDecl *Method = 0; 2925609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // lookup in class and all superclasses 2935609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff while (ClassDecl && !Method) { 29487018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 29517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Method = ImpDecl->getClassMethod(Sel); 2961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2975609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // Look through local category implementations associated with the class. 2981cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis if (!Method) 2991cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis Method = ClassDecl->getCategoryClassMethod(Sel); 3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3015609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // Before we give up, check if the selector is an instance method. 3025609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // But only in the root. This matches gcc's behaviour and what the 3035609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // runtime expects. 3045609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff if (!Method && !ClassDecl->getSuperClass()) { 30517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Method = ClassDecl->lookupInstanceMethod(Sel); 3061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Look through local category implementations associated 3075609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // with the root class. 3081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Method) 3095609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff Method = LookupPrivateInstanceMethod(Sel, ClassDecl); 310f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff } 3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3125609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff ClassDecl = ClassDecl->getSuperClass(); 313f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff } 3145609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff return Method; 3155609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff} 3165609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff 3175609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve NaroffObjCMethodDecl *Sema::LookupPrivateInstanceMethod(Selector Sel, 3185609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff ObjCInterfaceDecl *ClassDecl) { 3195609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff ObjCMethodDecl *Method = 0; 3205609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff while (ClassDecl && !Method) { 3215609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // If we have implementations in scope, check "private" methods. 32287018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 32317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Method = ImpDecl->getInstanceMethod(Sel); 3241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3255609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // Look through local category implementations associated with the class. 3261cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis if (!Method) 3271cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis Method = ClassDecl->getCategoryInstanceMethod(Sel); 3285609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff ClassDecl = ClassDecl->getSuperClass(); 329175ba1e8180083927aabd7cc8137baa16be75646Fariborz Jahanian } 330f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff return Method; 331f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff} 332f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff 3337f81652f97a69ae8b514893a69c0245253687e55Chris Lattner/// HandleExprPropertyRefExpr - Handle foo.bar where foo is a pointer to an 3347f81652f97a69ae8b514893a69c0245253687e55Chris Lattner/// objective C interface. This is a property reference expression. 33560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema:: 3367f81652f97a69ae8b514893a69c0245253687e55Chris LattnerHandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT, 337b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner Expr *BaseExpr, DeclarationName MemberName, 338b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner SourceLocation MemberLoc) { 3397f81652f97a69ae8b514893a69c0245253687e55Chris Lattner const ObjCInterfaceType *IFaceT = OPT->getInterfaceType(); 3407f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCInterfaceDecl *IFace = IFaceT->getDecl(); 3417f81652f97a69ae8b514893a69c0245253687e55Chris Lattner IdentifierInfo *Member = MemberName.getAsIdentifierInfo(); 3427f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3437f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Search for a declared property first. 3447f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(Member)) { 3457f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Check whether we can reference this property. 3467f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (DiagnoseUseOfDecl(PD, MemberLoc)) 3477f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 3487f81652f97a69ae8b514893a69c0245253687e55Chris Lattner QualType ResTy = PD->getType(); 3497f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Selector Sel = PP.getSelectorTable().getNullarySelector(Member); 3507f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel); 3517f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (DiagnosePropertyAccessorMismatch(PD, Getter, MemberLoc)) 3525291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor ResTy = Getter->getSendResultType(); 3537f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy, 3547f81652f97a69ae8b514893a69c0245253687e55Chris Lattner MemberLoc, BaseExpr)); 3557f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 3567f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Check protocols on qualified interfaces. 3577f81652f97a69ae8b514893a69c0245253687e55Chris Lattner for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 3587f81652f97a69ae8b514893a69c0245253687e55Chris Lattner E = OPT->qual_end(); I != E; ++I) 3597f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(Member)) { 3607f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Check whether we can reference this property. 3617f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (DiagnoseUseOfDecl(PD, MemberLoc)) 3627f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 3637f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3647f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(), 3657f81652f97a69ae8b514893a69c0245253687e55Chris Lattner MemberLoc, BaseExpr)); 3667f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 3677f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // If that failed, look for an "implicit" property by seeing if the nullary 3687f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // selector is implemented. 3697f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3707f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // FIXME: The logic for looking up nullary and unary selectors should be 3717f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // shared with the code in ActOnInstanceMessage. 3727f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3737f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Selector Sel = PP.getSelectorTable().getNullarySelector(Member); 3747f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel); 3757f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3767f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // If this reference is in an @implementation, check for 'private' methods. 3777f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (!Getter) 3787f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Getter = IFace->lookupPrivateInstanceMethod(Sel); 3797f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3807f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Look through local category implementations associated with the class. 3817f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (!Getter) 3827f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Getter = IFace->getCategoryInstanceMethod(Sel); 3837f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (Getter) { 3847f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Check if we can reference this property. 3857f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (DiagnoseUseOfDecl(Getter, MemberLoc)) 3867f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 3877f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 3887f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // If we found a getter then this may be a valid dot-reference, we 3897f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // will look for the matching setter, in case it is needed. 3907f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Selector SetterSel = 3917f81652f97a69ae8b514893a69c0245253687e55Chris Lattner SelectorTable::constructSetterName(PP.getIdentifierTable(), 3927f81652f97a69ae8b514893a69c0245253687e55Chris Lattner PP.getSelectorTable(), Member); 3937f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCMethodDecl *Setter = IFace->lookupInstanceMethod(SetterSel); 3947f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (!Setter) { 3957f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // If this reference is in an @implementation, also check for 'private' 3967f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // methods. 3977f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Setter = IFace->lookupPrivateInstanceMethod(SetterSel); 3987f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 3997f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Look through local category implementations associated with the class. 4007f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (!Setter) 4017f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Setter = IFace->getCategoryInstanceMethod(SetterSel); 4027f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 4037f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (Setter && DiagnoseUseOfDecl(Setter, MemberLoc)) 4047f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 4057f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 4067f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (Getter) { 4077f81652f97a69ae8b514893a69c0245253687e55Chris Lattner QualType PType; 4085291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor PType = Getter->getSendResultType(); 4097f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return Owned(new (Context) ObjCImplicitSetterGetterRefExpr(Getter, PType, 4107f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Setter, MemberLoc, BaseExpr)); 4117f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 4127f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 4137f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Attempt to correct for typos in property names. 4147f81652f97a69ae8b514893a69c0245253687e55Chris Lattner LookupResult Res(*this, MemberName, MemberLoc, LookupOrdinaryName); 415aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (CorrectTypo(Res, 0, 0, IFace, false, CTC_NoKeywords, OPT) && 4167f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Res.getAsSingle<ObjCPropertyDecl>()) { 417b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner DeclarationName TypoResult = Res.getLookupName(); 4187f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Diag(MemberLoc, diag::err_property_not_found_suggest) 419b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner << MemberName << QualType(OPT, 0) << TypoResult 420b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner << FixItHint::CreateReplacement(MemberLoc, TypoResult.getAsString()); 4217f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCPropertyDecl *Property = Res.getAsSingle<ObjCPropertyDecl>(); 4227f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Diag(Property->getLocation(), diag::note_previous_decl) 4237f81652f97a69ae8b514893a69c0245253687e55Chris Lattner << Property->getDeclName(); 424b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner return HandleExprPropertyRefExpr(OPT, BaseExpr, TypoResult, MemberLoc); 4257f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 426b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner 4277f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Diag(MemberLoc, diag::err_property_not_found) 4287f81652f97a69ae8b514893a69c0245253687e55Chris Lattner << MemberName << QualType(OPT, 0); 4297f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (Setter && !Getter) 4307f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Diag(Setter->getLocation(), diag::note_getter_unavailable) 4317f81652f97a69ae8b514893a69c0245253687e55Chris Lattner << MemberName << BaseExpr->getSourceRange(); 4327f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 4337f81652f97a69ae8b514893a69c0245253687e55Chris Lattner} 4347f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 4357f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 4367f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 43760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema:: 438eb483eb3ee80300f15d6d13573d82493c2194461Chris LattnerActOnClassPropertyRefExpr(IdentifierInfo &receiverName, 439eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner IdentifierInfo &propertyName, 440eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner SourceLocation receiverNameLoc, 441eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner SourceLocation propertyNameLoc) { 4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 443f06cdae9c68dfc4191fbf6b9e5ea0fd748488d88Douglas Gregor IdentifierInfo *receiverNamePtr = &receiverName; 444c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(receiverNamePtr, 445c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor receiverNameLoc); 446eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (IFace == 0) { 447eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // If the "receiver" is 'super' in a method, handle it as an expression-like 448eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // property reference. 449eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 450eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (receiverNamePtr->isStr("super")) { 451eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (CurMethod->isInstanceMethod()) { 452eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner QualType T = 453eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner Context.getObjCInterfaceType(CurMethod->getClassInterface()); 454eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner T = Context.getObjCObjectPointerType(T); 455eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner Expr *SuperExpr = new (Context) ObjCSuperExpr(receiverNameLoc, T); 456eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner 457eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner return HandleExprPropertyRefExpr(T->getAsObjCInterfacePointerType(), 458eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner SuperExpr, &propertyName, 459eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner propertyNameLoc); 460eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner } 461eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner 462eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // Otherwise, if this is a class method, try dispatching to our 463eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // superclass. 464eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner IFace = CurMethod->getClassInterface()->getSuperClass(); 465eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner } 466eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner 467eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (IFace == 0) { 468eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner Diag(receiverNameLoc, diag::err_expected_ident_or_lparen); 469eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner return ExprError(); 470eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner } 4718149a5786def747af783a9e3c22714bb7ab42b9cFariborz Jahanian } 4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 473eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // Search for a declared property first. 47461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName); 47517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel); 47661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 47761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // If this reference is in an @implementation, check for 'private' methods. 47861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (!Getter) 47961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) 48061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) 48187018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 48217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Getter = ImpDecl->getClassMethod(Sel); 48361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 48461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (Getter) { 48561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // FIXME: refactor/share with ActOnMemberReference(). 48661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // Check if we can reference this property. 48761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (DiagnoseUseOfDecl(Getter, propertyNameLoc)) 48861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff return ExprError(); 48961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff } 4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // Look for the matching setter, in case it is needed. 4921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Selector SetterSel = 4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SelectorTable::constructSetterName(PP.getIdentifierTable(), 494fdc92b7877535e6264fe43cfbdc8f01e9b224f81Steve Naroff PP.getSelectorTable(), &propertyName); 4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); 49761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (!Setter) { 49861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // If this reference is in an @implementation, also check for 'private' 49961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // methods. 50061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) 50161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) 50287018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 50317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Setter = ImpDecl->getClassMethod(SetterSel); 50461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff } 50561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // Look through local category implementations associated with the class. 5061cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis if (!Setter) 5071cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis Setter = IFace->getCategoryClassMethod(SetterSel); 50861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 50961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (Setter && DiagnoseUseOfDecl(Setter, propertyNameLoc)) 51061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff return ExprError(); 51161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 51261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (Getter || Setter) { 51361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff QualType PType; 51461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 51561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (Getter) 5165291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor PType = Getter->getSendResultType(); 51761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff else { 51861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff for (ObjCMethodDecl::param_iterator PI = Setter->param_begin(), 51961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff E = Setter->param_end(); PI != E; ++PI) 52061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff PType = (*PI)->getType(); 52161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff } 52209105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian return Owned(new (Context) ObjCImplicitSetterGetterRefExpr( 5231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Getter, PType, Setter, 52461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff propertyNameLoc, IFace, receiverNameLoc)); 52561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff } 52661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff return ExprError(Diag(propertyNameLoc, diag::err_property_not_found) 52761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff << &propertyName << Context.getObjCInterfaceType(IFace)); 52861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff} 52961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 53047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas GregorSema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S, 5311569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor IdentifierInfo *Name, 53247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor SourceLocation NameLoc, 53347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor bool IsSuper, 5341569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor bool HasTrailingDot, 535b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType &ReceiverType) { 536b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ReceiverType = ParsedType(); 5371569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor 53847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // If the identifier is "super" and there is no trailing dot, we're 53947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // messaging super. 54047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor if (IsSuper && !HasTrailingDot && S->isInObjcMethodScope()) 54147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor return ObjCSuperMessage; 54247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 54347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor LookupResult Result(*this, Name, NameLoc, LookupOrdinaryName); 54447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor LookupName(Result, S); 54547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 54647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor switch (Result.getResultKind()) { 54747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::NotFound: 548ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor // Normal name lookup didn't find anything. If we're in an 549ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor // Objective-C method, look for ivars. If we find one, we're done! 550ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor // FIXME: This is a hack. Ivar lookup should be part of normal lookup. 551ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) { 552ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor ObjCInterfaceDecl *ClassDeclared; 553ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor if (Method->getClassInterface()->lookupInstanceVariable(Name, 554ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor ClassDeclared)) 555ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor return ObjCInstanceMessage; 556ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor } 557ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor 55847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // Break out; we'll perform typo correction below. 55947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor break; 56047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 56147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::NotFoundInCurrentInstantiation: 56247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::FoundOverloaded: 56347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::FoundUnresolvedValue: 56447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::Ambiguous: 56547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor Result.suppressDiagnostics(); 56647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor return ObjCInstanceMessage; 56747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 56847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::Found: { 56947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // We found something. If it's a type, then we have a class 57047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // message. Otherwise, it's an instance message. 57147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor NamedDecl *ND = Result.getFoundDecl(); 5721569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor QualType T; 5731569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND)) 5741569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor T = Context.getObjCInterfaceType(Class); 5751569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor else if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) 5761569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor T = Context.getTypeDeclType(Type); 5771569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor else 5781569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor return ObjCInstanceMessage; 5791569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor 5801569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor // We have a class message, and T is the type we're 5811569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor // messaging. Build source-location information for it. 5821569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc); 583b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ReceiverType = CreateParsedType(T, TSInfo); 5841569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor return ObjCClassMessage; 58547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor } 58647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor } 58747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 588aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor // Determine our typo-correction context. 589aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor CorrectTypoContext CTC = CTC_Expression; 590aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) 591aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (Method->getClassInterface() && 592aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Method->getClassInterface()->getSuperClass()) 593aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor CTC = CTC_ObjCMessageReceiver; 594aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor 595aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (DeclarationName Corrected = CorrectTypo(Result, S, 0, 0, false, CTC)) { 596aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (Result.isSingleResult()) { 597aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor // If we found a declaration, correct when it refers to an Objective-C 598aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor // class. 599aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor NamedDecl *ND = Result.getFoundDecl(); 6001569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND)) { 601aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Diag(NameLoc, diag::err_unknown_receiver_suggest) 602aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << Name << Result.getLookupName() 603aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << FixItHint::CreateReplacement(SourceRange(NameLoc), 604aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor ND->getNameAsString()); 605aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Diag(ND->getLocation(), diag::note_previous_decl) 606aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << Corrected; 607aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor 6081569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor QualType T = Context.getObjCInterfaceType(Class); 6091569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc); 610b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ReceiverType = CreateParsedType(T, TSInfo); 611aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor return ObjCClassMessage; 612aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor } 613aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor } else if (Result.empty() && Corrected.getAsIdentifierInfo() && 614aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Corrected.getAsIdentifierInfo()->isStr("super")) { 615aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor // If we've found the keyword "super", this is a send to super. 61647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor Diag(NameLoc, diag::err_unknown_receiver_suggest) 617aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << Name << Corrected 618aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << FixItHint::CreateReplacement(SourceRange(NameLoc), "super"); 619aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Name = Corrected.getAsIdentifierInfo(); 620aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor return ObjCSuperMessage; 62147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor } 62247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor } 62347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 62447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // Fall back: let the parser try to parse it as an instance message. 62547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor return ObjCInstanceMessage; 62647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor} 62761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 62860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnSuperMessage(Scope *S, 6290fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor SourceLocation SuperLoc, 6300fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor Selector Sel, 6310fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor SourceLocation LBracLoc, 6320fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor SourceLocation SelectorLoc, 6330fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor SourceLocation RBracLoc, 6340fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor MultiExprArg Args) { 6352725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Determine whether we are inside a method or not. 6362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCMethodDecl *Method = getCurMethodDecl(); 637f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor if (!Method) { 638f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor Diag(SuperLoc, diag::err_invalid_receiver_to_message_super); 639f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor return ExprError(); 640f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor } 6412725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 642f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor ObjCInterfaceDecl *Class = Method->getClassInterface(); 643f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor if (!Class) { 644f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor Diag(SuperLoc, diag::error_no_super_class_message) 645f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor << Method->getDeclName(); 6462725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 64715faee19fdb9017dd6d08a690427b18c3b062c2dChris Lattner } 6482725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 649f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor ObjCInterfaceDecl *Super = Class->getSuperClass(); 6502725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!Super) { 651f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // The current class does not have a superclass. 652f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor Diag(SuperLoc, diag::error_no_super_class) << Class->getIdentifier(); 6532725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 6542725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 6552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 656f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // We are in a method whose class has a superclass, so 'super' 657f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // is acting as a keyword. 658f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor if (Method->isInstanceMethod()) { 659f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // Since we are in an instance method, this is an instance 660f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // message to the superclass instance. 661f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor QualType SuperTy = Context.getObjCInterfaceType(Super); 662f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor SuperTy = Context.getObjCObjectPointerType(SuperTy); 6639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return BuildInstanceMessage(0, SuperTy, SuperLoc, 664f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Sel, /*Method=*/0, LBracLoc, RBracLoc, 665f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor move(Args)); 6662725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 667f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor 668f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // Since we are in a class method, this is a class message to 669f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // the superclass. 670f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor return BuildClassMessage(/*ReceiverTypeInfo=*/0, 671f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor Context.getObjCInterfaceType(Super), 672f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor SuperLoc, Sel, /*Method=*/0, LBracLoc, RBracLoc, 673f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor move(Args)); 6742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 6752725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 6762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \brief Build an Objective-C class message expression. 6772725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// This routine takes care of both normal class messages and 6792725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// class messages to the superclass. 6802725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6812725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param ReceiverTypeInfo Type source information that describes the 6822725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// receiver of this message. This may be NULL, in which case we are 6832725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// sending to the superclass and \p SuperLoc must be a valid source 6842725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// location. 6852725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 6862725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param ReceiverType The type of the object receiving the 6872725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// message. When \p ReceiverTypeInfo is non-NULL, this is the same 6882725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// type as that refers to. For a superclass send, this is the type of 6892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// the superclass. 6902725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param SuperLoc The location of the "super" keyword in a 6922725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// superclass message. 6932725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6942725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Sel The selector to which the message is being sent. 6952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 696f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// \param Method The method that this class message is invoking, if 697f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// already known. 698f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// 6992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param LBracLoc The location of the opening square bracket ']'. 7002725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7012725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param RBrac The location of the closing square bracket ']'. 7022725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7032725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Args The message arguments. 70460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, 7050fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor QualType ReceiverType, 7060fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor SourceLocation SuperLoc, 7070fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor Selector Sel, 7080fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor ObjCMethodDecl *Method, 7090fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor SourceLocation LBracLoc, 7100fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor SourceLocation RBracLoc, 7110fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor MultiExprArg ArgsIn) { 7120fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor SourceLocation Loc = SuperLoc.isValid()? SuperLoc 7130fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor : ReceiverTypeInfo->getTypeLoc().getLocalSourceRange().getBegin(); 7140fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor if (LBracLoc.isInvalid()) { 7150fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor Diag(Loc, diag::err_missing_open_square_message_send) 7160fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor << FixItHint::CreateInsertion(Loc, "["); 7170fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor LBracLoc = Loc; 7180fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor } 7190fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor 72092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (ReceiverType->isDependentType()) { 72192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If the receiver type is dependent, we can't type-check anything 72292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // at this point. Build a dependent expression. 72392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor unsigned NumArgs = ArgsIn.size(); 72492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 72592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor assert(SuperLoc.isInvalid() && "Message to super with dependent type"); 72692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return Owned(ObjCMessageExpr::Create(Context, ReceiverType, LBracLoc, 72792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor ReceiverTypeInfo, Sel, /*Method=*/0, 72892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Args, NumArgs, RBracLoc)); 72992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 73015faee19fdb9017dd6d08a690427b18c3b062c2dChris Lattner 7312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the class to which we are sending this message. 7322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCInterfaceDecl *Class = 0; 733c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall const ObjCObjectType *ClassType = ReceiverType->getAs<ObjCObjectType>(); 734c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!ClassType || !(Class = ClassType->getInterface())) { 7352725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Diag(Loc, diag::err_invalid_receiver_class_message) 7362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor << ReceiverType; 7372725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 7387c778f1c549a8ae95d50a819fd537df78da16426Steve Naroff } 7392725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor assert(Class && "We don't know which class we're messaging?"); 7402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 7412725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the method we are messaging. 742f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method) { 743f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (Class->isForwardDecl()) { 744f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // A forward class used in messaging is treated as a 'Class' 745f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Diag(Loc, diag::warn_receiver_forward_class) << Class->getDeclName(); 746f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = LookupFactoryMethodInGlobalPool(Sel, 747f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor SourceRange(LBracLoc, RBracLoc)); 748f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (Method) 749f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Diag(Method->getLocation(), diag::note_method_sent_forward_class) 750f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor << Method->getDeclName(); 751f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 752f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method) 753f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = Class->lookupClassMethod(Sel); 7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 755f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // If we have an implementation in scope, check "private" methods. 756f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method) 757f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = LookupPrivateClassMethod(Sel, Class); 7587c778f1c549a8ae95d50a819fd537df78da16426Steve Naroff 759f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (Method && DiagnoseUseOfDecl(Method, Loc)) 760f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor return ExprError(); 761f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7632725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Check the argument types and determine the result type. 7642725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType ReturnType; 7652725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor unsigned NumArgs = ArgsIn.size(); 7662725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 7672725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CheckMessageArgumentTypes(Args, NumArgs, Sel, Method, true, 768ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor LBracLoc, RBracLoc, ReturnType)) 7692725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 7704df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek 7712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Construct the appropriate ObjCMessageExpr. 7722d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor Expr *Result; 7732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (SuperLoc.isValid()) 7742d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor Result = ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, 7752d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor SuperLoc, /*IsInstanceSuper=*/false, 7762d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor ReceiverType, Sel, Method, Args, 7772d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor NumArgs, RBracLoc); 7782d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor else 7792d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor Result = ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, 7802d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor ReceiverTypeInfo, Sel, Method, Args, 7812d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor NumArgs, RBracLoc); 7822d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor return MaybeBindToTemporary(Result); 78385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 78485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 7852725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// ActOnClassMessage - used for both unary and keyword messages. 78685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// ArgExprs is optional - if it is present, the number of expressions 78785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// is obtained from Sel.getNumArgs(). 78860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnClassMessage(Scope *S, 78977328d1bb92c2c46bc3e4badc4b4b97c517903b7Douglas Gregor ParsedType Receiver, 79077328d1bb92c2c46bc3e4badc4b4b97c517903b7Douglas Gregor Selector Sel, 79177328d1bb92c2c46bc3e4badc4b4b97c517903b7Douglas Gregor SourceLocation LBracLoc, 79277328d1bb92c2c46bc3e4badc4b4b97c517903b7Douglas Gregor SourceLocation SelectorLoc, 79377328d1bb92c2c46bc3e4badc4b4b97c517903b7Douglas Gregor SourceLocation RBracLoc, 79477328d1bb92c2c46bc3e4badc4b4b97c517903b7Douglas Gregor MultiExprArg Args) { 7952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor TypeSourceInfo *ReceiverTypeInfo; 7962725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType ReceiverType = GetTypeFromParser(Receiver, &ReceiverTypeInfo); 7972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ReceiverType.isNull()) 7982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 7991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8012725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!ReceiverTypeInfo) 8022725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType, LBracLoc); 8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return BuildClassMessage(ReceiverTypeInfo, ReceiverType, 805f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor /*SuperLoc=*/SourceLocation(), Sel, /*Method=*/0, 80639968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor LBracLoc, RBracLoc, move(Args)); 8072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 80887d3ef08d892df8264bd51adb6ddd4a22422cd29Steve Naroff 8092725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \brief Build an Objective-C instance message expression. 8102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 8112725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// This routine takes care of both normal instance messages and 8122725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// instance messages to the superclass instance. 8132725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 8142725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Receiver The expression that computes the object that will 8152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// receive this message. This may be empty, in which case we are 8162725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// sending to the superclass instance and \p SuperLoc must be a valid 8172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// source location. 8182725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 8192725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param ReceiverType The (static) type of the object receiving the 8202725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// message. When a \p Receiver expression is provided, this is the 8212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// same type as that expression. For a superclass instance send, this 8222725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// is a pointer to the type of the superclass. 8232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 8242725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param SuperLoc The location of the "super" keyword in a 8252725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// superclass instance message. 8262725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 8272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Sel The selector to which the message is being sent. 8282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 829f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// \param Method The method that this instance message is invoking, if 830f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// already known. 831f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// 8322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param LBracLoc The location of the opening square bracket ']'. 8332725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 8342725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param RBrac The location of the closing square bracket ']'. 8352725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 8362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Args The message arguments. 83760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::BuildInstanceMessage(Expr *Receiver, 8382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType ReceiverType, 8392725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation SuperLoc, 8402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Selector Sel, 841f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor ObjCMethodDecl *Method, 8422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation LBracLoc, 8432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation RBracLoc, 8442725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor MultiExprArg ArgsIn) { 8450fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor // The location of the receiver. 8460fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor SourceLocation Loc = SuperLoc.isValid()? SuperLoc : Receiver->getLocStart(); 8470fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor 8480fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor if (LBracLoc.isInvalid()) { 8490fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor Diag(Loc, diag::err_missing_open_square_message_send) 8500fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor << FixItHint::CreateInsertion(Loc, "["); 8510fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor LBracLoc = Loc; 8520fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor } 8530fbda68b50ce17d7ad36ef7a5ed77518a5cd272eDouglas Gregor 8542725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // If we have a receiver expression, perform appropriate promotions 8552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // and determine receiver type. 8562725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Receiver) { 85792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor if (Receiver->isTypeDependent()) { 85892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // If the receiver is type-dependent, we can't type-check anything 85992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor // at this point. Build a dependent expression. 86092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor unsigned NumArgs = ArgsIn.size(); 86192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 86292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor assert(SuperLoc.isInvalid() && "Message to super with dependent type"); 86392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor return Owned(ObjCMessageExpr::Create(Context, Context.DependentTy, 86492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor LBracLoc, Receiver, Sel, 86592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor /*Method=*/0, Args, NumArgs, 86692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor RBracLoc)); 86792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor } 86892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor 8692725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // If necessary, apply function/array conversion to the receiver. 8702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // C99 6.7.5.3p[7,8]. 8712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor DefaultFunctionArrayLvalueConversion(Receiver); 8722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverType = Receiver->getType(); 8732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 87404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 875f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method) { 876f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // Handle messages to id. 877ba551983016ee3eac5421255d2ebe6723e61befbFariborz Jahanian bool receiverIsId = ReceiverType->isObjCIdType(); 8786b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian if (receiverIsId || ReceiverType->isBlockPointerType() || 879f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor (Receiver && Context.isObjCNSObjectType(Receiver->getType()))) { 880f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = LookupInstanceMethodInGlobalPool(Sel, 8816b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian SourceRange(LBracLoc, RBracLoc), 8826b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian receiverIsId); 883f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method) 8842725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = LookupFactoryMethodInGlobalPool(Sel, 8856b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian SourceRange(LBracLoc, RBracLoc), 8866b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian receiverIsId); 887f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } else if (ReceiverType->isObjCClassType() || 888f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor ReceiverType->isObjCQualifiedClassType()) { 889f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // Handle messages to Class. 890f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) { 891f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) { 892f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // First check the public methods in the class interface. 893f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = ClassDecl->lookupClassMethod(Sel); 894f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor 895f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method) 896f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = LookupPrivateClassMethod(Sel, ClassDecl); 897f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor 898f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // FIXME: if we still haven't found a method, we need to look in 899f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // protocols (if we have qualifiers). 9006b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff } 901f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (Method && DiagnoseUseOfDecl(Method, Loc)) 902f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor return ExprError(); 903268bc8c1f3a27d2fbd73c3115e4d633d31422ca5Fariborz Jahanian } 90404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (!Method) { 905f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // If not messaging 'self', look for any factory method named 'Sel'. 906f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Receiver || !isSelfExpr(Receiver)) { 907f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = LookupFactoryMethodInGlobalPool(Sel, 9086b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian SourceRange(LBracLoc, RBracLoc), 9096b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian true); 910f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method) { 911f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // If no class (factory) method was found, check if an _instance_ 912f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // method of the same name exists in the root class only. 9132725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = LookupInstanceMethodInGlobalPool(Sel, 9146b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian SourceRange(LBracLoc, RBracLoc), 9156b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian true); 916f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (Method) 917f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (const ObjCInterfaceDecl *ID = 918f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) { 919f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (ID->getSuperClass()) 920f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Diag(Loc, diag::warn_root_inst_method_not_found) 921f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor << Sel << SourceRange(LBracLoc, RBracLoc); 922f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 92304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 92404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 92504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 92604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } else { 927f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor ObjCInterfaceDecl* ClassDecl = 0; 928f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor 929f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // We allow sending a message to a qualified ID ("id<foo>"), which is ok as 930f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // long as one of the protocols implements the selector (if not, warn). 931f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (const ObjCObjectPointerType *QIdTy 932f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 933f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // Search protocols for instance methods. 934f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QIdTy->qual_begin(), 935f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor E = QIdTy->qual_end(); I != E; ++I) { 936f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor ObjCProtocolDecl *PDecl = *I; 937f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (PDecl && (Method = PDecl->lookupInstanceMethod(Sel))) 938f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor break; 939f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // Since we aren't supporting "Class<foo>", look for a class method. 940f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (PDecl && (Method = PDecl->lookupClassMethod(Sel))) 941f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor break; 942f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 943f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } else if (const ObjCObjectPointerType *OCIType 944f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 945f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // We allow sending a message to a pointer to an interface (an object). 946f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor ClassDecl = OCIType->getInterfaceDecl(); 947f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // FIXME: consider using LookupInstanceMethodInGlobalPool, since it will be 948f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // faster than the following method (which can do *many* linear searches). 949db9d2145f1d85f64dba2c9b92416621ce01090a6Sebastian Redl // The idea is to add class info to MethodPool. 950f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = ClassDecl->lookupInstanceMethod(Sel); 951f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor 952f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method) { 953f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // Search protocol qualifiers. 954f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor for (ObjCObjectPointerType::qual_iterator QI = OCIType->qual_begin(), 955f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor E = OCIType->qual_end(); QI != E; ++QI) { 956f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if ((Method = (*QI)->lookupInstanceMethod(Sel))) 957f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor break; 958f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 959f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 960f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method) { 961f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // If we have implementations in scope, check "private" methods. 962f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = LookupPrivateInstanceMethod(Sel, ClassDecl); 963f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor 964f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (!Method && (!Receiver || !isSelfExpr(Receiver))) { 965f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // If we still haven't found a method, look in the global pool. This 966f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // behavior isn't very desirable, however we need it for GCC 967f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // compatibility. FIXME: should we deviate?? 968f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (OCIType->qual_empty()) { 969f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Method = LookupInstanceMethodInGlobalPool(Sel, 9706b308f6dc7d8f1581c52095f435c0e1284b111d8Fariborz Jahanian SourceRange(LBracLoc, RBracLoc)); 971f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (Method && !OCIType->getInterfaceDecl()->isForwardDecl()) 972f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Diag(Loc, diag::warn_maynot_respond) 973f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor << OCIType->getInterfaceDecl()->getIdentifier() << Sel; 974f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 975f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 976f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 977f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (Method && DiagnoseUseOfDecl(Method, Loc)) 978f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor return ExprError(); 979f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } else if (!Context.getObjCIdType().isNull() && 980f60946222721d9ba3c059563935c17b84703187aDouglas Gregor (ReceiverType->isPointerType() || 981f60946222721d9ba3c059563935c17b84703187aDouglas Gregor ReceiverType->isIntegerType())) { 982f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // Implicitly convert integers and pointers to 'id' but emit a warning. 983f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Diag(Loc, diag::warn_bad_receiver_type) 984f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor << ReceiverType 985f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor << Receiver->getSourceRange(); 986f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor if (ReceiverType->isPointerType()) 987f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor ImpCastExprToType(Receiver, Context.getObjCIdType(), 9882de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_BitCast); 989f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor else 990f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor ImpCastExprToType(Receiver, Context.getObjCIdType(), 9912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall CK_IntegralToPointer); 992f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor ReceiverType = Receiver->getType(); 99379d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian } 9943ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian else if (getLangOptions().CPlusPlus && 9953ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian !PerformContextuallyConvertToObjCId(Receiver)) { 9963ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Receiver)) { 9973ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian Receiver = ICE->getSubExpr(); 9983ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian ReceiverType = Receiver->getType(); 9993ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian } 10009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return BuildInstanceMessage(Receiver, 100179d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian ReceiverType, 100279d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian SuperLoc, 100379d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian Sel, 100479d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian Method, 100579d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian LBracLoc, 100679d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian RBracLoc, 100779d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian move(ArgsIn)); 1008f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } else { 1009f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor // Reject other random receiver types (e.g. structs). 1010f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor Diag(Loc, diag::err_bad_receiver_type) 1011f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor << ReceiverType << Receiver->getSourceRange(); 1012f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor return ExprError(); 1013f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor } 101404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 1015fe1a553256b46fad3c0a9e9967481bcf571339ecChris Lattner } 10161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Check the message arguments. 10182725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor unsigned NumArgs = ArgsIn.size(); 10192725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 10202725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType ReturnType; 10212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CheckMessageArgumentTypes(Args, NumArgs, Sel, Method, false, 10222725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LBracLoc, RBracLoc, ReturnType)) 10232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 1024da59e09f1fd53350fcd949adbadd8148117f21b2Fariborz Jahanian 1025da59e09f1fd53350fcd949adbadd8148117f21b2Fariborz Jahanian if (!ReturnType->isVoidType()) { 1026da59e09f1fd53350fcd949adbadd8148117f21b2Fariborz Jahanian if (RequireCompleteType(LBracLoc, ReturnType, 1027da59e09f1fd53350fcd949adbadd8148117f21b2Fariborz Jahanian diag::err_illegal_message_expr_incomplete_type)) 1028da59e09f1fd53350fcd949adbadd8148117f21b2Fariborz Jahanian return ExprError(); 1029da59e09f1fd53350fcd949adbadd8148117f21b2Fariborz Jahanian } 103004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 10312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Construct the appropriate ObjCMessageExpr instance. 10322d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor Expr *Result; 10332725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (SuperLoc.isValid()) 10342d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor Result = ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, 10352d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor SuperLoc, /*IsInstanceSuper=*/true, 10362d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor ReceiverType, Sel, Method, 10372d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor Args, NumArgs, RBracLoc); 10382d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor else 10392d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor Result = ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, Receiver, 10402d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor Sel, Method, Args, NumArgs, RBracLoc); 10412d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor return MaybeBindToTemporary(Result); 10422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 10432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 10442725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// ActOnInstanceMessage - used for both unary and keyword messages. 10452725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// ArgExprs is optional - if it is present, the number of expressions 10462725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// is obtained from Sel.getNumArgs(). 104760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult Sema::ActOnInstanceMessage(Scope *S, 104860d7b3a319d84d688752be3870615ac0f111fb16John McCall Expr *Receiver, 104960d7b3a319d84d688752be3870615ac0f111fb16John McCall Selector Sel, 105060d7b3a319d84d688752be3870615ac0f111fb16John McCall SourceLocation LBracLoc, 105160d7b3a319d84d688752be3870615ac0f111fb16John McCall SourceLocation SelectorLoc, 105260d7b3a319d84d688752be3870615ac0f111fb16John McCall SourceLocation RBracLoc, 105360d7b3a319d84d688752be3870615ac0f111fb16John McCall MultiExprArg Args) { 10542725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!Receiver) 10552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 105604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 10579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall return BuildInstanceMessage(Receiver, Receiver->getType(), 1058f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor /*SuperLoc=*/SourceLocation(), Sel, /*Method=*/0, 1059f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor LBracLoc, RBracLoc, move(Args)); 106085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 1061eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner 1062