SemaExprObjC.cpp revision c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44e
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"
16688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor#include "SemaInit.h"
1785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner#include "clang/AST/ASTContext.h"
1885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner#include "clang/AST/DeclObjC.h"
19f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroff#include "clang/AST/ExprObjC.h"
202725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor#include "clang/AST/TypeLoc.h"
2139c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner#include "llvm/ADT/SmallString.h"
2261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff#include "clang/Lex/Preprocessor.h"
2361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff
2485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattnerusing namespace clang;
2585a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner
261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs,
2739c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner                                              ExprTy **strings,
2885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                              unsigned NumStrings) {
2939c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner  StringLiteral **Strings = reinterpret_cast<StringLiteral**>(strings);
3039c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner
31f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner  // Most ObjC strings are formed out of a single piece.  However, we *can*
32f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner  // have strings formed out of multiple @ strings with multiple pptokens in
33f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner  // each one, e.g. @"foo" "bar" @"baz" "qux"   which need to be turned into one
34f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner  // StringLiteral for ObjCStringLiteral to hold onto.
3539c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner  StringLiteral *S = Strings[0];
361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner  // If we have a multi-part string, merge it all together.
38f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner  if (NumStrings != 1) {
3985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner    // Concatenate objc strings.
4039c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner    llvm::SmallString<128> StrBuf;
4139c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner    llvm::SmallVector<SourceLocation, 8> StrLocs;
421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner    for (unsigned i = 0; i != NumStrings; ++i) {
4439c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner      S = Strings[i];
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4639c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner      // ObjC strings can't be wide.
47f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner      if (S->isWide()) {
48f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner        Diag(S->getLocStart(), diag::err_cfstring_literal_not_string_constant)
49f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner          << S->getSourceRange();
50f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner        return true;
51f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner      }
521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5339c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner      // Get the string data.
5439c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner      StrBuf.append(S->getStrData(), S->getStrData()+S->getByteLength());
551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5639c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner      // Get the locations of the string tokens.
5739c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner      StrLocs.append(S->tokloc_begin(), S->tokloc_end());
581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5939c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner      // Free the temporary string.
608189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenek      S->Destroy(Context);
6185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner    }
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6339c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner    // Create the aggregate string with the appropriate content and location
6439c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner    // information.
6539c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner    S = StringLiteral::Create(Context, &StrBuf[0], StrBuf.size(), false,
662085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner                              Context.getPointerType(Context.CharTy),
6739c28bbbf235533e9ae7d06fb9b13371dfcc542dChris Lattner                              &StrLocs[0], StrLocs.size());
6885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner  }
691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner  // Verify that this composite string is acceptable for ObjC strings.
71690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner  if (CheckObjCString(S))
7285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner    return true;
73a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner
74a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner  // Initialize the constant string interface lazily. This assumes
75d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff  // the NSString interface is seen in this translation unit. Note: We
76d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff  // don't use NSConstantString, since the runtime team considers this
77d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff  // interface private (even though it appears in the header files).
78a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner  QualType Ty = Context.getObjCConstantStringInterface();
79a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner  if (!Ty.isNull()) {
8014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    Ty = Context.getObjCObjectPointerType(Ty);
818a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian  } else if (getLangOptions().NoConstantCFStrings) {
828a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian    IdentifierInfo *NSIdent = &Context.Idents.get("NSConstantString");
838a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian    NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLocs[0],
848a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian                                     LookupOrdinaryName);
858a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian    if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) {
868a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian      Context.setObjCConstantStringInterface(StrIF);
878a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian      Ty = Context.getObjCConstantStringInterface();
888a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian      Ty = Context.getObjCObjectPointerType(Ty);
898a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian    } else {
908a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian      // If there is no NSConstantString interface defined then treat this
918a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian      // as error and recover from it.
928a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian      Diag(S->getLocStart(), diag::err_no_nsconstant_string_class) << NSIdent
938a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian        << S->getSourceRange();
948a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian      Ty = Context.getObjCIdType();
958a4377697161c5087e27cc40d6e0682f0cd1fa20Fariborz Jahanian    }
9613fd7e5111032f54b538dd66d035b0ccc1f82467Chris Lattner  } else {
97d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff    IdentifierInfo *NSIdent = &Context.Idents.get("NSString");
98c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor    NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLocs[0],
99c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor                                     LookupOrdinaryName);
100a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner    if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) {
101a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner      Context.setObjCConstantStringInterface(StrIF);
102a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner      Ty = Context.getObjCConstantStringInterface();
10314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      Ty = Context.getObjCObjectPointerType(Ty);
104a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner    } else {
105d9fd7647e286723d100db4cfeab31ec022eec629Steve Naroff      // If there is no NSString interface defined then treat constant
106a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner      // strings as untyped objects and let the runtime figure it out later.
107a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner      Ty = Context.getObjCIdType();
108a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner    }
10913fd7e5111032f54b538dd66d035b0ccc1f82467Chris Lattner  }
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
111f4b136fb40aeedeaaa6ce7cdff22f375eb76c47bChris Lattner  return new (Context) ObjCStringLiteral(S, Ty, AtLocs[0]);
11285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner}
11385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpExpr *Sema::BuildObjCEncodeExpression(SourceLocation AtLoc,
11581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                      TypeSourceInfo *EncodedTypeInfo,
116fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson                                      SourceLocation RParenLoc) {
11781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  QualType EncodedType = EncodedTypeInfo->getType();
118fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson  QualType StrTy;
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (EncodedType->isDependentType())
120fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson    StrTy = Context.DependentTy;
121fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson  else {
122fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson    std::string Str;
123fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson    Context.getObjCEncodingForType(EncodedType, Str);
124fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson
125fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson    // The type of @encode is the same as the type of the corresponding string,
126fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson    // which is an array type.
127fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson    StrTy = Context.CharTy;
128fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson    // A C++ string literal has a const-qualified element type (C++ 2.13.4p1).
1294b7a834e0fecddd9eaf1f4567867c718e4eebf50John McCall    if (getLangOptions().CPlusPlus || getLangOptions().ConstStrings)
130fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson      StrTy.addConst();
131fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson    StrTy = Context.getConstantArrayType(StrTy, llvm::APInt(32, Str.size()+1),
132fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson                                         ArrayType::Normal, 0);
133fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson  }
1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  return new (Context) ObjCEncodeExpr(StrTy, EncodedTypeInfo, AtLoc, RParenLoc);
136fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson}
137fc0f021b492cf28ee7b3a6bd4445ae569e6f15deAnders Carlsson
13885a932e26f3c3faae6bad639a6d32e92794dfda9Chris LattnerSema::ExprResult Sema::ParseObjCEncodeExpression(SourceLocation AtLoc,
13985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                 SourceLocation EncodeLoc,
14085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                 SourceLocation LParenLoc,
141a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner                                                 TypeTy *ty,
14285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                 SourceLocation RParenLoc) {
143e8661906d49ef6c9694a9cc845ca62a85dbc016dArgyrios Kyrtzidis  // FIXME: Preserve type source info ?
14481d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  TypeSourceInfo *TInfo;
14581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  QualType EncodedType = GetTypeFromParser(ty, &TInfo);
14681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  if (!TInfo)
14781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    TInfo = Context.getTrivialTypeSourceInfo(EncodedType,
14881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                             PP.getLocForEndOfToken(LParenLoc));
14985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner
15081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  return BuildObjCEncodeExpression(AtLoc, TInfo, RParenLoc);
15185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner}
15285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner
15385a932e26f3c3faae6bad639a6d32e92794dfda9Chris LattnerSema::ExprResult Sema::ParseObjCSelectorExpression(Selector Sel,
15485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                   SourceLocation AtLoc,
15585a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                   SourceLocation SelLoc,
15685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                   SourceLocation LParenLoc,
15785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                   SourceLocation RParenLoc) {
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel,
159835ed7f15bd8a89226fd7976d96be19995f1c1c8Fariborz Jahanian                             SourceRange(LParenLoc, RParenLoc), false);
1607ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian  if (!Method)
1617ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian    Method = LookupFactoryMethodInGlobalPool(Sel,
1627ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian                                          SourceRange(LParenLoc, RParenLoc));
1637ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian  if (!Method)
1647ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian    Diag(SelLoc, diag::warn_undeclared_selector) << Sel;
1657ff22ded2221f442b1f8ff78172938d04ec8c926Fariborz Jahanian
166a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner  QualType Ty = Context.getObjCSelType();
1676d5a1c28593443f3973ef38f8fa042d59182412dDaniel Dunbar  return new (Context) ObjCSelectorExpr(Ty, Sel, AtLoc, RParenLoc);
16885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner}
16985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner
17085a932e26f3c3faae6bad639a6d32e92794dfda9Chris LattnerSema::ExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId,
17185a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                   SourceLocation AtLoc,
17285a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                   SourceLocation ProtoLoc,
17385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                   SourceLocation LParenLoc,
17485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner                                                   SourceLocation RParenLoc) {
175c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor  ObjCProtocolDecl* PDecl = LookupProtocol(ProtocolId, ProtoLoc);
17685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner  if (!PDecl) {
1773c73c41cefcfe76f36b7bed72c9f1ec195490951Chris Lattner    Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId;
17885a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner    return true;
17985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner  }
1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
181a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner  QualType Ty = Context.getObjCProtoType();
182a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner  if (Ty.isNull())
18385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner    return true;
18414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  Ty = Context.getObjCObjectPointerType(Ty);
185a0af1fe67da29343cd182c51cd48d91b740ecef2Chris Lattner  return new (Context) ObjCProtocolExpr(Ty, PDecl, AtLoc, RParenLoc);
18685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner}
18785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Sema::CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs,
1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     Selector Sel, ObjCMethodDecl *Method,
190077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner                                     bool isClassMessage,
191637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar                                     SourceLocation lbrac, SourceLocation rbrac,
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     QualType &ReturnType) {
193637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar  if (!Method) {
1946660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar    // Apply default argument promotion as for (C99 6.5.2.2p6).
19592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    for (unsigned i = 0; i != NumArgs; i++) {
19692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      if (Args[i]->isTypeDependent())
19792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        continue;
19892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
1996660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar      DefaultArgumentPromotion(Args[i]);
20092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    }
2016660c8a4cc2115929d92be83bbc54c307002a321Daniel Dunbar
202077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    unsigned DiagID = isClassMessage ? diag::warn_class_method_not_found :
203077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner                                       diag::warn_inst_method_not_found;
204077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    Diag(lbrac, DiagID)
205077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner      << Sel << isClassMessage << SourceRange(lbrac, rbrac);
206637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar    ReturnType = Context.getObjCIdType();
207637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar    return false;
208637cebb67c59765e1412c589550c8c9ba001baebDaniel Dunbar  }
2091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  ReturnType = Method->getResultType().getNonReferenceType();
2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21291e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar  unsigned NumNamedArgs = Sel.getNumArgs();
2134f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian  // Method might have more arguments than selector indicates. This is due
2144f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian  // to addition of c-style arguments in method.
2154f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian  if (Method->param_size() > Sel.getNumArgs())
2164f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian    NumNamedArgs = Method->param_size();
2174f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian  // FIXME. This need be cleaned up.
2184f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian  if (NumArgs < NumNamedArgs) {
219d77b9a29651d748f0e30a8dad8969635fc04f725Eric Christopher    Diag(lbrac, diag::err_typecheck_call_too_few_args) << 2
220d77b9a29651d748f0e30a8dad8969635fc04f725Eric Christopher    << NumNamedArgs << NumArgs;
2214f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian    return false;
2224f4fd92c6c64ecbc65507f63ddd09211f732622cFariborz Jahanian  }
22391e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar
224312531a8cd69c562d5687bd69fd334be99d87320Chris Lattner  bool IsError = false;
22591e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar  for (unsigned i = 0; i < NumNamedArgs; i++) {
22692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // We can't do any type-checking on a type-dependent argument.
22792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Args[i]->isTypeDependent())
22892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      continue;
22992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
23085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner    Expr *argExpr = Args[i];
23192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
232688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor    ParmVarDecl *Param = Method->param_begin()[i];
23385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner    assert(argExpr && "CheckMessageArgumentTypes(): missing expression");
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
235688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor    if (RequireCompleteType(argExpr->getSourceRange().getBegin(),
236688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor                            Param->getType(),
237688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor                            PDiag(diag::err_call_incomplete_argument)
238688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor                              << argExpr->getSourceRange()))
239688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor      return true;
240688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor
241688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor    InitializedEntity Entity = InitializedEntity::InitializeParameter(Param);
242688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor    OwningExprResult ArgE = PerformCopyInitialization(Entity,
243688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor                                                      SourceLocation(),
244688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor                                                      Owned(argExpr->Retain()));
245688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor    if (ArgE.isInvalid())
246688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor      IsError = true;
247688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor    else
248688fc9b9b4323a294f5bf4f8a83f7c365edec573Douglas Gregor      Args[i] = ArgE.takeAs<Expr>();
24985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner  }
25091e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar
25191e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar  // Promote additional arguments to variadic methods.
25291e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar  if (Method->isVariadic()) {
25392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    for (unsigned i = NumNamedArgs; i < NumArgs; ++i) {
25492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      if (Args[i]->isTypeDependent())
25592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        continue;
25692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
257312531a8cd69c562d5687bd69fd334be99d87320Chris Lattner      IsError |= DefaultVariadicArgumentPromotion(Args[i], VariadicMethod);
25892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    }
25991e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar  } else {
26091e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar    // Check for extra arguments to non-variadic methods.
26191e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar    if (NumArgs != NumNamedArgs) {
2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Diag(Args[NumNamedArgs]->getLocStart(),
263fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner           diag::err_typecheck_call_too_many_args)
264ccfa9639f8d09733bcf1c2572c5bd3daba5bd632Eric Christopher        << 2 /*method*/ << NumNamedArgs << NumArgs
265ccfa9639f8d09733bcf1c2572c5bd3daba5bd632Eric Christopher        << Method->getSourceRange()
266fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner        << SourceRange(Args[NumNamedArgs]->getLocStart(),
267fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner                       Args[NumArgs-1]->getLocEnd());
26891e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar    }
26991e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar  }
27091e19b2029447e75d2c7730ff888cc396874685bDaniel Dunbar
2712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  DiagnoseSentinelCalls(Method, lbrac, Args, NumArgs);
272312531a8cd69c562d5687bd69fd334be99d87320Chris Lattner  return IsError;
27385a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner}
27485a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner
2756b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroffbool Sema::isSelfExpr(Expr *RExpr) {
2766b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(RExpr))
2776b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff    if (DRE->getDecl()->getIdentifier() == &Context.Idents.get("self"))
2786b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff      return true;
2796b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff  return false;
2806b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff}
2816b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff
282f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff// Helper method for ActOnClassMethod/ActOnInstanceMethod.
283f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff// Will search "local" class/category implementations for a method decl.
284175ba1e8180083927aabd7cc8137baa16be75646Fariborz Jahanian// If failed, then we search in class's root for an instance method.
285f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff// Returns 0 if no method is found.
2865609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve NaroffObjCMethodDecl *Sema::LookupPrivateClassMethod(Selector Sel,
287f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff                                          ObjCInterfaceDecl *ClassDecl) {
288f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff  ObjCMethodDecl *Method = 0;
2895609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff  // lookup in class and all superclasses
2905609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff  while (ClassDecl && !Method) {
29187018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis    if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
29217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      Method = ImpDecl->getClassMethod(Sel);
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2945609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff    // Look through local category implementations associated with the class.
2951cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis    if (!Method)
2961cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis      Method = ClassDecl->getCategoryClassMethod(Sel);
2971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2985609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff    // Before we give up, check if the selector is an instance method.
2995609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff    // But only in the root. This matches gcc's behaviour and what the
3005609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff    // runtime expects.
3015609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff    if (!Method && !ClassDecl->getSuperClass()) {
30217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      Method = ClassDecl->lookupInstanceMethod(Sel);
3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // Look through local category implementations associated
3045609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff      // with the root class.
3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (!Method)
3065609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff        Method = LookupPrivateInstanceMethod(Sel, ClassDecl);
307f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff    }
3081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3095609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff    ClassDecl = ClassDecl->getSuperClass();
310f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff  }
3115609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff  return Method;
3125609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff}
3135609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff
3145609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve NaroffObjCMethodDecl *Sema::LookupPrivateInstanceMethod(Selector Sel,
3155609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff                                              ObjCInterfaceDecl *ClassDecl) {
3165609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff  ObjCMethodDecl *Method = 0;
3175609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff  while (ClassDecl && !Method) {
3185609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff    // If we have implementations in scope, check "private" methods.
31987018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis    if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
32017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      Method = ImpDecl->getInstanceMethod(Sel);
3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3225609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff    // Look through local category implementations associated with the class.
3231cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis    if (!Method)
3241cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis      Method = ClassDecl->getCategoryInstanceMethod(Sel);
3255609ec04ed9a4fd58c3203d210cf32e9283feb5eSteve Naroff    ClassDecl = ClassDecl->getSuperClass();
326175ba1e8180083927aabd7cc8137baa16be75646Fariborz Jahanian  }
327f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff  return Method;
328f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff}
329f1afaf6fe2d94ab265299853f288b676694f7554Steve Naroff
3307f81652f97a69ae8b514893a69c0245253687e55Chris Lattner/// HandleExprPropertyRefExpr - Handle foo.bar where foo is a pointer to an
3317f81652f97a69ae8b514893a69c0245253687e55Chris Lattner/// objective C interface.  This is a property reference expression.
3327f81652f97a69ae8b514893a69c0245253687e55Chris LattnerAction::OwningExprResult Sema::
3337f81652f97a69ae8b514893a69c0245253687e55Chris LattnerHandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
334b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner                          Expr *BaseExpr, DeclarationName MemberName,
335b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner                          SourceLocation MemberLoc) {
3367f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  const ObjCInterfaceType *IFaceT = OPT->getInterfaceType();
3377f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  ObjCInterfaceDecl *IFace = IFaceT->getDecl();
3387f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
3397f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
3407f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // Search for a declared property first.
3417f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(Member)) {
3427f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    // Check whether we can reference this property.
3437f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    if (DiagnoseUseOfDecl(PD, MemberLoc))
3447f81652f97a69ae8b514893a69c0245253687e55Chris Lattner      return ExprError();
3457f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    QualType ResTy = PD->getType();
3467f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    Selector Sel = PP.getSelectorTable().getNullarySelector(Member);
3477f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel);
3487f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    if (DiagnosePropertyAccessorMismatch(PD, Getter, MemberLoc))
3497f81652f97a69ae8b514893a69c0245253687e55Chris Lattner      ResTy = Getter->getResultType();
3507f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy,
3517f81652f97a69ae8b514893a69c0245253687e55Chris Lattner                                                   MemberLoc, BaseExpr));
3527f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  }
3537f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // Check protocols on qualified interfaces.
3547f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
3557f81652f97a69ae8b514893a69c0245253687e55Chris Lattner       E = OPT->qual_end(); I != E; ++I)
3567f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(Member)) {
3577f81652f97a69ae8b514893a69c0245253687e55Chris Lattner      // Check whether we can reference this property.
3587f81652f97a69ae8b514893a69c0245253687e55Chris Lattner      if (DiagnoseUseOfDecl(PD, MemberLoc))
3597f81652f97a69ae8b514893a69c0245253687e55Chris Lattner        return ExprError();
3607f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
3617f81652f97a69ae8b514893a69c0245253687e55Chris Lattner      return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(),
3627f81652f97a69ae8b514893a69c0245253687e55Chris Lattner                                                     MemberLoc, BaseExpr));
3637f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    }
3647f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // If that failed, look for an "implicit" property by seeing if the nullary
3657f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // selector is implemented.
3667f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
3677f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // FIXME: The logic for looking up nullary and unary selectors should be
3687f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // shared with the code in ActOnInstanceMessage.
3697f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
3707f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  Selector Sel = PP.getSelectorTable().getNullarySelector(Member);
3717f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel);
3727f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
3737f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // If this reference is in an @implementation, check for 'private' methods.
3747f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  if (!Getter)
3757f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    Getter = IFace->lookupPrivateInstanceMethod(Sel);
3767f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
3777f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // Look through local category implementations associated with the class.
3787f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  if (!Getter)
3797f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    Getter = IFace->getCategoryInstanceMethod(Sel);
3807f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  if (Getter) {
3817f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    // Check if we can reference this property.
3827f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    if (DiagnoseUseOfDecl(Getter, MemberLoc))
3837f81652f97a69ae8b514893a69c0245253687e55Chris Lattner      return ExprError();
3847f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  }
3857f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // If we found a getter then this may be a valid dot-reference, we
3867f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // will look for the matching setter, in case it is needed.
3877f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  Selector SetterSel =
3887f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    SelectorTable::constructSetterName(PP.getIdentifierTable(),
3897f81652f97a69ae8b514893a69c0245253687e55Chris Lattner                                       PP.getSelectorTable(), Member);
3907f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  ObjCMethodDecl *Setter = IFace->lookupInstanceMethod(SetterSel);
3917f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  if (!Setter) {
3927f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    // If this reference is in an @implementation, also check for 'private'
3937f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    // methods.
3947f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    Setter = IFace->lookupPrivateInstanceMethod(SetterSel);
3957f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  }
3967f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // Look through local category implementations associated with the class.
3977f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  if (!Setter)
3987f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    Setter = IFace->getCategoryInstanceMethod(SetterSel);
3997f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
4007f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  if (Setter && DiagnoseUseOfDecl(Setter, MemberLoc))
4017f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    return ExprError();
4027f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
4037f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  if (Getter) {
4047f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    QualType PType;
4057f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    PType = Getter->getResultType();
4067f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    return Owned(new (Context) ObjCImplicitSetterGetterRefExpr(Getter, PType,
4077f81652f97a69ae8b514893a69c0245253687e55Chris Lattner                                    Setter, MemberLoc, BaseExpr));
4087f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  }
4097f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
4107f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  // Attempt to correct for typos in property names.
4117f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  LookupResult Res(*this, MemberName, MemberLoc, LookupOrdinaryName);
412aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor  if (CorrectTypo(Res, 0, 0, IFace, false, CTC_NoKeywords, OPT) &&
4137f81652f97a69ae8b514893a69c0245253687e55Chris Lattner      Res.getAsSingle<ObjCPropertyDecl>()) {
414b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner    DeclarationName TypoResult = Res.getLookupName();
4157f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    Diag(MemberLoc, diag::err_property_not_found_suggest)
416b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner      << MemberName << QualType(OPT, 0) << TypoResult
417b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner      << FixItHint::CreateReplacement(MemberLoc, TypoResult.getAsString());
4187f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    ObjCPropertyDecl *Property = Res.getAsSingle<ObjCPropertyDecl>();
4197f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    Diag(Property->getLocation(), diag::note_previous_decl)
4207f81652f97a69ae8b514893a69c0245253687e55Chris Lattner      << Property->getDeclName();
421b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner    return HandleExprPropertyRefExpr(OPT, BaseExpr, TypoResult, MemberLoc);
4227f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  }
423b9d4fc1f54924a7b242fb763192a40c19fa6103dChris Lattner
4247f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  Diag(MemberLoc, diag::err_property_not_found)
4257f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    << MemberName << QualType(OPT, 0);
4267f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  if (Setter && !Getter)
4277f81652f97a69ae8b514893a69c0245253687e55Chris Lattner    Diag(Setter->getLocation(), diag::note_getter_unavailable)
4287f81652f97a69ae8b514893a69c0245253687e55Chris Lattner      << MemberName << BaseExpr->getSourceRange();
4297f81652f97a69ae8b514893a69c0245253687e55Chris Lattner  return ExprError();
4307f81652f97a69ae8b514893a69c0245253687e55Chris Lattner}
4317f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
4327f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
4337f81652f97a69ae8b514893a69c0245253687e55Chris Lattner
434eb483eb3ee80300f15d6d13573d82493c2194461Chris LattnerAction::OwningExprResult Sema::
435eb483eb3ee80300f15d6d13573d82493c2194461Chris LattnerActOnClassPropertyRefExpr(IdentifierInfo &receiverName,
436eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner                          IdentifierInfo &propertyName,
437eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner                          SourceLocation receiverNameLoc,
438eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner                          SourceLocation propertyNameLoc) {
4391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
440f06cdae9c68dfc4191fbf6b9e5ea0fd748488d88Douglas Gregor  IdentifierInfo *receiverNamePtr = &receiverName;
441c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor  ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(receiverNamePtr,
442c83c6874e3bf1432d3df5e8d3530f8561ff5441fDouglas Gregor                                                  receiverNameLoc);
443eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner  if (IFace == 0) {
444eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner    // If the "receiver" is 'super' in a method, handle it as an expression-like
445eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner    // property reference.
446eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner    if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
447eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner      if (receiverNamePtr->isStr("super")) {
448eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner        if (CurMethod->isInstanceMethod()) {
449eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner          QualType T =
450eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner            Context.getObjCInterfaceType(CurMethod->getClassInterface());
451eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner          T = Context.getObjCObjectPointerType(T);
452eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner          Expr *SuperExpr = new (Context) ObjCSuperExpr(receiverNameLoc, T);
453eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner
454eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner          return HandleExprPropertyRefExpr(T->getAsObjCInterfacePointerType(),
455eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner                                           SuperExpr, &propertyName,
456eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner                                           propertyNameLoc);
457eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner        }
458eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner
459eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner        // Otherwise, if this is a class method, try dispatching to our
460eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner        // superclass.
461eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner        IFace = CurMethod->getClassInterface()->getSuperClass();
462eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner      }
463eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner
464eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner    if (IFace == 0) {
465eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner      Diag(receiverNameLoc, diag::err_expected_ident_or_lparen);
466eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner      return ExprError();
467eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner    }
4688149a5786def747af783a9e3c22714bb7ab42b9cFariborz Jahanian  }
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
470eb483eb3ee80300f15d6d13573d82493c2194461Chris Lattner  // Search for a declared property first.
47161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName);
47217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel);
47361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff
47461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  // If this reference is in an @implementation, check for 'private' methods.
47561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  if (!Getter)
47661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    if (ObjCMethodDecl *CurMeth = getCurMethodDecl())
47761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff      if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface())
47887018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis        if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
47917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis          Getter = ImpDecl->getClassMethod(Sel);
48061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff
48161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  if (Getter) {
48261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    // FIXME: refactor/share with ActOnMemberReference().
48361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    // Check if we can reference this property.
48461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    if (DiagnoseUseOfDecl(Getter, propertyNameLoc))
48561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff      return ExprError();
48661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  }
4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  // Look for the matching setter, in case it is needed.
4891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Selector SetterSel =
4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SelectorTable::constructSetterName(PP.getIdentifierTable(),
491fdc92b7877535e6264fe43cfbdc8f01e9b224f81Steve Naroff                                       PP.getSelectorTable(), &propertyName);
4921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel);
49461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  if (!Setter) {
49561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    // If this reference is in an @implementation, also check for 'private'
49661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    // methods.
49761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    if (ObjCMethodDecl *CurMeth = getCurMethodDecl())
49861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff      if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface())
49987018775ed689d0a67357cf767747166044b3a27Argyrios Kyrtzidis        if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
50017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis          Setter = ImpDecl->getClassMethod(SetterSel);
50161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  }
50261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  // Look through local category implementations associated with the class.
5031cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis  if (!Setter)
5041cb35dd4840d21cec58648361180d5688446a9caArgyrios Kyrtzidis    Setter = IFace->getCategoryClassMethod(SetterSel);
50561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff
50661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  if (Setter && DiagnoseUseOfDecl(Setter, propertyNameLoc))
50761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    return ExprError();
50861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff
50961f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  if (Getter || Setter) {
51061f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    QualType PType;
51161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff
51261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    if (Getter)
51361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff      PType = Getter->getResultType();
51461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    else {
51561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff      for (ObjCMethodDecl::param_iterator PI = Setter->param_begin(),
51661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff           E = Setter->param_end(); PI != E; ++PI)
51761f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff        PType = (*PI)->getType();
51861f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff    }
51909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian    return Owned(new (Context) ObjCImplicitSetterGetterRefExpr(
5201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  Getter, PType, Setter,
52161f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff                                  propertyNameLoc, IFace, receiverNameLoc));
52261f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  }
52361f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff  return ExprError(Diag(propertyNameLoc, diag::err_property_not_found)
52461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff                     << &propertyName << Context.getObjCInterfaceType(IFace));
52561f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff}
52661f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff
52747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas GregorSema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S,
5281569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor                                               IdentifierInfo *Name,
52947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor                                               SourceLocation NameLoc,
53047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor                                               bool IsSuper,
5311569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor                                               bool HasTrailingDot,
5321569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor                                               TypeTy *&ReceiverType) {
5331569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor  ReceiverType = 0;
5341569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor
53547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  // If the identifier is "super" and there is no trailing dot, we're
53647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  // messaging super.
53747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  if (IsSuper && !HasTrailingDot && S->isInObjcMethodScope())
53847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor    return ObjCSuperMessage;
53947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor
54047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  LookupResult Result(*this, Name, NameLoc, LookupOrdinaryName);
54147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  LookupName(Result, S);
54247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor
54347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  switch (Result.getResultKind()) {
54447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  case LookupResult::NotFound:
545ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor    // Normal name lookup didn't find anything. If we're in an
546ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor    // Objective-C method, look for ivars. If we find one, we're done!
547ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor    // FIXME: This is a hack. Ivar lookup should be part of normal lookup.
548ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor    if (ObjCMethodDecl *Method = getCurMethodDecl()) {
549ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor      ObjCInterfaceDecl *ClassDeclared;
550ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor      if (Method->getClassInterface()->lookupInstanceVariable(Name,
551ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor                                                              ClassDeclared))
552ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor        return ObjCInstanceMessage;
553ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor    }
554ed46442adea496dfb01dbbe53ace583d5614e79aDouglas Gregor
55547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor    // Break out; we'll perform typo correction below.
55647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor    break;
55747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor
55847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  case LookupResult::NotFoundInCurrentInstantiation:
55947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  case LookupResult::FoundOverloaded:
56047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  case LookupResult::FoundUnresolvedValue:
56147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  case LookupResult::Ambiguous:
56247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor    Result.suppressDiagnostics();
56347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor    return ObjCInstanceMessage;
56447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor
56547bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  case LookupResult::Found: {
56647bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor    // We found something. If it's a type, then we have a class
56747bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor    // message. Otherwise, it's an instance message.
56847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor    NamedDecl *ND = Result.getFoundDecl();
5691569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor    QualType T;
5701569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor    if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND))
5711569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor      T = Context.getObjCInterfaceType(Class);
5721569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor    else if (TypeDecl *Type = dyn_cast<TypeDecl>(ND))
5731569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor      T = Context.getTypeDeclType(Type);
5741569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor    else
5751569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor      return ObjCInstanceMessage;
5761569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor
5771569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor    //  We have a class message, and T is the type we're
5781569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor    //  messaging. Build source-location information for it.
5791569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor    TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc);
5801569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor    ReceiverType = CreateLocInfoType(T, TSInfo).getAsOpaquePtr();
5811569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor    return ObjCClassMessage;
58247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  }
58347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  }
58447bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor
585aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor  // Determine our typo-correction context.
586aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor  CorrectTypoContext CTC = CTC_Expression;
587aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor  if (ObjCMethodDecl *Method = getCurMethodDecl())
588aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor    if (Method->getClassInterface() &&
589aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor        Method->getClassInterface()->getSuperClass())
590aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor      CTC = CTC_ObjCMessageReceiver;
591aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor
592aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor  if (DeclarationName Corrected = CorrectTypo(Result, S, 0, 0, false, CTC)) {
593aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor    if (Result.isSingleResult()) {
594aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor      // If we found a declaration, correct when it refers to an Objective-C
595aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor      // class.
596aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor      NamedDecl *ND = Result.getFoundDecl();
5971569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor      if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND)) {
598aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor        Diag(NameLoc, diag::err_unknown_receiver_suggest)
599aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor          << Name << Result.getLookupName()
600aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor          << FixItHint::CreateReplacement(SourceRange(NameLoc),
601aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor                                          ND->getNameAsString());
602aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor        Diag(ND->getLocation(), diag::note_previous_decl)
603aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor          << Corrected;
604aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor
6051569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor        QualType T = Context.getObjCInterfaceType(Class);
6061569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor        TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc);
6071569f95831a8c99e9f664137bf8f40e47ee3d90fDouglas Gregor        ReceiverType = CreateLocInfoType(T, TSInfo).getAsOpaquePtr();
608aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor        return ObjCClassMessage;
609aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor      }
610aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor    } else if (Result.empty() && Corrected.getAsIdentifierInfo() &&
611aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor               Corrected.getAsIdentifierInfo()->isStr("super")) {
612aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor      // If we've found the keyword "super", this is a send to super.
61347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor      Diag(NameLoc, diag::err_unknown_receiver_suggest)
614aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor        << Name << Corrected
615aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor        << FixItHint::CreateReplacement(SourceRange(NameLoc), "super");
616aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor      Name = Corrected.getAsIdentifierInfo();
617aaf87162c5fbfbf320072da3a8e83392e1bbf041Douglas Gregor      return ObjCSuperMessage;
61847bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor    }
61947bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  }
62047bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor
62147bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  // Fall back: let the parser try to parse it as an instance message.
62247bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor  return ObjCInstanceMessage;
62347bd54392a4fd0f10e04de6a0420fd4838caaa0eDouglas Gregor}
62461f72cbd037e58f12cfe90cd442373f44092f030Steve Naroff
6252725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::ActOnSuperMessage(Scope *S,
6262725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation SuperLoc,
6272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               Selector Sel,
6282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation LBracLoc,
6292725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation SelectorLoc,
6302725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation RBracLoc,
6312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               MultiExprArg Args) {
6322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // Determine whether we are inside a method or not.
6332725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  ObjCMethodDecl *Method = getCurMethodDecl();
634f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  if (!Method) {
635f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    Diag(SuperLoc, diag::err_invalid_receiver_to_message_super);
636f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    return ExprError();
637f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  }
6382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
639f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  ObjCInterfaceDecl *Class = Method->getClassInterface();
640f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  if (!Class) {
641f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    Diag(SuperLoc, diag::error_no_super_class_message)
642f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor      << Method->getDeclName();
6432725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    return ExprError();
64415faee19fdb9017dd6d08a690427b18c3b062c2dChris Lattner  }
6452725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
646f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  ObjCInterfaceDecl *Super = Class->getSuperClass();
6472725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  if (!Super) {
648f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    // The current class does not have a superclass.
649f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    Diag(SuperLoc, diag::error_no_super_class) << Class->getIdentifier();
6502725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    return ExprError();
6512725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  }
6522725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
653f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  // We are in a method whose class has a superclass, so 'super'
654f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  // is acting as a keyword.
655f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  if (Method->isInstanceMethod()) {
656f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    // Since we are in an instance method, this is an instance
657f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    // message to the superclass instance.
658f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    QualType SuperTy = Context.getObjCInterfaceType(Super);
659f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    SuperTy = Context.getObjCObjectPointerType(SuperTy);
660f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor    return BuildInstanceMessage(ExprArg(*this), SuperTy, SuperLoc,
661f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                Sel, /*Method=*/0, LBracLoc, RBracLoc,
662f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                move(Args));
6632725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  }
664f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor
665f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  // Since we are in a class method, this is a class message to
666f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  // the superclass.
667f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor  return BuildClassMessage(/*ReceiverTypeInfo=*/0,
668f95861a4ab6bbd6a975ed079dd70eb1cc22f4467Douglas Gregor                           Context.getObjCInterfaceType(Super),
669f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                           SuperLoc, Sel, /*Method=*/0, LBracLoc, RBracLoc,
670f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                           move(Args));
6712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor}
6722725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
6732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \brief Build an Objective-C class message expression.
6742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
6752725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// This routine takes care of both normal class messages and
6762725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// class messages to the superclass.
6772725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
6782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param ReceiverTypeInfo Type source information that describes the
6792725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// receiver of this message. This may be NULL, in which case we are
6802725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// sending to the superclass and \p SuperLoc must be a valid source
6812725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// location.
6822725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
6832725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param ReceiverType The type of the object receiving the
6842725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// message. When \p ReceiverTypeInfo is non-NULL, this is the same
6852725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// type as that refers to. For a superclass send, this is the type of
6862725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// the superclass.
6872725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
6882725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param SuperLoc The location of the "super" keyword in a
6892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// superclass message.
6902725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
6912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Sel The selector to which the message is being sent.
6922725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
693f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// \param Method The method that this class message is invoking, if
694f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// already known.
695f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor///
6962725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param LBracLoc The location of the opening square bracket ']'.
6972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
6982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param RBrac The location of the closing square bracket ']'.
6992725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
7002725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Args The message arguments.
7012725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
7022725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               QualType ReceiverType,
7032725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation SuperLoc,
7042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               Selector Sel,
705f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                               ObjCMethodDecl *Method,
7062725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation LBracLoc,
7072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation RBracLoc,
7082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               MultiExprArg ArgsIn) {
70992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (ReceiverType->isDependentType()) {
71092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // If the receiver type is dependent, we can't type-check anything
71192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // at this point. Build a dependent expression.
71292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    unsigned NumArgs = ArgsIn.size();
71392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release());
71492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    assert(SuperLoc.isInvalid() && "Message to super with dependent type");
71592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return Owned(ObjCMessageExpr::Create(Context, ReceiverType, LBracLoc,
71692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                         ReceiverTypeInfo, Sel, /*Method=*/0,
71792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                         Args, NumArgs, RBracLoc));
71892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
71915faee19fdb9017dd6d08a690427b18c3b062c2dChris Lattner
7202725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  SourceLocation Loc = SuperLoc.isValid()? SuperLoc
7212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor             : ReceiverTypeInfo->getTypeLoc().getSourceRange().getBegin();
7222725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
7232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // Find the class to which we are sending this message.
7242725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  ObjCInterfaceDecl *Class = 0;
725c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const ObjCObjectType *ClassType = ReceiverType->getAs<ObjCObjectType>();
726c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (!ClassType || !(Class = ClassType->getInterface())) {
7272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    Diag(Loc, diag::err_invalid_receiver_class_message)
7282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor      << ReceiverType;
7292725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    return ExprError();
7307c778f1c549a8ae95d50a819fd537df78da16426Steve Naroff  }
7312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  assert(Class && "We don't know which class we're messaging?");
7322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
7332725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // Find the method we are messaging.
734f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor  if (!Method) {
735f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor    if (Class->isForwardDecl()) {
736f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      // A forward class used in messaging is treated as a 'Class'
737f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      Diag(Loc, diag::warn_receiver_forward_class) << Class->getDeclName();
738f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      Method = LookupFactoryMethodInGlobalPool(Sel,
739f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                               SourceRange(LBracLoc, RBracLoc));
740f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      if (Method)
741f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        Diag(Method->getLocation(), diag::note_method_sent_forward_class)
742f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          << Method->getDeclName();
743f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor    }
744f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor    if (!Method)
745f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      Method = Class->lookupClassMethod(Sel);
7461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
747f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor    // If we have an implementation in scope, check "private" methods.
748f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor    if (!Method)
749f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      Method = LookupPrivateClassMethod(Sel, Class);
7507c778f1c549a8ae95d50a819fd537df78da16426Steve Naroff
751f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor    if (Method && DiagnoseUseOfDecl(Method, Loc))
752f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      return ExprError();
753f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor  }
7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // Check the argument types and determine the result type.
7562725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  QualType ReturnType;
7572725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  unsigned NumArgs = ArgsIn.size();
7582725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release());
7592725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  if (CheckMessageArgumentTypes(Args, NumArgs, Sel, Method, true,
7602725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                LBracLoc, RBracLoc, ReturnType)) {
7612725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    for (unsigned I = 0; I != NumArgs; ++I)
7622725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor      Args[I]->Destroy(Context);
7632725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    return ExprError();
7642725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  }
7654df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek
7662725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // Construct the appropriate ObjCMessageExpr.
7672725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  if (SuperLoc.isValid())
7682725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    return Owned(ObjCMessageExpr::Create(Context, ReturnType, LBracLoc,
7692725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                         SuperLoc, /*IsInstanceSuper=*/false,
7702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                         ReceiverType, Sel, Method, Args,
7712725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                         NumArgs, RBracLoc));
7721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7732725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  return Owned(ObjCMessageExpr::Create(Context, ReturnType, LBracLoc,
7742725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                       ReceiverTypeInfo, Sel, Method, Args,
7752725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                       NumArgs, RBracLoc));
77685a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner}
77785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner
7782725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// ActOnClassMessage - used for both unary and keyword messages.
77985a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// ArgExprs is optional - if it is present, the number of expressions
78085a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner// is obtained from Sel.getNumArgs().
7812725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::ActOnClassMessage(Scope *S,
7822725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               TypeTy *Receiver,
7832725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               Selector Sel,
7842725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation LBracLoc,
7852725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation SelectorLoc,
7862725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceLocation RBracLoc,
7872725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               MultiExprArg Args) {
7882725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  TypeSourceInfo *ReceiverTypeInfo;
7892725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  QualType ReceiverType = GetTypeFromParser(Receiver, &ReceiverTypeInfo);
7902725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  if (ReceiverType.isNull())
7912725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    return ExprError();
7921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7942725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  if (!ReceiverTypeInfo)
7952725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    ReceiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType, LBracLoc);
7961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  return BuildClassMessage(ReceiverTypeInfo, ReceiverType,
798f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                           /*SuperLoc=*/SourceLocation(), Sel, /*Method=*/0,
79939968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor                           LBracLoc, RBracLoc, move(Args));
8002725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor}
80187d3ef08d892df8264bd51adb6ddd4a22422cd29Steve Naroff
8022725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \brief Build an Objective-C instance message expression.
8032725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
8042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// This routine takes care of both normal instance messages and
8052725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// instance messages to the superclass instance.
8062725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
8072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Receiver The expression that computes the object that will
8082725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// receive this message. This may be empty, in which case we are
8092725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// sending to the superclass instance and \p SuperLoc must be a valid
8102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// source location.
8112725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
8122725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param ReceiverType The (static) type of the object receiving the
8132725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// message. When a \p Receiver expression is provided, this is the
8142725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// same type as that expression. For a superclass instance send, this
8152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// is a pointer to the type of the superclass.
8162725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
8172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param SuperLoc The location of the "super" keyword in a
8182725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// superclass instance message.
8192725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
8202725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Sel The selector to which the message is being sent.
8212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
822f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// \param Method The method that this instance message is invoking, if
823f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor/// already known.
824f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor///
8252725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param LBracLoc The location of the opening square bracket ']'.
8262725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
8272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param RBrac The location of the closing square bracket ']'.
8282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor///
8292725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor/// \param Args The message arguments.
8302725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::BuildInstanceMessage(ExprArg ReceiverE,
8312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  QualType ReceiverType,
8322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  SourceLocation SuperLoc,
8332725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  Selector Sel,
834f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                                  ObjCMethodDecl *Method,
8352725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  SourceLocation LBracLoc,
8362725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  SourceLocation RBracLoc,
8372725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  MultiExprArg ArgsIn) {
8382725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // If we have a receiver expression, perform appropriate promotions
8392725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // and determine receiver type.
8402725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  Expr *Receiver = ReceiverE.takeAs<Expr>();
8412725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  if (Receiver) {
84292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Receiver->isTypeDependent()) {
84392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      // If the receiver is type-dependent, we can't type-check anything
84492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      // at this point. Build a dependent expression.
84592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      unsigned NumArgs = ArgsIn.size();
84692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release());
84792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      assert(SuperLoc.isInvalid() && "Message to super with dependent type");
84892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return Owned(ObjCMessageExpr::Create(Context, Context.DependentTy,
84992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                           LBracLoc, Receiver, Sel,
85092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                           /*Method=*/0, Args, NumArgs,
85192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                           RBracLoc));
85292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    }
85392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
8542725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    // If necessary, apply function/array conversion to the receiver.
8552725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    // C99 6.7.5.3p[7,8].
8562725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    DefaultFunctionArrayLvalueConversion(Receiver);
8572725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    ReceiverType = Receiver->getType();
8582725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  }
85904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
8602725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // The location of the receiver.
8612725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  SourceLocation Loc = SuperLoc.isValid()? SuperLoc : Receiver->getLocStart();
8622725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
863f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor  if (!Method) {
864f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor    // Handle messages to id.
865f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor    if (ReceiverType->isObjCIdType() || ReceiverType->isBlockPointerType() ||
866f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        (Receiver && Context.isObjCNSObjectType(Receiver->getType()))) {
867f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      Method = LookupInstanceMethodInGlobalPool(Sel,
8682725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                              SourceRange(LBracLoc, RBracLoc));
869f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      if (!Method)
8702725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor        Method = LookupFactoryMethodInGlobalPool(Sel,
871f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                               SourceRange(LBracLoc, RBracLoc));
872f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor    } else if (ReceiverType->isObjCClassType() ||
873f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor               ReceiverType->isObjCQualifiedClassType()) {
874f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      // Handle messages to Class.
875f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) {
876f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) {
877f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          // First check the public methods in the class interface.
878f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          Method = ClassDecl->lookupClassMethod(Sel);
879f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor
880f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          if (!Method)
881f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            Method = LookupPrivateClassMethod(Sel, ClassDecl);
882f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor
883f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          // FIXME: if we still haven't found a method, we need to look in
884f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          // protocols (if we have qualifiers).
8856b9dfd4257b85c388a9e3cd345cf28acb7351006Steve Naroff        }
886f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        if (Method && DiagnoseUseOfDecl(Method, Loc))
887f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          return ExprError();
888268bc8c1f3a27d2fbd73c3115e4d633d31422ca5Fariborz Jahanian      }
88904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      if (!Method) {
890f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        // If not messaging 'self', look for any factory method named 'Sel'.
891f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        if (!Receiver || !isSelfExpr(Receiver)) {
892f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          Method = LookupFactoryMethodInGlobalPool(Sel,
893f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                               SourceRange(LBracLoc, RBracLoc));
894f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          if (!Method) {
895f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            // If no class (factory) method was found, check if an _instance_
896f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            // method of the same name exists in the root class only.
8972725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor            Method = LookupInstanceMethodInGlobalPool(Sel,
8982725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                               SourceRange(LBracLoc, RBracLoc));
899f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            if (Method)
900f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                if (const ObjCInterfaceDecl *ID =
901f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                  dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) {
902f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                if (ID->getSuperClass())
903f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                  Diag(Loc, diag::warn_root_inst_method_not_found)
904f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                    << Sel << SourceRange(LBracLoc, RBracLoc);
905f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor              }
90604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor          }
90704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor        }
90804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      }
90904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    } else {
910f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      ObjCInterfaceDecl* ClassDecl = 0;
911f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor
912f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      // We allow sending a message to a qualified ID ("id<foo>"), which is ok as
913f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      // long as one of the protocols implements the selector (if not, warn).
914f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      if (const ObjCObjectPointerType *QIdTy
915f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                   = ReceiverType->getAsObjCQualifiedIdType()) {
916f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        // Search protocols for instance methods.
917f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        for (ObjCObjectPointerType::qual_iterator I = QIdTy->qual_begin(),
918f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor               E = QIdTy->qual_end(); I != E; ++I) {
919f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          ObjCProtocolDecl *PDecl = *I;
920f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          if (PDecl && (Method = PDecl->lookupInstanceMethod(Sel)))
921f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            break;
922f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          // Since we aren't supporting "Class<foo>", look for a class method.
923f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          if (PDecl && (Method = PDecl->lookupClassMethod(Sel)))
924f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            break;
925f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        }
926f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      } else if (const ObjCObjectPointerType *OCIType
927f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                   = ReceiverType->getAsObjCInterfacePointerType()) {
928f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        // We allow sending a message to a pointer to an interface (an object).
929f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        ClassDecl = OCIType->getInterfaceDecl();
930f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        // FIXME: consider using LookupInstanceMethodInGlobalPool, since it will be
931f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        // faster than the following method (which can do *many* linear searches).
932f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        // The idea is to add class info to InstanceMethodPool.
933f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        Method = ClassDecl->lookupInstanceMethod(Sel);
934f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor
935f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        if (!Method) {
936f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          // Search protocol qualifiers.
937f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          for (ObjCObjectPointerType::qual_iterator QI = OCIType->qual_begin(),
938f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                 E = OCIType->qual_end(); QI != E; ++QI) {
939f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            if ((Method = (*QI)->lookupInstanceMethod(Sel)))
940f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor              break;
941f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          }
942f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        }
943f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        if (!Method) {
944f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          // If we have implementations in scope, check "private" methods.
945f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          Method = LookupPrivateInstanceMethod(Sel, ClassDecl);
946f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor
947f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          if (!Method && (!Receiver || !isSelfExpr(Receiver))) {
948f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            // If we still haven't found a method, look in the global pool. This
949f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            // behavior isn't very desirable, however we need it for GCC
950f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            // compatibility. FIXME: should we deviate??
951f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            if (OCIType->qual_empty()) {
952f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor              Method = LookupInstanceMethodInGlobalPool(Sel,
953f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                                 SourceRange(LBracLoc, RBracLoc));
954f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor              if (Method && !OCIType->getInterfaceDecl()->isForwardDecl())
955f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                Diag(Loc, diag::warn_maynot_respond)
956f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                  << OCIType->getInterfaceDecl()->getIdentifier() << Sel;
957f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor            }
958f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          }
959f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        }
960f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        if (Method && DiagnoseUseOfDecl(Method, Loc))
961f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          return ExprError();
962f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      } else if (!Context.getObjCIdType().isNull() &&
963f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                 (ReceiverType->isPointerType() ||
964f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                  (ReceiverType->isIntegerType() &&
965f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                   ReceiverType->isScalarType()))) {
966f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        // Implicitly convert integers and pointers to 'id' but emit a warning.
967f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        Diag(Loc, diag::warn_bad_receiver_type)
968f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          << ReceiverType
969f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          << Receiver->getSourceRange();
970f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        if (ReceiverType->isPointerType())
971f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          ImpCastExprToType(Receiver, Context.getObjCIdType(),
972f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                            CastExpr::CK_BitCast);
973f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        else
974f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          ImpCastExprToType(Receiver, Context.getObjCIdType(),
975f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                            CastExpr::CK_IntegralToPointer);
976f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        ReceiverType = Receiver->getType();
97779d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian      }
9783ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian      else if (getLangOptions().CPlusPlus &&
9793ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian               !PerformContextuallyConvertToObjCId(Receiver)) {
9803ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian        if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Receiver)) {
9813ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian          Receiver = ICE->getSubExpr();
9823ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian          ReceiverType = Receiver->getType();
9833ba606199be8056ae83596260bd6fd5872942905Fariborz Jahanian        }
98479d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian        return BuildInstanceMessage(Owned(Receiver),
98579d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian                                    ReceiverType,
98679d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian                                    SuperLoc,
98779d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian                                    Sel,
98879d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian                                    Method,
98979d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian                                    LBracLoc,
99079d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian                                    RBracLoc,
99179d3f04688497857d29fe1f009bbc7b4b830a21bFariborz Jahanian                                    move(ArgsIn));
992f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      } else {
993f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        // Reject other random receiver types (e.g. structs).
994f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        Diag(Loc, diag::err_bad_receiver_type)
995f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor          << ReceiverType << Receiver->getSourceRange();
996f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor        return ExprError();
997f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor      }
99804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    }
999fe1a553256b46fad3c0a9e9967481bcf571339ecChris Lattner  }
10001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10012725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // Check the message arguments.
10022725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  unsigned NumArgs = ArgsIn.size();
10032725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release());
10042725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  QualType ReturnType;
10052725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  if (CheckMessageArgumentTypes(Args, NumArgs, Sel, Method, false,
10062725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                LBracLoc, RBracLoc, ReturnType))
10072725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    return ExprError();
100804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
10092725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  // Construct the appropriate ObjCMessageExpr instance.
10102725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  if (SuperLoc.isValid())
10112725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    return Owned(ObjCMessageExpr::Create(Context, ReturnType, LBracLoc,
10122725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                         SuperLoc,  /*IsInstanceSuper=*/true,
10132725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                         ReceiverType, Sel, Method,
10142725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                         Args, NumArgs, RBracLoc));
10152725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
10162725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  return Owned(ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, Receiver,
10172725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                       Sel, Method, Args, NumArgs, RBracLoc));
10182725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor}
10192725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor
10202725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// ActOnInstanceMessage - used for both unary and keyword messages.
10212725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// ArgExprs is optional - if it is present, the number of expressions
10222725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor// is obtained from Sel.getNumArgs().
10232725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas GregorSema::OwningExprResult Sema::ActOnInstanceMessage(Scope *S,
10242725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  ExprArg ReceiverE,
10252725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  Selector Sel,
10262725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  SourceLocation LBracLoc,
10272725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  SourceLocation SelectorLoc,
10282725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  SourceLocation RBracLoc,
10292725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor                                                  MultiExprArg Args) {
10302725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  Expr *Receiver = static_cast<Expr *>(ReceiverE.get());
10312725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  if (!Receiver)
10322725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor    return ExprError();
103304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
10342725ca8eb3354975ca77ed4b88ede7b60b216b9aDouglas Gregor  return BuildInstanceMessage(move(ReceiverE), Receiver->getType(),
1035f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                              /*SuperLoc=*/SourceLocation(), Sel, /*Method=*/0,
1036f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                              LBracLoc, RBracLoc, move(Args));
103785a932e26f3c3faae6bad639a6d32e92794dfda9Chris Lattner}
1038eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner
1039