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