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