SemaExprObjC.cpp revision f95861a4ab6bbd6a975ed079dd70eb1cc22f4467
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 1485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner#include "Sema.h" 157f81652f97a69ae8b514893a69c0245253687e55Chris Lattner#include "Lookup.h" 1685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner#include "clang/AST/ASTContext.h" 1785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner#include "clang/AST/DeclObjC.h" 18f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroff#include "clang/AST/ExprObjC.h" 192725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor#include "clang/AST/TypeLoc.h" 2039c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner#include "llvm/ADT/SmallString.h" 2161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff#include "clang/Lex/Preprocessor.h" 2261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 2385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattnerusing namespace clang; 2485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs, 2639c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner ExprTy **strings, 2785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner unsigned NumStrings) { 2839c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner StringLiteral **Strings = reinterpret_cast<StringLiteral**>(strings); 2939c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner 30f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // Most ObjC strings are formed out of a single piece. However, we *can* 31f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // have strings formed out of multiple @ strings with multiple pptokens in 32f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // each one, e.g. @"foo" "bar" @"baz" "qux" which need to be turned into one 33f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // StringLiteral for ObjCStringLiteral to hold onto. 3439c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner StringLiteral *S = Strings[0]; 351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner // If we have a multi-part string, merge it all together. 37f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner if (NumStrings != 1) { 3885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner // Concatenate objc strings. 3939c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner llvm::SmallString<128> StrBuf; 4039c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner llvm::SmallVector<SourceLocation, 8> StrLocs; 411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner for (unsigned i = 0; i != NumStrings; ++i) { 4339c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner S = Strings[i]; 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4539c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // ObjC strings can't be wide. 46f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner if (S->isWide()) { 47f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner Diag(S->getLocStart(), diag::err_cfstring_literal_not_string_constant) 48f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner << S->getSourceRange(); 49f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner return true; 50f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner } 511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5239c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // Get the string data. 5339c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner StrBuf.append(S->getStrData(), S->getStrData()+S->getByteLength()); 541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5539c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // Get the locations of the string tokens. 5639c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner StrLocs.append(S->tokloc_begin(), S->tokloc_end()); 571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5839c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // Free the temporary string. 598189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek S->Destroy(Context); 6085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner } 611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6239c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // Create the aggregate string with the appropriate content and location 6339c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner // information. 6439c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner S = StringLiteral::Create(Context, &StrBuf[0], StrBuf.size(), false, 652085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner Context.getPointerType(Context.CharTy), 6639c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner &StrLocs[0], StrLocs.size()); 6785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner } 681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner // Verify that this composite string is acceptable for ObjC strings. 70690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner if (CheckObjCString(S)) 7185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner return true; 72a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner 73a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner // Initialize the constant string interface lazily. This assumes 74d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff // the NSString interface is seen in this translation unit. Note: We 75d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff // don't use NSConstantString, since the runtime team considers this 76d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff // interface private (even though it appears in the header files). 77a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner QualType Ty = Context.getObjCConstantStringInterface(); 78a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner if (!Ty.isNull()) { 7914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff Ty = Context.getObjCObjectPointerType(Ty); 8013fd7e5111032f54b538dd66d035b0ccc1f82467Chris Lattner } else { 81d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff IdentifierInfo *NSIdent = &Context.Idents.get("NSString"); 82c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLocs[0], 83c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor LookupOrdinaryName); 84a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) { 85a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner Context.setObjCConstantStringInterface(StrIF); 86a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner Ty = Context.getObjCConstantStringInterface(); 8714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff Ty = Context.getObjCObjectPointerType(Ty); 88a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner } else { 89d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff // If there is no NSString interface defined then treat constant 90a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner // strings as untyped objects and let the runtime figure it out later. 91a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner Ty = Context.getObjCIdType(); 92a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner } 9313fd7e5111032f54b538dd66d035b0ccc1f82467Chris Lattner } 941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 95f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner return new (Context) ObjCStringLiteral(S, Ty, AtLocs[0]); 9685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 9785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpExpr *Sema::BuildObjCEncodeExpression(SourceLocation AtLoc, 9981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *EncodedTypeInfo, 100fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson SourceLocation RParenLoc) { 10181d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor QualType EncodedType = EncodedTypeInfo->getType(); 102fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson QualType StrTy; 1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (EncodedType->isDependentType()) 104fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson StrTy = Context.DependentTy; 105fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson else { 106fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson std::string Str; 107fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson Context.getObjCEncodingForType(EncodedType, Str); 108fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson 109fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson // The type of @encode is the same as the type of the corresponding string, 110fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson // which is an array type. 111fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson StrTy = Context.CharTy; 112fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson // A C++ string literal has a const-qualified element type (C++ 2.13.4p1). 1134b7a834e0fecddd9eaf1f4567867c718e4eebf50John McCall if (getLangOptions().CPlusPlus || getLangOptions().ConstStrings) 114fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson StrTy.addConst(); 115fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson StrTy = Context.getConstantArrayType(StrTy, llvm::APInt(32, Str.size()+1), 116fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson ArrayType::Normal, 0); 117fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson } 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor return new (Context) ObjCEncodeExpr(StrTy, EncodedTypeInfo, AtLoc, RParenLoc); 120fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson} 121fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson 12285a932e26f3c3faae6bad639a6d32e92794dfda9Chris LattnerSema::ExprResult Sema::ParseObjCEncodeExpression(SourceLocation AtLoc, 12385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation EncodeLoc, 12485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation LParenLoc, 125a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner TypeTy *ty, 12685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation RParenLoc) { 127e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis // FIXME: Preserve type source info ? 12881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TypeSourceInfo *TInfo; 12981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor QualType EncodedType = GetTypeFromParser(ty, &TInfo); 13081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor if (!TInfo) 13181d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor TInfo = Context.getTrivialTypeSourceInfo(EncodedType, 13281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor PP.getLocForEndOfToken(LParenLoc)); 13385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 13481d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor return BuildObjCEncodeExpression(AtLoc, TInfo, RParenLoc); 13585a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 13685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 13785a932e26f3c3faae6bad639a6d32e92794dfda9Chris LattnerSema::ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, 13885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation AtLoc, 13985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation SelLoc, 14085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation LParenLoc, 14185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation RParenLoc) { 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel, 143835ed7f15bd8a89226fd7976d96be19995f1c1c8Fariborz Jahanian SourceRange(LParenLoc, RParenLoc), false); 1447ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian if (!Method) 1457ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian Method = LookupFactoryMethodInGlobalPool(Sel, 1467ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian SourceRange(LParenLoc, RParenLoc)); 1477ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian if (!Method) 1487ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian Diag(SelLoc, diag::warn_undeclared_selector) << Sel; 1497ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian 150a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner QualType Ty = Context.getObjCSelType(); 1516d5a1c28593443f3973ef38f8fa042d59182412dDaniel Dunbar return new (Context) ObjCSelectorExpr(Ty, Sel, AtLoc, RParenLoc); 15285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 15385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 15485a932e26f3c3faae6bad639a6d32e92794dfda9Chris LattnerSema::ExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId, 15585a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation AtLoc, 15685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation ProtoLoc, 15785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation LParenLoc, 15885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner SourceLocation RParenLoc) { 159c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor ObjCProtocolDecl* PDecl = LookupProtocol(ProtocolId, ProtoLoc); 16085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner if (!PDecl) { 1613c73c41cefcfe76f36b7bed72c9f1ec195490951Chris Lattner Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId; 16285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner return true; 16385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner } 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner QualType Ty = Context.getObjCProtoType(); 166a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner if (Ty.isNull()) 16785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner return true; 16814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff Ty = Context.getObjCObjectPointerType(Ty); 169a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner return new (Context) ObjCProtocolExpr(Ty, PDecl, AtLoc, RParenLoc); 17085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 17185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 1721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Sema::CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs, 1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Selector Sel, ObjCMethodDecl *Method, 174077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner bool isClassMessage, 175637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar SourceLocation lbrac, SourceLocation rbrac, 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType &ReturnType) { 177637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar if (!Method) { 1786660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar // Apply default argument promotion as for (C99 6.5.2.2p6). 1796660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar for (unsigned i = 0; i != NumArgs; i++) 1806660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar DefaultArgumentPromotion(Args[i]); 1816660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar 182077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner unsigned DiagID = isClassMessage ? diag::warn_class_method_not_found : 183077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner diag::warn_inst_method_not_found; 184077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner Diag(lbrac, DiagID) 185077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner << Sel << isClassMessage << SourceRange(lbrac, rbrac); 186637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar ReturnType = Context.getObjCIdType(); 187637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar return false; 188637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar } 1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1902725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReturnType = Method->getResultType().getNonReferenceType(); 1911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19291e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar unsigned NumNamedArgs = Sel.getNumArgs(); 1934f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian // Method might have more arguments than selector indicates. This is due 1944f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian // to addition of c-style arguments in method. 1954f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian if (Method->param_size() > Sel.getNumArgs()) 1964f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian NumNamedArgs = Method->param_size(); 1974f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian // FIXME. This need be cleaned up. 1984f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian if (NumArgs < NumNamedArgs) { 199d77b9a29651d748f0e30a8dad8969635fc04f725Eric Christopher Diag(lbrac, diag::err_typecheck_call_too_few_args) << 2 200d77b9a29651d748f0e30a8dad8969635fc04f725Eric Christopher << NumNamedArgs << NumArgs; 2014f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian return false; 2024f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian } 20391e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar 204312531a8cd69c562d5687bd69fd334be99d87320Chris Lattner bool IsError = false; 20591e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar for (unsigned i = 0; i < NumNamedArgs; i++) { 20685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner Expr *argExpr = Args[i]; 20785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner assert(argExpr && "CheckMessageArgumentTypes(): missing expression"); 2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20989951a86b594513c2a013532ed45d197413b1087Chris Lattner QualType lhsType = Method->param_begin()[i]->getType(); 21085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner QualType rhsType = argExpr->getType(); 21185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If necessary, apply function/array conversion. C99 6.7.5.3p[7,8]. 213987798ad1d5db2a8ec26cd5bbe434b35ad32659cChris Lattner if (lhsType->isArrayType()) 214987798ad1d5db2a8ec26cd5bbe434b35ad32659cChris Lattner lhsType = Context.getArrayDecayedType(lhsType); 21585a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner else if (lhsType->isFunctionType()) 21685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner lhsType = Context.getPointerType(lhsType); 21785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 2181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump AssignConvertType Result = 219987798ad1d5db2a8ec26cd5bbe434b35ad32659cChris Lattner CheckSingleAssignmentConstraints(lhsType, argExpr); 220b00ab27f64abd18a68fc41699b86d0bc36189e21Fariborz Jahanian if (Result == Incompatible && !getLangOptions().CPlusPlus && 221b00ab27f64abd18a68fc41699b86d0bc36189e21Fariborz Jahanian CheckTransparentUnionArgumentConstraints(lhsType, argExpr) 222b00ab27f64abd18a68fc41699b86d0bc36189e21Fariborz Jahanian == Sema::Compatible) 223b00ab27f64abd18a68fc41699b86d0bc36189e21Fariborz Jahanian Result = Compatible; 224b00ab27f64abd18a68fc41699b86d0bc36189e21Fariborz Jahanian 22585a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner if (Args[i] != argExpr) // The expression was converted. 22685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner Args[i] = argExpr; // Make sure we store the converted expression. 2271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump IsError |= 22985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner DiagnoseAssignmentResult(Result, argExpr->getLocStart(), lhsType, rhsType, 2306864748fc9a780e6db0bb5a7bd20aa889882dc94Douglas Gregor argExpr, AA_Sending); 23185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner } 23291e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar 23391e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar // Promote additional arguments to variadic methods. 23491e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar if (Method->isVariadic()) { 235dce5e2cabf07ff25eb4d9e1859c0a21c69f588d2Anders Carlsson for (unsigned i = NumNamedArgs; i < NumArgs; ++i) 236312531a8cd69c562d5687bd69fd334be99d87320Chris Lattner IsError |= DefaultVariadicArgumentPromotion(Args[i], VariadicMethod); 23791e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar } else { 23891e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar // Check for extra arguments to non-variadic methods. 23991e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar if (NumArgs != NumNamedArgs) { 2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Diag(Args[NumNamedArgs]->getLocStart(), 241fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner diag::err_typecheck_call_too_many_args) 242ccfa9639f8d09733bcf1c2572c5bd3daba5bd632Eric Christopher << 2 /*method*/ << NumNamedArgs << NumArgs 243ccfa9639f8d09733bcf1c2572c5bd3daba5bd632Eric Christopher << Method->getSourceRange() 244fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner << SourceRange(Args[NumNamedArgs]->getLocStart(), 245fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner Args[NumArgs-1]->getLocEnd()); 24691e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar } 24791e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar } 24891e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar 2492725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor DiagnoseSentinelCalls(Method, lbrac, Args, NumArgs); 250312531a8cd69c562d5687bd69fd334be99d87320Chris Lattner return IsError; 25185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 25285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 2536b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroffbool Sema::isSelfExpr(Expr *RExpr) { 2546b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(RExpr)) 2556b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff if (DRE->getDecl()->getIdentifier() == &Context.Idents.get("self")) 2566b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff return true; 2576b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff return false; 2586b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff} 2596b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff 260f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff// Helper method for ActOnClassMethod/ActOnInstanceMethod. 261f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff// Will search "local" class/category implementations for a method decl. 262175ba1e8180083927aabd7cc8137baa16be75646Fariborz Jahanian// If failed, then we search in class's root for an instance method. 263f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff// Returns 0 if no method is found. 2645609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve NaroffObjCMethodDecl *Sema::LookupPrivateClassMethod(Selector Sel, 265f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff ObjCInterfaceDecl *ClassDecl) { 266f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff ObjCMethodDecl *Method = 0; 2675609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // lookup in class and all superclasses 2685609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff while (ClassDecl && !Method) { 26987018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 27017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Method = ImpDecl->getClassMethod(Sel); 2711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2725609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // Look through local category implementations associated with the class. 2731cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis if (!Method) 2741cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis Method = ClassDecl->getCategoryClassMethod(Sel); 2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2765609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // Before we give up, check if the selector is an instance method. 2775609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // But only in the root. This matches gcc's behaviour and what the 2785609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // runtime expects. 2795609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff if (!Method && !ClassDecl->getSuperClass()) { 28017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Method = ClassDecl->lookupInstanceMethod(Sel); 2811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Look through local category implementations associated 2825609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // with the root class. 2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Method) 2845609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff Method = LookupPrivateInstanceMethod(Sel, ClassDecl); 285f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff } 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2875609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff ClassDecl = ClassDecl->getSuperClass(); 288f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff } 2895609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff return Method; 2905609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff} 2915609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff 2925609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve NaroffObjCMethodDecl *Sema::LookupPrivateInstanceMethod(Selector Sel, 2935609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff ObjCInterfaceDecl *ClassDecl) { 2945609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff ObjCMethodDecl *Method = 0; 2955609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff while (ClassDecl && !Method) { 2965609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // If we have implementations in scope, check "private" methods. 29787018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 29817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Method = ImpDecl->getInstanceMethod(Sel); 2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3005609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff // Look through local category implementations associated with the class. 3011cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis if (!Method) 3021cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis Method = ClassDecl->getCategoryInstanceMethod(Sel); 3035609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff ClassDecl = ClassDecl->getSuperClass(); 304175ba1e8180083927aabd7cc8137baa16be75646Fariborz Jahanian } 305f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff return Method; 306f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff} 307f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff 3087f81652f97a69ae8b514893a69c0245253687e55Chris Lattner/// HandleExprPropertyRefExpr - Handle foo.bar where foo is a pointer to an 3097f81652f97a69ae8b514893a69c0245253687e55Chris Lattner/// objective C interface. This is a property reference expression. 3107f81652f97a69ae8b514893a69c0245253687e55Chris LattnerAction::OwningExprResult Sema:: 3117f81652f97a69ae8b514893a69c0245253687e55Chris LattnerHandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT, 312b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner Expr *BaseExpr, DeclarationName MemberName, 313b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner SourceLocation MemberLoc) { 3147f81652f97a69ae8b514893a69c0245253687e55Chris Lattner const ObjCInterfaceType *IFaceT = OPT->getInterfaceType(); 3157f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCInterfaceDecl *IFace = IFaceT->getDecl(); 3167f81652f97a69ae8b514893a69c0245253687e55Chris Lattner IdentifierInfo *Member = MemberName.getAsIdentifierInfo(); 3177f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3187f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Search for a declared property first. 3197f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(Member)) { 3207f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Check whether we can reference this property. 3217f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (DiagnoseUseOfDecl(PD, MemberLoc)) 3227f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 3237f81652f97a69ae8b514893a69c0245253687e55Chris Lattner QualType ResTy = PD->getType(); 3247f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Selector Sel = PP.getSelectorTable().getNullarySelector(Member); 3257f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel); 3267f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (DiagnosePropertyAccessorMismatch(PD, Getter, MemberLoc)) 3277f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ResTy = Getter->getResultType(); 3287f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy, 3297f81652f97a69ae8b514893a69c0245253687e55Chris Lattner MemberLoc, BaseExpr)); 3307f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 3317f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Check protocols on qualified interfaces. 3327f81652f97a69ae8b514893a69c0245253687e55Chris Lattner for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 3337f81652f97a69ae8b514893a69c0245253687e55Chris Lattner E = OPT->qual_end(); I != E; ++I) 3347f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(Member)) { 3357f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Check whether we can reference this property. 3367f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (DiagnoseUseOfDecl(PD, MemberLoc)) 3377f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 3387f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3397f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(), 3407f81652f97a69ae8b514893a69c0245253687e55Chris Lattner MemberLoc, BaseExpr)); 3417f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 3427f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // If that failed, look for an "implicit" property by seeing if the nullary 3437f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // selector is implemented. 3447f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3457f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // FIXME: The logic for looking up nullary and unary selectors should be 3467f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // shared with the code in ActOnInstanceMessage. 3477f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3487f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Selector Sel = PP.getSelectorTable().getNullarySelector(Member); 3497f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel); 3507f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3517f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // If this reference is in an @implementation, check for 'private' methods. 3527f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (!Getter) 3537f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Getter = IFace->lookupPrivateInstanceMethod(Sel); 3547f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3557f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Look through local category implementations associated with the class. 3567f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (!Getter) 3577f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Getter = IFace->getCategoryInstanceMethod(Sel); 3587f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (Getter) { 3597f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Check if we can reference this property. 3607f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (DiagnoseUseOfDecl(Getter, MemberLoc)) 3617f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 3627f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 3637f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // If we found a getter then this may be a valid dot-reference, we 3647f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // will look for the matching setter, in case it is needed. 3657f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Selector SetterSel = 3667f81652f97a69ae8b514893a69c0245253687e55Chris Lattner SelectorTable::constructSetterName(PP.getIdentifierTable(), 3677f81652f97a69ae8b514893a69c0245253687e55Chris Lattner PP.getSelectorTable(), Member); 3687f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCMethodDecl *Setter = IFace->lookupInstanceMethod(SetterSel); 3697f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (!Setter) { 3707f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // If this reference is in an @implementation, also check for 'private' 3717f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // methods. 3727f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Setter = IFace->lookupPrivateInstanceMethod(SetterSel); 3737f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 3747f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Look through local category implementations associated with the class. 3757f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (!Setter) 3767f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Setter = IFace->getCategoryInstanceMethod(SetterSel); 3777f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3787f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (Setter && DiagnoseUseOfDecl(Setter, MemberLoc)) 3797f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 3807f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3817f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (Getter) { 3827f81652f97a69ae8b514893a69c0245253687e55Chris Lattner QualType PType; 3837f81652f97a69ae8b514893a69c0245253687e55Chris Lattner PType = Getter->getResultType(); 3847f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return Owned(new (Context) ObjCImplicitSetterGetterRefExpr(Getter, PType, 3857f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Setter, MemberLoc, BaseExpr)); 3867f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 3877f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 3887f81652f97a69ae8b514893a69c0245253687e55Chris Lattner // Attempt to correct for typos in property names. 3897f81652f97a69ae8b514893a69c0245253687e55Chris Lattner LookupResult Res(*this, MemberName, MemberLoc, LookupOrdinaryName); 390aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (CorrectTypo(Res, 0, 0, IFace, false, CTC_NoKeywords, OPT) && 3917f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Res.getAsSingle<ObjCPropertyDecl>()) { 392b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner DeclarationName TypoResult = Res.getLookupName(); 3937f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Diag(MemberLoc, diag::err_property_not_found_suggest) 394b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner << MemberName << QualType(OPT, 0) << TypoResult 395b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner << FixItHint::CreateReplacement(MemberLoc, TypoResult.getAsString()); 3967f81652f97a69ae8b514893a69c0245253687e55Chris Lattner ObjCPropertyDecl *Property = Res.getAsSingle<ObjCPropertyDecl>(); 3977f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Diag(Property->getLocation(), diag::note_previous_decl) 3987f81652f97a69ae8b514893a69c0245253687e55Chris Lattner << Property->getDeclName(); 399b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner return HandleExprPropertyRefExpr(OPT, BaseExpr, TypoResult, MemberLoc); 4007f81652f97a69ae8b514893a69c0245253687e55Chris Lattner } 401b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner 4027f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Diag(MemberLoc, diag::err_property_not_found) 4037f81652f97a69ae8b514893a69c0245253687e55Chris Lattner << MemberName << QualType(OPT, 0); 4047f81652f97a69ae8b514893a69c0245253687e55Chris Lattner if (Setter && !Getter) 4057f81652f97a69ae8b514893a69c0245253687e55Chris Lattner Diag(Setter->getLocation(), diag::note_getter_unavailable) 4067f81652f97a69ae8b514893a69c0245253687e55Chris Lattner << MemberName << BaseExpr->getSourceRange(); 4077f81652f97a69ae8b514893a69c0245253687e55Chris Lattner return ExprError(); 4087f81652f97a69ae8b514893a69c0245253687e55Chris Lattner} 4097f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 4107f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 4117f81652f97a69ae8b514893a69c0245253687e55Chris Lattner 412eb483eb3ee80300f15d6d13573d82493c2194461Chris LattnerAction::OwningExprResult Sema:: 413eb483eb3ee80300f15d6d13573d82493c2194461Chris LattnerActOnClassPropertyRefExpr(IdentifierInfo &receiverName, 414eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner IdentifierInfo &propertyName, 415eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner SourceLocation receiverNameLoc, 416eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner SourceLocation propertyNameLoc) { 4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 418f06cdae9c68dfc4191fbf6b9e5ea0fd748488d88Douglas Gregor IdentifierInfo *receiverNamePtr = &receiverName; 419c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(receiverNamePtr, 420c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor receiverNameLoc); 421eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (IFace == 0) { 422eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // If the "receiver" is 'super' in a method, handle it as an expression-like 423eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // property reference. 424eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) 425eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (receiverNamePtr->isStr("super")) { 426eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (CurMethod->isInstanceMethod()) { 427eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner QualType T = 428eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner Context.getObjCInterfaceType(CurMethod->getClassInterface()); 429eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner T = Context.getObjCObjectPointerType(T); 430eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner Expr *SuperExpr = new (Context) ObjCSuperExpr(receiverNameLoc, T); 431eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner 432eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner return HandleExprPropertyRefExpr(T->getAsObjCInterfacePointerType(), 433eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner SuperExpr, &propertyName, 434eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner propertyNameLoc); 435eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner } 436eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner 437eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // Otherwise, if this is a class method, try dispatching to our 438eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // superclass. 439eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner IFace = CurMethod->getClassInterface()->getSuperClass(); 440eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner } 441eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner 442eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner if (IFace == 0) { 443eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner Diag(receiverNameLoc, diag::err_expected_ident_or_lparen); 444eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner return ExprError(); 445eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner } 4468149a5786def747af783a9e3c22714bb7ab42b9cFariborz Jahanian } 4471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 448eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner // Search for a declared property first. 44961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName); 45017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel); 45161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 45261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // If this reference is in an @implementation, check for 'private' methods. 45361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (!Getter) 45461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) 45561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) 45687018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 45717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Getter = ImpDecl->getClassMethod(Sel); 45861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 45961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (Getter) { 46061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // FIXME: refactor/share with ActOnMemberReference(). 46161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // Check if we can reference this property. 46261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (DiagnoseUseOfDecl(Getter, propertyNameLoc)) 46361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff return ExprError(); 46461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff } 4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // Look for the matching setter, in case it is needed. 4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Selector SetterSel = 4681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SelectorTable::constructSetterName(PP.getIdentifierTable(), 469fdc92b7877535e6264fe43cfbdc8f01e9b224f81Steve Naroff PP.getSelectorTable(), &propertyName); 4701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel); 47261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (!Setter) { 47361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // If this reference is in an @implementation, also check for 'private' 47461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // methods. 47561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) 47661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) 47787018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation()) 47817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Setter = ImpDecl->getClassMethod(SetterSel); 47961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff } 48061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff // Look through local category implementations associated with the class. 4811cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis if (!Setter) 4821cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis Setter = IFace->getCategoryClassMethod(SetterSel); 48361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 48461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (Setter && DiagnoseUseOfDecl(Setter, propertyNameLoc)) 48561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff return ExprError(); 48661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 48761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (Getter || Setter) { 48861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff QualType PType; 48961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 49061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff if (Getter) 49161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff PType = Getter->getResultType(); 49261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff else { 49361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff for (ObjCMethodDecl::param_iterator PI = Setter->param_begin(), 49461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff E = Setter->param_end(); PI != E; ++PI) 49561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff PType = (*PI)->getType(); 49661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff } 49709105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian return Owned(new (Context) ObjCImplicitSetterGetterRefExpr( 4981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Getter, PType, Setter, 49961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff propertyNameLoc, IFace, receiverNameLoc)); 50061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff } 50161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff return ExprError(Diag(propertyNameLoc, diag::err_property_not_found) 50261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff << &propertyName << Context.getObjCInterfaceType(IFace)); 50361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff} 50461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 50547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas GregorSema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S, 50647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor IdentifierInfo *&Name, 50747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor SourceLocation NameLoc, 50847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor bool IsSuper, 50947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor bool HasTrailingDot) { 51047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // If the identifier is "super" and there is no trailing dot, we're 51147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // messaging super. 51247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor if (IsSuper && !HasTrailingDot && S->isInObjcMethodScope()) 51347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor return ObjCSuperMessage; 51447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 51547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor LookupResult Result(*this, Name, NameLoc, LookupOrdinaryName); 51647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor LookupName(Result, S); 51747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 51847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor switch (Result.getResultKind()) { 51947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::NotFound: 520ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor // Normal name lookup didn't find anything. If we're in an 521ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor // Objective-C method, look for ivars. If we find one, we're done! 522ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor // FIXME: This is a hack. Ivar lookup should be part of normal lookup. 523ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) { 524ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor ObjCInterfaceDecl *ClassDeclared; 525ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor if (Method->getClassInterface()->lookupInstanceVariable(Name, 526ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor ClassDeclared)) 527ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor return ObjCInstanceMessage; 528ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor } 529ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor 53047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // Break out; we'll perform typo correction below. 53147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor break; 53247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 53347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::NotFoundInCurrentInstantiation: 53447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::FoundOverloaded: 53547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::FoundUnresolvedValue: 53647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::Ambiguous: 53747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor Result.suppressDiagnostics(); 53847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor return ObjCInstanceMessage; 53947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 54047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor case LookupResult::Found: { 54147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // We found something. If it's a type, then we have a class 54247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // message. Otherwise, it's an instance message. 54347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor NamedDecl *ND = Result.getFoundDecl(); 54447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor if (isa<ObjCInterfaceDecl>(ND) || isa<TypeDecl>(ND) || 54547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor isa<UnresolvedUsingTypenameDecl>(ND)) 54647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor return ObjCClassMessage; 54747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 54847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor return ObjCInstanceMessage; 54947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor } 55047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor } 55147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 552aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor // Determine our typo-correction context. 553aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor CorrectTypoContext CTC = CTC_Expression; 554aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (ObjCMethodDecl *Method = getCurMethodDecl()) 555aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (Method->getClassInterface() && 556aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Method->getClassInterface()->getSuperClass()) 557aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor CTC = CTC_ObjCMessageReceiver; 558aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor 559aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (DeclarationName Corrected = CorrectTypo(Result, S, 0, 0, false, CTC)) { 560aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (Result.isSingleResult()) { 561aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor // If we found a declaration, correct when it refers to an Objective-C 562aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor // class. 563aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor NamedDecl *ND = Result.getFoundDecl(); 564aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor if (isa<ObjCInterfaceDecl>(ND)) { 565aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Diag(NameLoc, diag::err_unknown_receiver_suggest) 566aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << Name << Result.getLookupName() 567aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << FixItHint::CreateReplacement(SourceRange(NameLoc), 568aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor ND->getNameAsString()); 569aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Diag(ND->getLocation(), diag::note_previous_decl) 570aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << Corrected; 571aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor 572aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Name = ND->getIdentifier(); 573aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor return ObjCClassMessage; 574aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor } 575aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor } else if (Result.empty() && Corrected.getAsIdentifierInfo() && 576aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Corrected.getAsIdentifierInfo()->isStr("super")) { 577aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor // If we've found the keyword "super", this is a send to super. 57847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor Diag(NameLoc, diag::err_unknown_receiver_suggest) 579aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << Name << Corrected 580aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor << FixItHint::CreateReplacement(SourceRange(NameLoc), "super"); 581aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor Name = Corrected.getAsIdentifierInfo(); 582aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor return ObjCSuperMessage; 58347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor } 58447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor } 58547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor 58647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor // Fall back: let the parser try to parse it as an instance message. 58747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor return ObjCInstanceMessage; 58847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor} 58961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff 5902725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::ActOnSuperMessage(Scope *S, 5912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation SuperLoc, 5922725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Selector Sel, 5932725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation LBracLoc, 5942725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation SelectorLoc, 5952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation RBracLoc, 5962725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor MultiExprArg Args) { 5972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Determine whether we are inside a method or not. 5982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCMethodDecl *Method = getCurMethodDecl(); 599f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor if (!Method) { 600f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor Diag(SuperLoc, diag::err_invalid_receiver_to_message_super); 601f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor return ExprError(); 602f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor } 6032725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 604f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor ObjCInterfaceDecl *Class = Method->getClassInterface(); 605f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor if (!Class) { 606f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor Diag(SuperLoc, diag::error_no_super_class_message) 607f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor << Method->getDeclName(); 6082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 60915faee19fdb9017dd6d08a690427b18c3b062c2dChris Lattner } 6102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 611f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor ObjCInterfaceDecl *Super = Class->getSuperClass(); 6122725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!Super) { 613f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // The current class does not have a superclass. 614f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor Diag(SuperLoc, diag::error_no_super_class) << Class->getIdentifier(); 6152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 6162725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 6172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 618f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // We are in a method whose class has a superclass, so 'super' 619f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // is acting as a keyword. 620f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor if (Method->isInstanceMethod()) { 621f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // Since we are in an instance method, this is an instance 622f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // message to the superclass instance. 623f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor QualType SuperTy = Context.getObjCInterfaceType(Super); 624f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor SuperTy = Context.getObjCObjectPointerType(SuperTy); 625f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor return BuildInstanceMessage(ExprArg(*this), SuperTy, SuperLoc, 626f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor Sel, LBracLoc, SelectorLoc, RBracLoc, 627f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor move(Args)); 6282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 629f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor 630f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // Since we are in a class method, this is a class message to 631f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor // the superclass. 632f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor return BuildClassMessage(/*ReceiverTypeInfo=*/0, 633f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor Context.getObjCInterfaceType(Super), 634f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor SuperLoc, Sel, LBracLoc, SelectorLoc, 635f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor RBracLoc, move(Args)); 6362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 6372725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 6382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \brief Build an Objective-C class message expression. 6392725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// This routine takes care of both normal class messages and 6412725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// class messages to the superclass. 6422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param ReceiverTypeInfo Type source information that describes the 6442725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// receiver of this message. This may be NULL, in which case we are 6452725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// sending to the superclass and \p SuperLoc must be a valid source 6462725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// location. 6472725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 6482725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param ReceiverType The type of the object receiving the 6492725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// message. When \p ReceiverTypeInfo is non-NULL, this is the same 6502725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// type as that refers to. For a superclass send, this is the type of 6512725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// the superclass. 6522725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6532725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param SuperLoc The location of the "super" keyword in a 6542725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// superclass message. 6552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6562725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Sel The selector to which the message is being sent. 6572725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6582725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param LBracLoc The location of the opening square bracket ']'. 6592725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6602725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param SelectorLoc The location of the first identifier in the selector. 6612725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6622725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param RBrac The location of the closing square bracket ']'. 6632725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 6642725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Args The message arguments. 6652725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, 6662725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType ReceiverType, 6672725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation SuperLoc, 6682725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Selector Sel, 6692725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation LBracLoc, 6702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation SelectorLoc, 6712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation RBracLoc, 6722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor MultiExprArg ArgsIn) { 6732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor assert(!ReceiverType->isDependentType() && 6742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor "Dependent class messages not yet implemented"); 67515faee19fdb9017dd6d08a690427b18c3b062c2dChris Lattner 6762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation Loc = SuperLoc.isValid()? SuperLoc 6772725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor : ReceiverTypeInfo->getTypeLoc().getSourceRange().getBegin(); 6782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 6792725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the class to which we are sending this message. 6802725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCInterfaceDecl *Class = 0; 6812725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (const ObjCInterfaceType *ClassType 6822725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor = ReceiverType->getAs<ObjCInterfaceType>()) 6832725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Class = ClassType->getDecl(); 6842725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor else { 6852725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Diag(Loc, diag::err_invalid_receiver_class_message) 6862725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor << ReceiverType; 6872725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 6887c778f1c549a8ae95d50a819fd537df78da16426Steve Naroff } 6892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor assert(Class && "We don't know which class we're messaging?"); 6902725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 6912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Find the method we are messaging. 692cb28be6e82809f9f514585ac2692fa04bb56978aSteve Naroff ObjCMethodDecl *Method = 0; 6932725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Class->isForwardDecl()) { 6942725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // A forward class used in messaging is treated as a 'Class' 6952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Diag(Loc, diag::warn_receiver_forward_class) << Class->getDeclName(); 6962725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = LookupFactoryMethodInGlobalPool(Sel, 6972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceRange(LBracLoc, RBracLoc)); 69889bc314c6ddf3b851ccf68bc34d3f1b5927a10f6Fariborz Jahanian if (Method) 6991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Diag(Method->getLocation(), diag::note_method_sent_forward_class) 7009f8f026fc1cd1aa2942a2850a037398415128f8aFariborz Jahanian << Method->getDeclName(); 70189bc314c6ddf3b851ccf68bc34d3f1b5927a10f6Fariborz Jahanian } 70289bc314c6ddf3b851ccf68bc34d3f1b5927a10f6Fariborz Jahanian if (!Method) 7032725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = Class->lookupClassMethod(Sel); 7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7057c778f1c549a8ae95d50a819fd537df78da16426Steve Naroff // If we have an implementation in scope, check "private" methods. 706f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff if (!Method) 7072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = LookupPrivateClassMethod(Sel, Class); 7087c778f1c549a8ae95d50a819fd537df78da16426Steve Naroff 7092725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Method && DiagnoseUseOfDecl(Method, Loc)) 7102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 7111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7122725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Check the argument types and determine the result type. 7132725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType ReturnType; 7142725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor unsigned NumArgs = ArgsIn.size(); 7152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 7162725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CheckMessageArgumentTypes(Args, NumArgs, Sel, Method, true, 7172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LBracLoc, RBracLoc, ReturnType)) { 7182725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor for (unsigned I = 0; I != NumArgs; ++I) 7192725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Args[I]->Destroy(Context); 7202725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 7212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 7224df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek 7232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Construct the appropriate ObjCMessageExpr. 7242725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (SuperLoc.isValid()) 7252725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return Owned(ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, 7262725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SuperLoc, /*IsInstanceSuper=*/false, 7272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverType, Sel, Method, Args, 7282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NumArgs, RBracLoc)); 7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7302725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return Owned(ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, 7312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverTypeInfo, Sel, Method, Args, 7322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor NumArgs, RBracLoc)); 73385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 73485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner 7352725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// ActOnClassMessage - used for both unary and keyword messages. 73685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// ArgExprs is optional - if it is present, the number of expressions 73785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// is obtained from Sel.getNumArgs(). 7382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::ActOnClassMessage(Scope *S, 7392725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor TypeTy *Receiver, 7402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Selector Sel, 7412725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation LBracLoc, 7422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation SelectorLoc, 7432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation RBracLoc, 7442725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor MultiExprArg Args) { 7452725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor TypeSourceInfo *ReceiverTypeInfo; 7462725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType ReceiverType = GetTypeFromParser(Receiver, &ReceiverTypeInfo); 7472725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ReceiverType.isNull()) 7482725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7512725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!ReceiverTypeInfo) 7522725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType, LBracLoc); 7531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7542725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return BuildClassMessage(ReceiverTypeInfo, ReceiverType, 7552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor /*SuperLoc=*/SourceLocation(), Sel, 7562725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LBracLoc, SelectorLoc, RBracLoc, move(Args)); 7572725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 75887d3ef08d892df8264bd51adb6ddd4a22422cd29Steve Naroff 7592725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \brief Build an Objective-C instance message expression. 7602725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7612725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// This routine takes care of both normal instance messages and 7622725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// instance messages to the superclass instance. 7632725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7642725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Receiver The expression that computes the object that will 7652725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// receive this message. This may be empty, in which case we are 7662725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// sending to the superclass instance and \p SuperLoc must be a valid 7672725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// source location. 7682725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7692725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param ReceiverType The (static) type of the object receiving the 7702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// message. When a \p Receiver expression is provided, this is the 7712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// same type as that expression. For a superclass instance send, this 7722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// is a pointer to the type of the superclass. 7732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param SuperLoc The location of the "super" keyword in a 7752725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// superclass instance message. 7762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7772725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Sel The selector to which the message is being sent. 7782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7792725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param LBracLoc The location of the opening square bracket ']'. 7802725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7812725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param SelectorLoc The location of the first identifier in the selector. 7822725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7832725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param RBrac The location of the closing square bracket ']'. 7842725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// 7852725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Args The message arguments. 7862725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::BuildInstanceMessage(ExprArg ReceiverE, 7872725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType ReceiverType, 7882725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation SuperLoc, 7892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Selector Sel, 7902725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation LBracLoc, 7912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation SelectorLoc, 7922725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation RBracLoc, 7932725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor MultiExprArg ArgsIn) { 7942725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // If we have a receiver expression, perform appropriate promotions 7952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // and determine receiver type. 7962725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Expr *Receiver = ReceiverE.takeAs<Expr>(); 7972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Receiver) { 7982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // If necessary, apply function/array conversion to the receiver. 7992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // C99 6.7.5.3p[7,8]. 8002725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor DefaultFunctionArrayLvalueConversion(Receiver); 8012725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverType = Receiver->getType(); 8022725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } 80304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 8042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // The location of the receiver. 8052725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation Loc = SuperLoc.isValid()? SuperLoc : Receiver->getLocStart(); 8062725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 8072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ObjCMethodDecl *Method = 0; 8082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Handle messages to id. 8092725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ReceiverType->isObjCIdType() || ReceiverType->isBlockPointerType() || 8102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor (Receiver && Context.isObjCNSObjectType(Receiver->getType()))) { 8112725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = LookupInstanceMethodInGlobalPool(Sel, 8122725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceRange(LBracLoc, RBracLoc)); 8136e10a08fe0427ab34c463dd59d9c0997d4f72170Chris Lattner if (!Method) 8142725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = LookupFactoryMethodInGlobalPool(Sel, 8152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceRange(LBracLoc, RBracLoc)); 8162725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (ReceiverType->isObjCClassType() || 8172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverType->isObjCQualifiedClassType()) { 81804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // Handle messages to Class. 8196562fdad21432377f0cc5e0c627c28f0c85df4ddChris Lattner if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) { 820d526c2f2ef28643c15589135b59eb4a8d9f9414cSteve Naroff if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) { 821d526c2f2ef28643c15589135b59eb4a8d9f9414cSteve Naroff // First check the public methods in the class interface. 82217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Method = ClassDecl->lookupClassMethod(Sel); 8231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 824f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff if (!Method) 8255609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff Method = LookupPrivateClassMethod(Sel, ClassDecl); 8261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: if we still haven't found a method, we need to look in 828470301bac9c8abfc6b451b3b669c6695a9fd1518Steve Naroff // protocols (if we have qualifiers). 829d526c2f2ef28643c15589135b59eb4a8d9f9414cSteve Naroff } 8302725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Method && DiagnoseUseOfDecl(Method, Loc)) 8312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 832d526c2f2ef28643c15589135b59eb4a8d9f9414cSteve Naroff } 8336b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff if (!Method) { 8346b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff // If not messaging 'self', look for any factory method named 'Sel'. 8352725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!Receiver || !isSelfExpr(Receiver)) { 8362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = LookupFactoryMethodInGlobalPool(Sel, 8372725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceRange(LBracLoc, RBracLoc)); 838b1006c7f5647025541b1b1cc64a196a417e6c6acFariborz Jahanian if (!Method) { 839041f2fd6237c7ce72864e42c66c6b12b52f35f9cFariborz Jahanian // If no class (factory) method was found, check if an _instance_ 840041f2fd6237c7ce72864e42c66c6b12b52f35f9cFariborz Jahanian // method of the same name exists in the root class only. 8412725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = LookupInstanceMethodInGlobalPool(Sel, 8422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceRange(LBracLoc, RBracLoc)); 843041f2fd6237c7ce72864e42c66c6b12b52f35f9cFariborz Jahanian if (Method) 844041f2fd6237c7ce72864e42c66c6b12b52f35f9cFariborz Jahanian if (const ObjCInterfaceDecl *ID = 845041f2fd6237c7ce72864e42c66c6b12b52f35f9cFariborz Jahanian dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) { 846041f2fd6237c7ce72864e42c66c6b12b52f35f9cFariborz Jahanian if (ID->getSuperClass()) 8472725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Diag(Loc, diag::warn_root_inst_method_not_found) 8482725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor << Sel << SourceRange(LBracLoc, RBracLoc); 849041f2fd6237c7ce72864e42c66c6b12b52f35f9cFariborz Jahanian } 850b1006c7f5647025541b1b1cc64a196a417e6c6acFariborz Jahanian } 8516b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff } 8526b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff } 85304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } else { 85404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCInterfaceDecl* ClassDecl = 0; 8551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 85604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // We allow sending a message to a qualified ID ("id<foo>"), which is ok as 85704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // long as one of the protocols implements the selector (if not, warn). 8582725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (const ObjCObjectPointerType *QIdTy 8592725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor = ReceiverType->getAsObjCQualifiedIdType()) { 86004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // Search protocols for instance methods. 86104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor for (ObjCObjectPointerType::qual_iterator I = QIdTy->qual_begin(), 86204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor E = QIdTy->qual_end(); I != E; ++I) { 86304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ObjCProtocolDecl *PDecl = *I; 86404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (PDecl && (Method = PDecl->lookupInstanceMethod(Sel))) 86504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 86604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // Since we aren't supporting "Class<foo>", look for a class method. 86704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (PDecl && (Method = PDecl->lookupClassMethod(Sel))) 86885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner break; 86985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner } 8702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor } else if (const ObjCObjectPointerType *OCIType 8712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor = ReceiverType->getAsObjCInterfacePointerType()) { 87204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // We allow sending a message to a pointer to an interface (an object). 87304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor ClassDecl = OCIType->getInterfaceDecl(); 87404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // FIXME: consider using LookupInstanceMethodInGlobalPool, since it will be 87504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // faster than the following method (which can do *many* linear searches). 87604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // The idea is to add class info to InstanceMethodPool. 87704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Method = ClassDecl->lookupInstanceMethod(Sel); 87804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 87904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (!Method) { 88004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // Search protocol qualifiers. 88104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor for (ObjCObjectPointerType::qual_iterator QI = OCIType->qual_begin(), 88204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor E = OCIType->qual_end(); QI != E; ++QI) { 88304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if ((Method = (*QI)->lookupInstanceMethod(Sel))) 88404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 8856b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff } 886268bc8c1f3a27d2fbd73c3115e4d633d31422ca5Fariborz Jahanian } 88704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (!Method) { 88804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // If we have implementations in scope, check "private" methods. 88904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor Method = LookupPrivateInstanceMethod(Sel, ClassDecl); 89004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 8912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!Method && (!Receiver || !isSelfExpr(Receiver))) { 89204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // If we still haven't found a method, look in the global pool. This 89304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // behavior isn't very desirable, however we need it for GCC 89404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // compatibility. FIXME: should we deviate?? 89504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (OCIType->qual_empty()) { 8962725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Method = LookupInstanceMethodInGlobalPool(Sel, 8972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceRange(LBracLoc, RBracLoc)); 89804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor if (Method && !OCIType->getInterfaceDecl()->isForwardDecl()) 8992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Diag(Loc, diag::warn_maynot_respond) 90004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor << OCIType->getInterfaceDecl()->getIdentifier() << Sel; 90104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 90204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 90304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 9042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (Method && DiagnoseUseOfDecl(Method, Loc)) 9052725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 90604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } else if (!Context.getObjCIdType().isNull() && 9072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor (ReceiverType->isPointerType() || 9082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor (ReceiverType->isIntegerType() && 9092725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverType->isScalarType()))) { 91004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // Implicitly convert integers and pointers to 'id' but emit a warning. 9112725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Diag(Loc, diag::warn_bad_receiver_type) 9122725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor << ReceiverType 9132725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor << Receiver->getSourceRange(); 9142725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (ReceiverType->isPointerType()) 9152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ImpCastExprToType(Receiver, Context.getObjCIdType(), 9162725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor CastExpr::CK_BitCast); 91704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor else 9182725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ImpCastExprToType(Receiver, Context.getObjCIdType(), 91904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor CastExpr::CK_IntegralToPointer); 9202725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverType = Receiver->getType(); 92104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } else { 92204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor // Reject other random receiver types (e.g. structs). 9232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Diag(Loc, diag::err_bad_receiver_type) 9242725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor << ReceiverType << Receiver->getSourceRange(); 9252725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 92604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 927fe1a553256b46fad3c0a9e9967481bcf571339ecChris Lattner } 9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9292725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Check the message arguments. 9302725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor unsigned NumArgs = ArgsIn.size(); 9312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release()); 9322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor QualType ReturnType; 9332725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (CheckMessageArgumentTypes(Args, NumArgs, Sel, Method, false, 9342725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor LBracLoc, RBracLoc, ReturnType)) 9352725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 93604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 9372725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor // Construct the appropriate ObjCMessageExpr instance. 9382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (SuperLoc.isValid()) 9392725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return Owned(ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, 9402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SuperLoc, /*IsInstanceSuper=*/true, 9412725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ReceiverType, Sel, Method, 9422725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Args, NumArgs, RBracLoc)); 9432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 9442725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return Owned(ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, Receiver, 9452725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Sel, Method, Args, NumArgs, RBracLoc)); 9462725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor} 9472725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor 9482725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// ActOnInstanceMessage - used for both unary and keyword messages. 9492725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// ArgExprs is optional - if it is present, the number of expressions 9502725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// is obtained from Sel.getNumArgs(). 9512725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::ActOnInstanceMessage(Scope *S, 9522725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor ExprArg ReceiverE, 9532725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Selector Sel, 9542725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation LBracLoc, 9552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation SelectorLoc, 9562725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor SourceLocation RBracLoc, 9572725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor MultiExprArg Args) { 9582725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Expr *Receiver = static_cast<Expr *>(ReceiverE.get()); 9592725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor if (!Receiver) 9602725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return ExprError(); 96104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 9622725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor return BuildInstanceMessage(move(ReceiverE), Receiver->getType(), 9632725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor /*SuperLoc=*/SourceLocation(), 9642725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor Sel, LBracLoc, SelectorLoc, RBracLoc, 9652725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor move(Args)); 96685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner} 967eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner 968