SemaExprObjC.cpp revision 9670e179a67d868e171feac44fb8f9e2f108c5e8
1//===--- SemaExprObjC.cpp - Semantic Analysis for ObjC Expressions --------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file implements semantic analysis for Objective-C expressions.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Sema/SemaInternal.h"
15#include "clang/Sema/Lookup.h"
16#include "clang/Sema/Scope.h"
17#include "clang/Sema/ScopeInfo.h"
18#include "clang/Sema/Initialization.h"
19#include "clang/AST/ASTContext.h"
20#include "clang/AST/DeclObjC.h"
21#include "clang/AST/ExprObjC.h"
22#include "clang/AST/StmtVisitor.h"
23#include "clang/AST/TypeLoc.h"
24#include "llvm/ADT/SmallString.h"
25#include "clang/Lex/Preprocessor.h"
26
27using namespace clang;
28using namespace sema;
29
30ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs,
31                                        Expr **strings,
32                                        unsigned NumStrings) {
33  StringLiteral **Strings = reinterpret_cast<StringLiteral**>(strings);
34
35  // Most ObjC strings are formed out of a single piece.  However, we *can*
36  // have strings formed out of multiple @ strings with multiple pptokens in
37  // each one, e.g. @"foo" "bar" @"baz" "qux"   which need to be turned into one
38  // StringLiteral for ObjCStringLiteral to hold onto.
39  StringLiteral *S = Strings[0];
40
41  // If we have a multi-part string, merge it all together.
42  if (NumStrings != 1) {
43    // Concatenate objc strings.
44    llvm::SmallString<128> StrBuf;
45    llvm::SmallVector<SourceLocation, 8> StrLocs;
46
47    for (unsigned i = 0; i != NumStrings; ++i) {
48      S = Strings[i];
49
50      // ObjC strings can't be wide.
51      if (S->isWide()) {
52        Diag(S->getLocStart(), diag::err_cfstring_literal_not_string_constant)
53          << S->getSourceRange();
54        return true;
55      }
56
57      // Append the string.
58      StrBuf += S->getString();
59
60      // Get the locations of the string tokens.
61      StrLocs.append(S->tokloc_begin(), S->tokloc_end());
62    }
63
64    // Create the aggregate string with the appropriate content and location
65    // information.
66    S = StringLiteral::Create(Context, StrBuf,
67                              /*Wide=*/false, /*Pascal=*/false,
68                              Context.getPointerType(Context.CharTy),
69                              &StrLocs[0], StrLocs.size());
70  }
71
72  // Verify that this composite string is acceptable for ObjC strings.
73  if (CheckObjCString(S))
74    return true;
75
76  // Initialize the constant string interface lazily. This assumes
77  // the NSString interface is seen in this translation unit. Note: We
78  // don't use NSConstantString, since the runtime team considers this
79  // interface private (even though it appears in the header files).
80  QualType Ty = Context.getObjCConstantStringInterface();
81  if (!Ty.isNull()) {
82    Ty = Context.getObjCObjectPointerType(Ty);
83  } else if (getLangOptions().NoConstantCFStrings) {
84    IdentifierInfo *NSIdent=0;
85    std::string StringClass(getLangOptions().ObjCConstantStringClass);
86
87    if (StringClass.empty())
88      NSIdent = &Context.Idents.get("NSConstantString");
89    else
90      NSIdent = &Context.Idents.get(StringClass);
91
92    NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLocs[0],
93                                     LookupOrdinaryName);
94    if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) {
95      Context.setObjCConstantStringInterface(StrIF);
96      Ty = Context.getObjCConstantStringInterface();
97      Ty = Context.getObjCObjectPointerType(Ty);
98    } else {
99      // If there is no NSConstantString interface defined then treat this
100      // as error and recover from it.
101      Diag(S->getLocStart(), diag::err_no_nsconstant_string_class) << NSIdent
102        << S->getSourceRange();
103      Ty = Context.getObjCIdType();
104    }
105  } else {
106    IdentifierInfo *NSIdent = &Context.Idents.get("NSString");
107    NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLocs[0],
108                                     LookupOrdinaryName);
109    if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) {
110      Context.setObjCConstantStringInterface(StrIF);
111      Ty = Context.getObjCConstantStringInterface();
112      Ty = Context.getObjCObjectPointerType(Ty);
113    } else {
114      // If there is no NSString interface defined then treat constant
115      // strings as untyped objects and let the runtime figure it out later.
116      Ty = Context.getObjCIdType();
117    }
118  }
119
120  return new (Context) ObjCStringLiteral(S, Ty, AtLocs[0]);
121}
122
123ExprResult Sema::BuildObjCEncodeExpression(SourceLocation AtLoc,
124                                      TypeSourceInfo *EncodedTypeInfo,
125                                      SourceLocation RParenLoc) {
126  QualType EncodedType = EncodedTypeInfo->getType();
127  QualType StrTy;
128  if (EncodedType->isDependentType())
129    StrTy = Context.DependentTy;
130  else {
131    if (!EncodedType->getAsArrayTypeUnsafe() && //// Incomplete array is handled.
132        !EncodedType->isVoidType()) // void is handled too.
133      if (RequireCompleteType(AtLoc, EncodedType,
134                         PDiag(diag::err_incomplete_type_objc_at_encode)
135                             << EncodedTypeInfo->getTypeLoc().getSourceRange()))
136        return ExprError();
137
138    std::string Str;
139    Context.getObjCEncodingForType(EncodedType, Str);
140
141    // The type of @encode is the same as the type of the corresponding string,
142    // which is an array type.
143    StrTy = Context.CharTy;
144    // A C++ string literal has a const-qualified element type (C++ 2.13.4p1).
145    if (getLangOptions().CPlusPlus || getLangOptions().ConstStrings)
146      StrTy.addConst();
147    StrTy = Context.getConstantArrayType(StrTy, llvm::APInt(32, Str.size()+1),
148                                         ArrayType::Normal, 0);
149  }
150
151  return new (Context) ObjCEncodeExpr(StrTy, EncodedTypeInfo, AtLoc, RParenLoc);
152}
153
154ExprResult Sema::ParseObjCEncodeExpression(SourceLocation AtLoc,
155                                           SourceLocation EncodeLoc,
156                                           SourceLocation LParenLoc,
157                                           ParsedType ty,
158                                           SourceLocation RParenLoc) {
159  // FIXME: Preserve type source info ?
160  TypeSourceInfo *TInfo;
161  QualType EncodedType = GetTypeFromParser(ty, &TInfo);
162  if (!TInfo)
163    TInfo = Context.getTrivialTypeSourceInfo(EncodedType,
164                                             PP.getLocForEndOfToken(LParenLoc));
165
166  return BuildObjCEncodeExpression(AtLoc, TInfo, RParenLoc);
167}
168
169ExprResult Sema::ParseObjCSelectorExpression(Selector Sel,
170                                             SourceLocation AtLoc,
171                                             SourceLocation SelLoc,
172                                             SourceLocation LParenLoc,
173                                             SourceLocation RParenLoc) {
174  ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel,
175                             SourceRange(LParenLoc, RParenLoc), false, false);
176  if (!Method)
177    Method = LookupFactoryMethodInGlobalPool(Sel,
178                                          SourceRange(LParenLoc, RParenLoc));
179  if (!Method)
180    Diag(SelLoc, diag::warn_undeclared_selector) << Sel;
181
182  llvm::DenseMap<Selector, SourceLocation>::iterator Pos
183    = ReferencedSelectors.find(Sel);
184  if (Pos == ReferencedSelectors.end())
185    ReferencedSelectors.insert(std::make_pair(Sel, SelLoc));
186
187  // In ARC, forbid the user from using @selector for
188  // retain/release/autorelease/dealloc/retainCount.
189  if (getLangOptions().ObjCAutoRefCount) {
190    switch (Sel.getMethodFamily()) {
191    case OMF_retain:
192    case OMF_release:
193    case OMF_autorelease:
194    case OMF_retainCount:
195    case OMF_dealloc:
196      Diag(AtLoc, diag::err_arc_illegal_selector) <<
197        Sel << SourceRange(LParenLoc, RParenLoc);
198      break;
199
200    case OMF_None:
201    case OMF_alloc:
202    case OMF_copy:
203    case OMF_init:
204    case OMF_mutableCopy:
205    case OMF_new:
206    case OMF_self:
207    case OMF_performSelector:
208      break;
209    }
210  }
211  QualType Ty = Context.getObjCSelType();
212  return new (Context) ObjCSelectorExpr(Ty, Sel, AtLoc, RParenLoc);
213}
214
215ExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId,
216                                             SourceLocation AtLoc,
217                                             SourceLocation ProtoLoc,
218                                             SourceLocation LParenLoc,
219                                             SourceLocation RParenLoc) {
220  ObjCProtocolDecl* PDecl = LookupProtocol(ProtocolId, ProtoLoc);
221  if (!PDecl) {
222    Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId;
223    return true;
224  }
225
226  QualType Ty = Context.getObjCProtoType();
227  if (Ty.isNull())
228    return true;
229  Ty = Context.getObjCObjectPointerType(Ty);
230  return new (Context) ObjCProtocolExpr(Ty, PDecl, AtLoc, RParenLoc);
231}
232
233/// Try to capture an implicit reference to 'self'.
234ObjCMethodDecl *Sema::tryCaptureObjCSelf() {
235  // Ignore block scopes: we can capture through them.
236  DeclContext *DC = CurContext;
237  while (true) {
238    if (isa<BlockDecl>(DC)) DC = cast<BlockDecl>(DC)->getDeclContext();
239    else if (isa<EnumDecl>(DC)) DC = cast<EnumDecl>(DC)->getDeclContext();
240    else break;
241  }
242
243  // If we're not in an ObjC method, error out.  Note that, unlike the
244  // C++ case, we don't require an instance method --- class methods
245  // still have a 'self', and we really do still need to capture it!
246  ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(DC);
247  if (!method)
248    return 0;
249
250  ImplicitParamDecl *self = method->getSelfDecl();
251  assert(self && "capturing 'self' in non-definition?");
252
253  // Mark that we're closing on 'this' in all the block scopes, if applicable.
254  for (unsigned idx = FunctionScopes.size() - 1;
255       isa<BlockScopeInfo>(FunctionScopes[idx]);
256       --idx) {
257    BlockScopeInfo *blockScope = cast<BlockScopeInfo>(FunctionScopes[idx]);
258    unsigned &captureIndex = blockScope->CaptureMap[self];
259    if (captureIndex) break;
260
261    bool nested = isa<BlockScopeInfo>(FunctionScopes[idx-1]);
262    blockScope->Captures.push_back(
263              BlockDecl::Capture(self, /*byref*/ false, nested, /*copy*/ 0));
264    captureIndex = blockScope->Captures.size(); // +1
265  }
266
267  return method;
268}
269
270QualType Sema::getMessageSendResultType(QualType ReceiverType,
271                                        ObjCMethodDecl *Method,
272                                    bool isClassMessage, bool isSuperMessage) {
273  assert(Method && "Must have a method");
274  if (!Method->hasRelatedResultType())
275    return Method->getSendResultType();
276
277  // If a method has a related return type:
278  //   - if the method found is an instance method, but the message send
279  //     was a class message send, T is the declared return type of the method
280  //     found
281  if (Method->isInstanceMethod() && isClassMessage)
282    return Method->getSendResultType();
283
284  //   - if the receiver is super, T is a pointer to the class of the
285  //     enclosing method definition
286  if (isSuperMessage) {
287    if (ObjCMethodDecl *CurMethod = getCurMethodDecl())
288      if (ObjCInterfaceDecl *Class = CurMethod->getClassInterface())
289        return Context.getObjCObjectPointerType(
290                                        Context.getObjCInterfaceType(Class));
291  }
292
293  //   - if the receiver is the name of a class U, T is a pointer to U
294  if (ReceiverType->getAs<ObjCInterfaceType>() ||
295      ReceiverType->isObjCQualifiedInterfaceType())
296    return Context.getObjCObjectPointerType(ReceiverType);
297  //   - if the receiver is of type Class or qualified Class type,
298  //     T is the declared return type of the method.
299  if (ReceiverType->isObjCClassType() ||
300      ReceiverType->isObjCQualifiedClassType())
301    return  Method->getSendResultType();
302
303  //   - if the receiver is id, qualified id, Class, or qualified Class, T
304  //     is the receiver type, otherwise
305  //   - T is the type of the receiver expression.
306  return ReceiverType;
307}
308
309void Sema::EmitRelatedResultTypeNote(const Expr *E) {
310  E = E->IgnoreParenImpCasts();
311  const ObjCMessageExpr *MsgSend = dyn_cast<ObjCMessageExpr>(E);
312  if (!MsgSend)
313    return;
314
315  const ObjCMethodDecl *Method = MsgSend->getMethodDecl();
316  if (!Method)
317    return;
318
319  if (!Method->hasRelatedResultType())
320    return;
321
322  if (Context.hasSameUnqualifiedType(Method->getResultType()
323                                                        .getNonReferenceType(),
324                                     MsgSend->getType()))
325    return;
326
327  Diag(Method->getLocation(), diag::note_related_result_type_inferred)
328    << Method->isInstanceMethod() << Method->getSelector()
329    << MsgSend->getType();
330}
331
332bool Sema::CheckMessageArgumentTypes(QualType ReceiverType,
333                                     Expr **Args, unsigned NumArgs,
334                                     Selector Sel, ObjCMethodDecl *Method,
335                                     bool isClassMessage, bool isSuperMessage,
336                                     SourceLocation lbrac, SourceLocation rbrac,
337                                     QualType &ReturnType, ExprValueKind &VK) {
338  if (!Method) {
339    // Apply default argument promotion as for (C99 6.5.2.2p6).
340    for (unsigned i = 0; i != NumArgs; i++) {
341      if (Args[i]->isTypeDependent())
342        continue;
343
344      ExprResult Result = DefaultArgumentPromotion(Args[i]);
345      if (Result.isInvalid())
346        return true;
347      Args[i] = Result.take();
348    }
349
350    unsigned DiagID;
351    if (getLangOptions().ObjCAutoRefCount)
352      DiagID = diag::err_arc_method_not_found;
353    else
354      DiagID = isClassMessage ? diag::warn_class_method_not_found
355                              : diag::warn_inst_method_not_found;
356    Diag(lbrac, DiagID)
357      << Sel << isClassMessage << SourceRange(lbrac, rbrac);
358    ReturnType = Context.getObjCIdType();
359    VK = VK_RValue;
360    return false;
361  }
362
363  ReturnType = getMessageSendResultType(ReceiverType, Method, isClassMessage,
364                                        isSuperMessage);
365  VK = Expr::getValueKindForType(Method->getResultType());
366
367  unsigned NumNamedArgs = Sel.getNumArgs();
368  // Method might have more arguments than selector indicates. This is due
369  // to addition of c-style arguments in method.
370  if (Method->param_size() > Sel.getNumArgs())
371    NumNamedArgs = Method->param_size();
372  // FIXME. This need be cleaned up.
373  if (NumArgs < NumNamedArgs) {
374    Diag(lbrac, diag::err_typecheck_call_too_few_args)
375      << 2 << NumNamedArgs << NumArgs;
376    return false;
377  }
378
379  bool IsError = false;
380  for (unsigned i = 0; i < NumNamedArgs; i++) {
381    // We can't do any type-checking on a type-dependent argument.
382    if (Args[i]->isTypeDependent())
383      continue;
384
385    Expr *argExpr = Args[i];
386
387    ParmVarDecl *Param = Method->param_begin()[i];
388    assert(argExpr && "CheckMessageArgumentTypes(): missing expression");
389
390    if (RequireCompleteType(argExpr->getSourceRange().getBegin(),
391                            Param->getType(),
392                            PDiag(diag::err_call_incomplete_argument)
393                              << argExpr->getSourceRange()))
394      return true;
395
396    InitializedEntity Entity = InitializedEntity::InitializeParameter(Context,
397                                                                      Param);
398    ExprResult ArgE = PerformCopyInitialization(Entity, lbrac, Owned(argExpr));
399    if (ArgE.isInvalid())
400      IsError = true;
401    else
402      Args[i] = ArgE.takeAs<Expr>();
403  }
404
405  // Promote additional arguments to variadic methods.
406  if (Method->isVariadic()) {
407    for (unsigned i = NumNamedArgs; i < NumArgs; ++i) {
408      if (Args[i]->isTypeDependent())
409        continue;
410
411      ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod, 0);
412      IsError |= Arg.isInvalid();
413      Args[i] = Arg.take();
414    }
415  } else {
416    // Check for extra arguments to non-variadic methods.
417    if (NumArgs != NumNamedArgs) {
418      Diag(Args[NumNamedArgs]->getLocStart(),
419           diag::err_typecheck_call_too_many_args)
420        << 2 /*method*/ << NumNamedArgs << NumArgs
421        << Method->getSourceRange()
422        << SourceRange(Args[NumNamedArgs]->getLocStart(),
423                       Args[NumArgs-1]->getLocEnd());
424    }
425  }
426  // diagnose nonnull arguments.
427  for (specific_attr_iterator<NonNullAttr>
428       i = Method->specific_attr_begin<NonNullAttr>(),
429       e = Method->specific_attr_end<NonNullAttr>(); i != e; ++i) {
430    CheckNonNullArguments(*i, Args, lbrac);
431  }
432
433  DiagnoseSentinelCalls(Method, lbrac, Args, NumArgs);
434  return IsError;
435}
436
437bool Sema::isSelfExpr(Expr *receiver) {
438  // 'self' is objc 'self' in an objc method only.
439  DeclContext *DC = CurContext;
440  while (isa<BlockDecl>(DC))
441    DC = DC->getParent();
442  if (DC && !isa<ObjCMethodDecl>(DC))
443    return false;
444  receiver = receiver->IgnoreParenLValueCasts();
445  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(receiver))
446    if (DRE->getDecl()->getIdentifier() == &Context.Idents.get("self"))
447      return true;
448  return false;
449}
450
451// Helper method for ActOnClassMethod/ActOnInstanceMethod.
452// Will search "local" class/category implementations for a method decl.
453// If failed, then we search in class's root for an instance method.
454// Returns 0 if no method is found.
455ObjCMethodDecl *Sema::LookupPrivateClassMethod(Selector Sel,
456                                          ObjCInterfaceDecl *ClassDecl) {
457  ObjCMethodDecl *Method = 0;
458  // lookup in class and all superclasses
459  while (ClassDecl && !Method) {
460    if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
461      Method = ImpDecl->getClassMethod(Sel);
462
463    // Look through local category implementations associated with the class.
464    if (!Method)
465      Method = ClassDecl->getCategoryClassMethod(Sel);
466
467    // Before we give up, check if the selector is an instance method.
468    // But only in the root. This matches gcc's behaviour and what the
469    // runtime expects.
470    if (!Method && !ClassDecl->getSuperClass()) {
471      Method = ClassDecl->lookupInstanceMethod(Sel);
472      // Look through local category implementations associated
473      // with the root class.
474      if (!Method)
475        Method = LookupPrivateInstanceMethod(Sel, ClassDecl);
476    }
477
478    ClassDecl = ClassDecl->getSuperClass();
479  }
480  return Method;
481}
482
483ObjCMethodDecl *Sema::LookupPrivateInstanceMethod(Selector Sel,
484                                              ObjCInterfaceDecl *ClassDecl) {
485  ObjCMethodDecl *Method = 0;
486  while (ClassDecl && !Method) {
487    // If we have implementations in scope, check "private" methods.
488    if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
489      Method = ImpDecl->getInstanceMethod(Sel);
490
491    // Look through local category implementations associated with the class.
492    if (!Method)
493      Method = ClassDecl->getCategoryInstanceMethod(Sel);
494    ClassDecl = ClassDecl->getSuperClass();
495  }
496  return Method;
497}
498
499/// LookupMethodInQualifiedType - Lookups up a method in protocol qualifier
500/// list of a qualified objective pointer type.
501ObjCMethodDecl *Sema::LookupMethodInQualifiedType(Selector Sel,
502                                              const ObjCObjectPointerType *OPT,
503                                              bool Instance)
504{
505  ObjCMethodDecl *MD = 0;
506  for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
507       E = OPT->qual_end(); I != E; ++I) {
508    ObjCProtocolDecl *PROTO = (*I);
509    if ((MD = PROTO->lookupMethod(Sel, Instance))) {
510      return MD;
511    }
512  }
513  return 0;
514}
515
516/// HandleExprPropertyRefExpr - Handle foo.bar where foo is a pointer to an
517/// objective C interface.  This is a property reference expression.
518ExprResult Sema::
519HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
520                          Expr *BaseExpr, SourceLocation OpLoc,
521                          DeclarationName MemberName,
522                          SourceLocation MemberLoc,
523                          SourceLocation SuperLoc, QualType SuperType,
524                          bool Super) {
525  const ObjCInterfaceType *IFaceT = OPT->getInterfaceType();
526  ObjCInterfaceDecl *IFace = IFaceT->getDecl();
527
528  if (MemberName.getNameKind() != DeclarationName::Identifier) {
529    Diag(MemberLoc, diag::err_invalid_property_name)
530      << MemberName << QualType(OPT, 0);
531    return ExprError();
532  }
533
534  IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
535
536  if (IFace->isForwardDecl()) {
537    Diag(MemberLoc, diag::err_property_not_found_forward_class)
538         << MemberName << QualType(OPT, 0);
539    Diag(IFace->getLocation(), diag::note_forward_class);
540    return ExprError();
541  }
542  // Search for a declared property first.
543  if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(Member)) {
544    // Check whether we can reference this property.
545    if (DiagnoseUseOfDecl(PD, MemberLoc))
546      return ExprError();
547    QualType ResTy = PD->getType();
548    ResTy = ResTy.getNonLValueExprType(Context);
549    Selector Sel = PP.getSelectorTable().getNullarySelector(Member);
550    ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel);
551    if (Getter &&
552        (Getter->hasRelatedResultType()
553         || DiagnosePropertyAccessorMismatch(PD, Getter, MemberLoc)))
554        ResTy = getMessageSendResultType(QualType(OPT, 0), Getter, false,
555                                         Super);
556
557    if (Super)
558      return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy,
559                                                     VK_LValue, OK_ObjCProperty,
560                                                     MemberLoc,
561                                                     SuperLoc, SuperType));
562    else
563      return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy,
564                                                     VK_LValue, OK_ObjCProperty,
565                                                     MemberLoc, BaseExpr));
566  }
567  // Check protocols on qualified interfaces.
568  for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
569       E = OPT->qual_end(); I != E; ++I)
570    if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(Member)) {
571      // Check whether we can reference this property.
572      if (DiagnoseUseOfDecl(PD, MemberLoc))
573        return ExprError();
574
575      QualType T = PD->getType();
576      if (ObjCMethodDecl *Getter = PD->getGetterMethodDecl())
577        T = getMessageSendResultType(QualType(OPT, 0), Getter, false, Super);
578      if (Super)
579        return Owned(new (Context) ObjCPropertyRefExpr(PD, T,
580                                                       VK_LValue,
581                                                       OK_ObjCProperty,
582                                                       MemberLoc,
583                                                       SuperLoc, SuperType));
584      else
585        return Owned(new (Context) ObjCPropertyRefExpr(PD, T,
586                                                       VK_LValue,
587                                                       OK_ObjCProperty,
588                                                       MemberLoc,
589                                                       BaseExpr));
590    }
591  // If that failed, look for an "implicit" property by seeing if the nullary
592  // selector is implemented.
593
594  // FIXME: The logic for looking up nullary and unary selectors should be
595  // shared with the code in ActOnInstanceMessage.
596
597  Selector Sel = PP.getSelectorTable().getNullarySelector(Member);
598  ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel);
599
600  // May be founf in property's qualified list.
601  if (!Getter)
602    Getter = LookupMethodInQualifiedType(Sel, OPT, true);
603
604  // If this reference is in an @implementation, check for 'private' methods.
605  if (!Getter)
606    Getter = IFace->lookupPrivateMethod(Sel);
607
608  // Look through local category implementations associated with the class.
609  if (!Getter)
610    Getter = IFace->getCategoryInstanceMethod(Sel);
611  if (Getter) {
612    // Check if we can reference this property.
613    if (DiagnoseUseOfDecl(Getter, MemberLoc))
614      return ExprError();
615  }
616  // If we found a getter then this may be a valid dot-reference, we
617  // will look for the matching setter, in case it is needed.
618  Selector SetterSel =
619    SelectorTable::constructSetterName(PP.getIdentifierTable(),
620                                       PP.getSelectorTable(), Member);
621  ObjCMethodDecl *Setter = IFace->lookupInstanceMethod(SetterSel);
622
623  // May be founf in property's qualified list.
624  if (!Setter)
625    Setter = LookupMethodInQualifiedType(SetterSel, OPT, true);
626
627  if (!Setter) {
628    // If this reference is in an @implementation, also check for 'private'
629    // methods.
630    Setter = IFace->lookupPrivateMethod(SetterSel);
631  }
632  // Look through local category implementations associated with the class.
633  if (!Setter)
634    Setter = IFace->getCategoryInstanceMethod(SetterSel);
635
636  if (Setter && DiagnoseUseOfDecl(Setter, MemberLoc))
637    return ExprError();
638
639  if (Getter || Setter) {
640    QualType PType;
641    if (Getter)
642      PType = getMessageSendResultType(QualType(OPT, 0), Getter, false, Super);
643    else {
644      ParmVarDecl *ArgDecl = *Setter->param_begin();
645      PType = ArgDecl->getType();
646    }
647
648    ExprValueKind VK = VK_LValue;
649    ExprObjectKind OK = OK_ObjCProperty;
650    if (!getLangOptions().CPlusPlus && !PType.hasQualifiers() &&
651        PType->isVoidType())
652      VK = VK_RValue, OK = OK_Ordinary;
653
654    if (Super)
655      return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter,
656                                                     PType, VK, OK,
657                                                     MemberLoc,
658                                                     SuperLoc, SuperType));
659    else
660      return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter,
661                                                     PType, VK, OK,
662                                                     MemberLoc, BaseExpr));
663
664  }
665
666  // Attempt to correct for typos in property names.
667  TypoCorrection Corrected = CorrectTypo(
668      DeclarationNameInfo(MemberName, MemberLoc), LookupOrdinaryName, NULL,
669      NULL, IFace, false, CTC_NoKeywords, OPT);
670  if (ObjCPropertyDecl *Property =
671      Corrected.getCorrectionDeclAs<ObjCPropertyDecl>()) {
672    DeclarationName TypoResult = Corrected.getCorrection();
673    Diag(MemberLoc, diag::err_property_not_found_suggest)
674      << MemberName << QualType(OPT, 0) << TypoResult
675      << FixItHint::CreateReplacement(MemberLoc, TypoResult.getAsString());
676    Diag(Property->getLocation(), diag::note_previous_decl)
677      << Property->getDeclName();
678    return HandleExprPropertyRefExpr(OPT, BaseExpr, OpLoc,
679                                     TypoResult, MemberLoc,
680                                     SuperLoc, SuperType, Super);
681  }
682  ObjCInterfaceDecl *ClassDeclared;
683  if (ObjCIvarDecl *Ivar =
684      IFace->lookupInstanceVariable(Member, ClassDeclared)) {
685    QualType T = Ivar->getType();
686    if (const ObjCObjectPointerType * OBJPT =
687        T->getAsObjCInterfacePointerType()) {
688      const ObjCInterfaceType *IFaceT = OBJPT->getInterfaceType();
689      if (ObjCInterfaceDecl *IFace = IFaceT->getDecl())
690        if (IFace->isForwardDecl()) {
691          Diag(MemberLoc, diag::err_property_not_as_forward_class)
692          << MemberName << IFace;
693          Diag(IFace->getLocation(), diag::note_forward_class);
694          return ExprError();
695        }
696    }
697    Diag(MemberLoc,
698         diag::err_ivar_access_using_property_syntax_suggest)
699    << MemberName << QualType(OPT, 0) << Ivar->getDeclName()
700    << FixItHint::CreateReplacement(OpLoc, "->");
701    return ExprError();
702  }
703
704  Diag(MemberLoc, diag::err_property_not_found)
705    << MemberName << QualType(OPT, 0);
706  if (Setter)
707    Diag(Setter->getLocation(), diag::note_getter_unavailable)
708          << MemberName << BaseExpr->getSourceRange();
709  return ExprError();
710}
711
712
713
714ExprResult Sema::
715ActOnClassPropertyRefExpr(IdentifierInfo &receiverName,
716                          IdentifierInfo &propertyName,
717                          SourceLocation receiverNameLoc,
718                          SourceLocation propertyNameLoc) {
719
720  IdentifierInfo *receiverNamePtr = &receiverName;
721  ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(receiverNamePtr,
722                                                  receiverNameLoc);
723
724  bool IsSuper = false;
725  if (IFace == 0) {
726    // If the "receiver" is 'super' in a method, handle it as an expression-like
727    // property reference.
728    if (receiverNamePtr->isStr("super")) {
729      IsSuper = true;
730
731      if (ObjCMethodDecl *CurMethod = tryCaptureObjCSelf()) {
732        if (CurMethod->isInstanceMethod()) {
733          QualType T =
734            Context.getObjCInterfaceType(CurMethod->getClassInterface());
735          T = Context.getObjCObjectPointerType(T);
736
737          return HandleExprPropertyRefExpr(T->getAsObjCInterfacePointerType(),
738                                           /*BaseExpr*/0,
739                                           SourceLocation()/*OpLoc*/,
740                                           &propertyName,
741                                           propertyNameLoc,
742                                           receiverNameLoc, T, true);
743        }
744
745        // Otherwise, if this is a class method, try dispatching to our
746        // superclass.
747        IFace = CurMethod->getClassInterface()->getSuperClass();
748      }
749    }
750
751    if (IFace == 0) {
752      Diag(receiverNameLoc, diag::err_expected_ident_or_lparen);
753      return ExprError();
754    }
755  }
756
757  // Search for a declared property first.
758  Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName);
759  ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel);
760
761  // If this reference is in an @implementation, check for 'private' methods.
762  if (!Getter)
763    if (ObjCMethodDecl *CurMeth = getCurMethodDecl())
764      if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface())
765        if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
766          Getter = ImpDecl->getClassMethod(Sel);
767
768  if (Getter) {
769    // FIXME: refactor/share with ActOnMemberReference().
770    // Check if we can reference this property.
771    if (DiagnoseUseOfDecl(Getter, propertyNameLoc))
772      return ExprError();
773  }
774
775  // Look for the matching setter, in case it is needed.
776  Selector SetterSel =
777    SelectorTable::constructSetterName(PP.getIdentifierTable(),
778                                       PP.getSelectorTable(), &propertyName);
779
780  ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel);
781  if (!Setter) {
782    // If this reference is in an @implementation, also check for 'private'
783    // methods.
784    if (ObjCMethodDecl *CurMeth = getCurMethodDecl())
785      if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface())
786        if (ObjCImplementationDecl *ImpDecl = ClassDecl->getImplementation())
787          Setter = ImpDecl->getClassMethod(SetterSel);
788  }
789  // Look through local category implementations associated with the class.
790  if (!Setter)
791    Setter = IFace->getCategoryClassMethod(SetterSel);
792
793  if (Setter && DiagnoseUseOfDecl(Setter, propertyNameLoc))
794    return ExprError();
795
796  if (Getter || Setter) {
797    QualType PType;
798
799    ExprValueKind VK = VK_LValue;
800    if (Getter) {
801      PType = getMessageSendResultType(Context.getObjCInterfaceType(IFace),
802                                       Getter, true,
803                                       receiverNamePtr->isStr("super"));
804      if (!getLangOptions().CPlusPlus &&
805          !PType.hasQualifiers() && PType->isVoidType())
806        VK = VK_RValue;
807    } else {
808      for (ObjCMethodDecl::param_iterator PI = Setter->param_begin(),
809           E = Setter->param_end(); PI != E; ++PI)
810        PType = (*PI)->getType();
811      VK = VK_LValue;
812    }
813
814    ExprObjectKind OK = (VK == VK_RValue ? OK_Ordinary : OK_ObjCProperty);
815
816    if (IsSuper)
817    return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter,
818                                                   PType, VK, OK,
819                                                   propertyNameLoc,
820                                                   receiverNameLoc,
821                                          Context.getObjCInterfaceType(IFace)));
822
823    return Owned(new (Context) ObjCPropertyRefExpr(Getter, Setter,
824                                                   PType, VK, OK,
825                                                   propertyNameLoc,
826                                                   receiverNameLoc, IFace));
827  }
828  return ExprError(Diag(propertyNameLoc, diag::err_property_not_found)
829                     << &propertyName << Context.getObjCInterfaceType(IFace));
830}
831
832Sema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S,
833                                               IdentifierInfo *Name,
834                                               SourceLocation NameLoc,
835                                               bool IsSuper,
836                                               bool HasTrailingDot,
837                                               ParsedType &ReceiverType) {
838  ReceiverType = ParsedType();
839
840  // If the identifier is "super" and there is no trailing dot, we're
841  // messaging super. If the identifier is "super" and there is a
842  // trailing dot, it's an instance message.
843  if (IsSuper && S->isInObjcMethodScope())
844    return HasTrailingDot? ObjCInstanceMessage : ObjCSuperMessage;
845
846  LookupResult Result(*this, Name, NameLoc, LookupOrdinaryName);
847  LookupName(Result, S);
848
849  switch (Result.getResultKind()) {
850  case LookupResult::NotFound:
851    // Normal name lookup didn't find anything. If we're in an
852    // Objective-C method, look for ivars. If we find one, we're done!
853    // FIXME: This is a hack. Ivar lookup should be part of normal
854    // lookup.
855    if (ObjCMethodDecl *Method = getCurMethodDecl()) {
856      ObjCInterfaceDecl *ClassDeclared;
857      if (Method->getClassInterface()->lookupInstanceVariable(Name,
858                                                              ClassDeclared))
859        return ObjCInstanceMessage;
860    }
861
862    // Break out; we'll perform typo correction below.
863    break;
864
865  case LookupResult::NotFoundInCurrentInstantiation:
866  case LookupResult::FoundOverloaded:
867  case LookupResult::FoundUnresolvedValue:
868  case LookupResult::Ambiguous:
869    Result.suppressDiagnostics();
870    return ObjCInstanceMessage;
871
872  case LookupResult::Found: {
873    // If the identifier is a class or not, and there is a trailing dot,
874    // it's an instance message.
875    if (HasTrailingDot)
876      return ObjCInstanceMessage;
877    // We found something. If it's a type, then we have a class
878    // message. Otherwise, it's an instance message.
879    NamedDecl *ND = Result.getFoundDecl();
880    QualType T;
881    if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND))
882      T = Context.getObjCInterfaceType(Class);
883    else if (TypeDecl *Type = dyn_cast<TypeDecl>(ND))
884      T = Context.getTypeDeclType(Type);
885    else
886      return ObjCInstanceMessage;
887
888    //  We have a class message, and T is the type we're
889    //  messaging. Build source-location information for it.
890    TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc);
891    ReceiverType = CreateParsedType(T, TSInfo);
892    return ObjCClassMessage;
893  }
894  }
895
896  // Determine our typo-correction context.
897  CorrectTypoContext CTC = CTC_Expression;
898  if (ObjCMethodDecl *Method = getCurMethodDecl())
899    if (Method->getClassInterface() &&
900        Method->getClassInterface()->getSuperClass())
901      CTC = CTC_ObjCMessageReceiver;
902
903  if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(),
904                                             Result.getLookupKind(), S, NULL,
905                                             NULL, false, CTC)) {
906    if (NamedDecl *ND = Corrected.getCorrectionDecl()) {
907      // If we found a declaration, correct when it refers to an Objective-C
908      // class.
909      if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND)) {
910        Diag(NameLoc, diag::err_unknown_receiver_suggest)
911          << Name << Corrected.getCorrection()
912          << FixItHint::CreateReplacement(SourceRange(NameLoc),
913                                          ND->getNameAsString());
914        Diag(ND->getLocation(), diag::note_previous_decl)
915          << Corrected.getCorrection();
916
917        QualType T = Context.getObjCInterfaceType(Class);
918        TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc);
919        ReceiverType = CreateParsedType(T, TSInfo);
920        return ObjCClassMessage;
921      }
922    } else if (Corrected.isKeyword() &&
923               Corrected.getCorrectionAsIdentifierInfo()->isStr("super")) {
924      // If we've found the keyword "super", this is a send to super.
925      Diag(NameLoc, diag::err_unknown_receiver_suggest)
926        << Name << Corrected.getCorrection()
927        << FixItHint::CreateReplacement(SourceRange(NameLoc), "super");
928      return ObjCSuperMessage;
929    }
930  }
931
932  // Fall back: let the parser try to parse it as an instance message.
933  return ObjCInstanceMessage;
934}
935
936ExprResult Sema::ActOnSuperMessage(Scope *S,
937                                   SourceLocation SuperLoc,
938                                   Selector Sel,
939                                   SourceLocation LBracLoc,
940                                   SourceLocation SelectorLoc,
941                                   SourceLocation RBracLoc,
942                                   MultiExprArg Args) {
943  // Determine whether we are inside a method or not.
944  ObjCMethodDecl *Method = tryCaptureObjCSelf();
945  if (!Method) {
946    Diag(SuperLoc, diag::err_invalid_receiver_to_message_super);
947    return ExprError();
948  }
949
950  ObjCInterfaceDecl *Class = Method->getClassInterface();
951  if (!Class) {
952    Diag(SuperLoc, diag::error_no_super_class_message)
953      << Method->getDeclName();
954    return ExprError();
955  }
956
957  ObjCInterfaceDecl *Super = Class->getSuperClass();
958  if (!Super) {
959    // The current class does not have a superclass.
960    Diag(SuperLoc, diag::error_root_class_cannot_use_super)
961      << Class->getIdentifier();
962    return ExprError();
963  }
964
965  // We are in a method whose class has a superclass, so 'super'
966  // is acting as a keyword.
967  if (Method->isInstanceMethod()) {
968    // Since we are in an instance method, this is an instance
969    // message to the superclass instance.
970    QualType SuperTy = Context.getObjCInterfaceType(Super);
971    SuperTy = Context.getObjCObjectPointerType(SuperTy);
972    return BuildInstanceMessage(0, SuperTy, SuperLoc,
973                                Sel, /*Method=*/0,
974                                LBracLoc, SelectorLoc, RBracLoc, move(Args));
975  }
976
977  // Since we are in a class method, this is a class message to
978  // the superclass.
979  return BuildClassMessage(/*ReceiverTypeInfo=*/0,
980                           Context.getObjCInterfaceType(Super),
981                           SuperLoc, Sel, /*Method=*/0,
982                           LBracLoc, SelectorLoc, RBracLoc, move(Args));
983}
984
985/// \brief Build an Objective-C class message expression.
986///
987/// This routine takes care of both normal class messages and
988/// class messages to the superclass.
989///
990/// \param ReceiverTypeInfo Type source information that describes the
991/// receiver of this message. This may be NULL, in which case we are
992/// sending to the superclass and \p SuperLoc must be a valid source
993/// location.
994
995/// \param ReceiverType The type of the object receiving the
996/// message. When \p ReceiverTypeInfo is non-NULL, this is the same
997/// type as that refers to. For a superclass send, this is the type of
998/// the superclass.
999///
1000/// \param SuperLoc The location of the "super" keyword in a
1001/// superclass message.
1002///
1003/// \param Sel The selector to which the message is being sent.
1004///
1005/// \param Method The method that this class message is invoking, if
1006/// already known.
1007///
1008/// \param LBracLoc The location of the opening square bracket ']'.
1009///
1010/// \param RBrac The location of the closing square bracket ']'.
1011///
1012/// \param Args The message arguments.
1013ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
1014                                   QualType ReceiverType,
1015                                   SourceLocation SuperLoc,
1016                                   Selector Sel,
1017                                   ObjCMethodDecl *Method,
1018                                   SourceLocation LBracLoc,
1019                                   SourceLocation SelectorLoc,
1020                                   SourceLocation RBracLoc,
1021                                   MultiExprArg ArgsIn) {
1022  SourceLocation Loc = SuperLoc.isValid()? SuperLoc
1023    : ReceiverTypeInfo->getTypeLoc().getSourceRange().getBegin();
1024  if (LBracLoc.isInvalid()) {
1025    Diag(Loc, diag::err_missing_open_square_message_send)
1026      << FixItHint::CreateInsertion(Loc, "[");
1027    LBracLoc = Loc;
1028  }
1029
1030  if (ReceiverType->isDependentType()) {
1031    // If the receiver type is dependent, we can't type-check anything
1032    // at this point. Build a dependent expression.
1033    unsigned NumArgs = ArgsIn.size();
1034    Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release());
1035    assert(SuperLoc.isInvalid() && "Message to super with dependent type");
1036    return Owned(ObjCMessageExpr::Create(Context, ReceiverType,
1037                                         VK_RValue, LBracLoc, ReceiverTypeInfo,
1038                                         Sel, SelectorLoc, /*Method=*/0,
1039                                         Args, NumArgs, RBracLoc));
1040  }
1041
1042  // Find the class to which we are sending this message.
1043  ObjCInterfaceDecl *Class = 0;
1044  const ObjCObjectType *ClassType = ReceiverType->getAs<ObjCObjectType>();
1045  if (!ClassType || !(Class = ClassType->getInterface())) {
1046    Diag(Loc, diag::err_invalid_receiver_class_message)
1047      << ReceiverType;
1048    return ExprError();
1049  }
1050  assert(Class && "We don't know which class we're messaging?");
1051  (void)DiagnoseUseOfDecl(Class, Loc);
1052  // Find the method we are messaging.
1053  if (!Method) {
1054    if (Class->isForwardDecl()) {
1055      if (getLangOptions().ObjCAutoRefCount) {
1056        Diag(Loc, diag::err_arc_receiver_forward_class) << ReceiverType;
1057      } else {
1058        Diag(Loc, diag::warn_receiver_forward_class) << Class->getDeclName();
1059      }
1060
1061      // A forward class used in messaging is treated as a 'Class'
1062      Method = LookupFactoryMethodInGlobalPool(Sel,
1063                                               SourceRange(LBracLoc, RBracLoc));
1064      if (Method && !getLangOptions().ObjCAutoRefCount)
1065        Diag(Method->getLocation(), diag::note_method_sent_forward_class)
1066          << Method->getDeclName();
1067    }
1068    if (!Method)
1069      Method = Class->lookupClassMethod(Sel);
1070
1071    // If we have an implementation in scope, check "private" methods.
1072    if (!Method)
1073      Method = LookupPrivateClassMethod(Sel, Class);
1074
1075    if (Method && DiagnoseUseOfDecl(Method, Loc))
1076      return ExprError();
1077  }
1078
1079  // Check the argument types and determine the result type.
1080  QualType ReturnType;
1081  ExprValueKind VK = VK_RValue;
1082
1083  unsigned NumArgs = ArgsIn.size();
1084  Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release());
1085  if (CheckMessageArgumentTypes(ReceiverType, Args, NumArgs, Sel, Method, true,
1086                                SuperLoc.isValid(), LBracLoc, RBracLoc,
1087                                ReturnType, VK))
1088    return ExprError();
1089
1090  if (Method && !Method->getResultType()->isVoidType() &&
1091      RequireCompleteType(LBracLoc, Method->getResultType(),
1092                          diag::err_illegal_message_expr_incomplete_type))
1093    return ExprError();
1094
1095  // Construct the appropriate ObjCMessageExpr.
1096  Expr *Result;
1097  if (SuperLoc.isValid())
1098    Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
1099                                     SuperLoc, /*IsInstanceSuper=*/false,
1100                                     ReceiverType, Sel, SelectorLoc,
1101                                     Method, Args, NumArgs, RBracLoc);
1102  else
1103    Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
1104                                     ReceiverTypeInfo, Sel, SelectorLoc,
1105                                     Method, Args, NumArgs, RBracLoc);
1106  return MaybeBindToTemporary(Result);
1107}
1108
1109// ActOnClassMessage - used for both unary and keyword messages.
1110// ArgExprs is optional - if it is present, the number of expressions
1111// is obtained from Sel.getNumArgs().
1112ExprResult Sema::ActOnClassMessage(Scope *S,
1113                                   ParsedType Receiver,
1114                                   Selector Sel,
1115                                   SourceLocation LBracLoc,
1116                                   SourceLocation SelectorLoc,
1117                                   SourceLocation RBracLoc,
1118                                   MultiExprArg Args) {
1119  TypeSourceInfo *ReceiverTypeInfo;
1120  QualType ReceiverType = GetTypeFromParser(Receiver, &ReceiverTypeInfo);
1121  if (ReceiverType.isNull())
1122    return ExprError();
1123
1124
1125  if (!ReceiverTypeInfo)
1126    ReceiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType, LBracLoc);
1127
1128  return BuildClassMessage(ReceiverTypeInfo, ReceiverType,
1129                           /*SuperLoc=*/SourceLocation(), Sel, /*Method=*/0,
1130                           LBracLoc, SelectorLoc, RBracLoc, move(Args));
1131}
1132
1133/// \brief Build an Objective-C instance message expression.
1134///
1135/// This routine takes care of both normal instance messages and
1136/// instance messages to the superclass instance.
1137///
1138/// \param Receiver The expression that computes the object that will
1139/// receive this message. This may be empty, in which case we are
1140/// sending to the superclass instance and \p SuperLoc must be a valid
1141/// source location.
1142///
1143/// \param ReceiverType The (static) type of the object receiving the
1144/// message. When a \p Receiver expression is provided, this is the
1145/// same type as that expression. For a superclass instance send, this
1146/// is a pointer to the type of the superclass.
1147///
1148/// \param SuperLoc The location of the "super" keyword in a
1149/// superclass instance message.
1150///
1151/// \param Sel The selector to which the message is being sent.
1152///
1153/// \param Method The method that this instance message is invoking, if
1154/// already known.
1155///
1156/// \param LBracLoc The location of the opening square bracket ']'.
1157///
1158/// \param RBrac The location of the closing square bracket ']'.
1159///
1160/// \param Args The message arguments.
1161ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
1162                                      QualType ReceiverType,
1163                                      SourceLocation SuperLoc,
1164                                      Selector Sel,
1165                                      ObjCMethodDecl *Method,
1166                                      SourceLocation LBracLoc,
1167                                      SourceLocation SelectorLoc,
1168                                      SourceLocation RBracLoc,
1169                                      MultiExprArg ArgsIn) {
1170  // The location of the receiver.
1171  SourceLocation Loc = SuperLoc.isValid()? SuperLoc : Receiver->getLocStart();
1172
1173  if (LBracLoc.isInvalid()) {
1174    Diag(Loc, diag::err_missing_open_square_message_send)
1175      << FixItHint::CreateInsertion(Loc, "[");
1176    LBracLoc = Loc;
1177  }
1178
1179  // If we have a receiver expression, perform appropriate promotions
1180  // and determine receiver type.
1181  if (Receiver) {
1182    if (Receiver->isTypeDependent()) {
1183      // If the receiver is type-dependent, we can't type-check anything
1184      // at this point. Build a dependent expression.
1185      unsigned NumArgs = ArgsIn.size();
1186      Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release());
1187      assert(SuperLoc.isInvalid() && "Message to super with dependent type");
1188      return Owned(ObjCMessageExpr::Create(Context, Context.DependentTy,
1189                                           VK_RValue, LBracLoc, Receiver, Sel,
1190                                           SelectorLoc, /*Method=*/0,
1191                                           Args, NumArgs, RBracLoc));
1192    }
1193
1194    // If necessary, apply function/array conversion to the receiver.
1195    // C99 6.7.5.3p[7,8].
1196    ExprResult Result = DefaultFunctionArrayLvalueConversion(Receiver);
1197    if (Result.isInvalid())
1198      return ExprError();
1199    Receiver = Result.take();
1200    ReceiverType = Receiver->getType();
1201  }
1202
1203  if (!Method) {
1204    // Handle messages to id.
1205    bool receiverIsId = ReceiverType->isObjCIdType();
1206    if (receiverIsId || ReceiverType->isBlockPointerType() ||
1207        (Receiver && Context.isObjCNSObjectType(Receiver->getType()))) {
1208      Method = LookupInstanceMethodInGlobalPool(Sel,
1209                                                SourceRange(LBracLoc, RBracLoc),
1210                                                receiverIsId);
1211      if (!Method)
1212        Method = LookupFactoryMethodInGlobalPool(Sel,
1213                                                 SourceRange(LBracLoc, RBracLoc),
1214                                                 receiverIsId);
1215    } else if (ReceiverType->isObjCClassType() ||
1216               ReceiverType->isObjCQualifiedClassType()) {
1217      // Handle messages to Class.
1218      // We allow sending a message to a qualified Class ("Class<foo>"), which
1219      // is ok as long as one of the protocols implements the selector (if not, warn).
1220      if (const ObjCObjectPointerType *QClassTy
1221            = ReceiverType->getAsObjCQualifiedClassType()) {
1222        // Search protocols for class methods.
1223        Method = LookupMethodInQualifiedType(Sel, QClassTy, false);
1224        if (!Method) {
1225          Method = LookupMethodInQualifiedType(Sel, QClassTy, true);
1226          // warn if instance method found for a Class message.
1227          if (Method) {
1228            Diag(Loc, diag::warn_instance_method_on_class_found)
1229              << Method->getSelector() << Sel;
1230            Diag(Method->getLocation(), diag::note_method_declared_at);
1231          }
1232        }
1233      } else {
1234        if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) {
1235          if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) {
1236            // First check the public methods in the class interface.
1237            Method = ClassDecl->lookupClassMethod(Sel);
1238
1239            if (!Method)
1240              Method = LookupPrivateClassMethod(Sel, ClassDecl);
1241          }
1242          if (Method && DiagnoseUseOfDecl(Method, Loc))
1243            return ExprError();
1244        }
1245        if (!Method) {
1246          // If not messaging 'self', look for any factory method named 'Sel'.
1247          if (!Receiver || !isSelfExpr(Receiver)) {
1248            Method = LookupFactoryMethodInGlobalPool(Sel,
1249                                                SourceRange(LBracLoc, RBracLoc),
1250                                                     true);
1251            if (!Method) {
1252              // If no class (factory) method was found, check if an _instance_
1253              // method of the same name exists in the root class only.
1254              Method = LookupInstanceMethodInGlobalPool(Sel,
1255                                               SourceRange(LBracLoc, RBracLoc),
1256                                                        true);
1257              if (Method)
1258                  if (const ObjCInterfaceDecl *ID =
1259                      dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) {
1260                    if (ID->getSuperClass())
1261                      Diag(Loc, diag::warn_root_inst_method_not_found)
1262                      << Sel << SourceRange(LBracLoc, RBracLoc);
1263                  }
1264            }
1265          }
1266        }
1267      }
1268    } else {
1269      ObjCInterfaceDecl* ClassDecl = 0;
1270
1271      // We allow sending a message to a qualified ID ("id<foo>"), which is ok as
1272      // long as one of the protocols implements the selector (if not, warn).
1273      if (const ObjCObjectPointerType *QIdTy
1274                                   = ReceiverType->getAsObjCQualifiedIdType()) {
1275        // Search protocols for instance methods.
1276        Method = LookupMethodInQualifiedType(Sel, QIdTy, true);
1277        if (!Method)
1278          Method = LookupMethodInQualifiedType(Sel, QIdTy, false);
1279      } else if (const ObjCObjectPointerType *OCIType
1280                   = ReceiverType->getAsObjCInterfacePointerType()) {
1281        // We allow sending a message to a pointer to an interface (an object).
1282        ClassDecl = OCIType->getInterfaceDecl();
1283
1284        if (ClassDecl->isForwardDecl() && getLangOptions().ObjCAutoRefCount) {
1285          Diag(Loc, diag::err_arc_receiver_forward_instance)
1286            << OCIType->getPointeeType()
1287            << (Receiver ? Receiver->getSourceRange() : SourceRange(SuperLoc));
1288          return ExprError();
1289        }
1290
1291        // FIXME: consider using LookupInstanceMethodInGlobalPool, since it will be
1292        // faster than the following method (which can do *many* linear searches).
1293        // The idea is to add class info to MethodPool.
1294        Method = ClassDecl->lookupInstanceMethod(Sel);
1295
1296        if (!Method)
1297          // Search protocol qualifiers.
1298          Method = LookupMethodInQualifiedType(Sel, OCIType, true);
1299
1300        const ObjCInterfaceDecl *forwardClass = 0;
1301        if (!Method) {
1302          // If we have implementations in scope, check "private" methods.
1303          Method = LookupPrivateInstanceMethod(Sel, ClassDecl);
1304
1305          if (!Method && getLangOptions().ObjCAutoRefCount) {
1306            Diag(Loc, diag::err_arc_may_not_respond)
1307              << OCIType->getPointeeType() << Sel;
1308            return ExprError();
1309          }
1310
1311          if (!Method && (!Receiver || !isSelfExpr(Receiver))) {
1312            // If we still haven't found a method, look in the global pool. This
1313            // behavior isn't very desirable, however we need it for GCC
1314            // compatibility. FIXME: should we deviate??
1315            if (OCIType->qual_empty()) {
1316              Method = LookupInstanceMethodInGlobalPool(Sel,
1317                                                 SourceRange(LBracLoc, RBracLoc));
1318              if (OCIType->getInterfaceDecl()->isForwardDecl())
1319                forwardClass = OCIType->getInterfaceDecl();
1320              if (Method && !forwardClass)
1321                Diag(Loc, diag::warn_maynot_respond)
1322                  << OCIType->getInterfaceDecl()->getIdentifier() << Sel;
1323            }
1324          }
1325        }
1326        if (Method && DiagnoseUseOfDecl(Method, Loc, forwardClass))
1327          return ExprError();
1328      } else if (!getLangOptions().ObjCAutoRefCount &&
1329                 !Context.getObjCIdType().isNull() &&
1330                 (ReceiverType->isPointerType() ||
1331                  ReceiverType->isIntegerType())) {
1332        // Implicitly convert integers and pointers to 'id' but emit a warning.
1333        // But not in ARC.
1334        Diag(Loc, diag::warn_bad_receiver_type)
1335          << ReceiverType
1336          << Receiver->getSourceRange();
1337        if (ReceiverType->isPointerType())
1338          Receiver = ImpCastExprToType(Receiver, Context.getObjCIdType(),
1339                            CK_BitCast).take();
1340        else {
1341          // TODO: specialized warning on null receivers?
1342          bool IsNull = Receiver->isNullPointerConstant(Context,
1343                                              Expr::NPC_ValueDependentIsNull);
1344          Receiver = ImpCastExprToType(Receiver, Context.getObjCIdType(),
1345                            IsNull ? CK_NullToPointer : CK_IntegralToPointer).take();
1346        }
1347        ReceiverType = Receiver->getType();
1348      }
1349      else {
1350        ExprResult ReceiverRes;
1351        if (getLangOptions().CPlusPlus)
1352          ReceiverRes = PerformContextuallyConvertToObjCId(Receiver);
1353        if (ReceiverRes.isUsable()) {
1354          Receiver = ReceiverRes.take();
1355          if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Receiver)) {
1356            Receiver = ICE->getSubExpr();
1357            ReceiverType = Receiver->getType();
1358          }
1359          return BuildInstanceMessage(Receiver,
1360                                      ReceiverType,
1361                                      SuperLoc,
1362                                      Sel,
1363                                      Method,
1364                                      LBracLoc,
1365                                      SelectorLoc,
1366                                      RBracLoc,
1367                                      move(ArgsIn));
1368        } else {
1369          // Reject other random receiver types (e.g. structs).
1370          Diag(Loc, diag::err_bad_receiver_type)
1371            << ReceiverType << Receiver->getSourceRange();
1372          return ExprError();
1373        }
1374      }
1375    }
1376  }
1377
1378  // Check the message arguments.
1379  unsigned NumArgs = ArgsIn.size();
1380  Expr **Args = reinterpret_cast<Expr **>(ArgsIn.release());
1381  QualType ReturnType;
1382  ExprValueKind VK = VK_RValue;
1383  bool ClassMessage = (ReceiverType->isObjCClassType() ||
1384                       ReceiverType->isObjCQualifiedClassType());
1385  if (CheckMessageArgumentTypes(ReceiverType, Args, NumArgs, Sel, Method,
1386                                ClassMessage, SuperLoc.isValid(),
1387                                LBracLoc, RBracLoc, ReturnType, VK))
1388    return ExprError();
1389
1390  if (Method && !Method->getResultType()->isVoidType() &&
1391      RequireCompleteType(LBracLoc, Method->getResultType(),
1392                          diag::err_illegal_message_expr_incomplete_type))
1393    return ExprError();
1394
1395  // In ARC, forbid the user from sending messages to
1396  // retain/release/autorelease/dealloc/retainCount explicitly.
1397  if (getLangOptions().ObjCAutoRefCount) {
1398    ObjCMethodFamily family =
1399      (Method ? Method->getMethodFamily() : Sel.getMethodFamily());
1400    switch (family) {
1401    case OMF_init:
1402      if (Method)
1403        checkInitMethod(Method, ReceiverType);
1404
1405    case OMF_None:
1406    case OMF_alloc:
1407    case OMF_copy:
1408    case OMF_mutableCopy:
1409    case OMF_new:
1410    case OMF_self:
1411      break;
1412
1413    case OMF_dealloc:
1414    case OMF_retain:
1415    case OMF_release:
1416    case OMF_autorelease:
1417    case OMF_retainCount:
1418      Diag(Loc, diag::err_arc_illegal_explicit_message)
1419        << Sel << SelectorLoc;
1420      break;
1421
1422    case OMF_performSelector:
1423      if (Method && NumArgs >= 1) {
1424        if (ObjCSelectorExpr *SelExp = dyn_cast<ObjCSelectorExpr>(Args[0])) {
1425          Selector ArgSel = SelExp->getSelector();
1426          ObjCMethodDecl *SelMethod =
1427            LookupInstanceMethodInGlobalPool(ArgSel,
1428                                             SelExp->getSourceRange());
1429          if (!SelMethod)
1430            SelMethod =
1431              LookupFactoryMethodInGlobalPool(ArgSel,
1432                                              SelExp->getSourceRange());
1433          if (SelMethod) {
1434            ObjCMethodFamily SelFamily = SelMethod->getMethodFamily();
1435            switch (SelFamily) {
1436              case OMF_alloc:
1437              case OMF_copy:
1438              case OMF_mutableCopy:
1439              case OMF_new:
1440              case OMF_self:
1441              case OMF_init:
1442                // Issue error, unless ns_returns_not_retained.
1443                if (!SelMethod->hasAttr<NSReturnsNotRetainedAttr>()) {
1444                  // selector names a +1 method
1445                  Diag(SelectorLoc,
1446                       diag::err_arc_perform_selector_retains);
1447                  Diag(SelMethod->getLocation(), diag::note_method_declared_at);
1448                }
1449                break;
1450              default:
1451                // +0 call. OK. unless ns_returns_retained.
1452                if (SelMethod->hasAttr<NSReturnsRetainedAttr>()) {
1453                  // selector names a +1 method
1454                  Diag(SelectorLoc,
1455                       diag::err_arc_perform_selector_retains);
1456                  Diag(SelMethod->getLocation(), diag::note_method_declared_at);
1457                }
1458                break;
1459            }
1460          }
1461        } else {
1462          // error (may leak).
1463          Diag(SelectorLoc, diag::warn_arc_perform_selector_leaks);
1464          Diag(Args[0]->getExprLoc(), diag::note_used_here);
1465        }
1466      }
1467      break;
1468    }
1469  }
1470
1471  // Construct the appropriate ObjCMessageExpr instance.
1472  ObjCMessageExpr *Result;
1473  if (SuperLoc.isValid())
1474    Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
1475                                     SuperLoc,  /*IsInstanceSuper=*/true,
1476                                     ReceiverType, Sel, SelectorLoc, Method,
1477                                     Args, NumArgs, RBracLoc);
1478  else
1479    Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
1480                                     Receiver, Sel, SelectorLoc, Method,
1481                                     Args, NumArgs, RBracLoc);
1482
1483  if (getLangOptions().ObjCAutoRefCount) {
1484    // In ARC, annotate delegate init calls.
1485    if (Result->getMethodFamily() == OMF_init &&
1486        (SuperLoc.isValid() || isSelfExpr(Receiver))) {
1487      // Only consider init calls *directly* in init implementations,
1488      // not within blocks.
1489      ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(CurContext);
1490      if (method && method->getMethodFamily() == OMF_init) {
1491        // The implicit assignment to self means we also don't want to
1492        // consume the result.
1493        Result->setDelegateInitCall(true);
1494        return Owned(Result);
1495      }
1496    }
1497
1498    // In ARC, check for message sends which are likely to introduce
1499    // retain cycles.
1500    checkRetainCycles(Result);
1501  }
1502
1503  return MaybeBindToTemporary(Result);
1504}
1505
1506// ActOnInstanceMessage - used for both unary and keyword messages.
1507// ArgExprs is optional - if it is present, the number of expressions
1508// is obtained from Sel.getNumArgs().
1509ExprResult Sema::ActOnInstanceMessage(Scope *S,
1510                                      Expr *Receiver,
1511                                      Selector Sel,
1512                                      SourceLocation LBracLoc,
1513                                      SourceLocation SelectorLoc,
1514                                      SourceLocation RBracLoc,
1515                                      MultiExprArg Args) {
1516  if (!Receiver)
1517    return ExprError();
1518
1519  return BuildInstanceMessage(Receiver, Receiver->getType(),
1520                              /*SuperLoc=*/SourceLocation(), Sel, /*Method=*/0,
1521                              LBracLoc, SelectorLoc, RBracLoc, move(Args));
1522}
1523
1524enum ARCConversionTypeClass {
1525  ACTC_none,
1526  ACTC_retainable,
1527  ACTC_indirectRetainable
1528};
1529static ARCConversionTypeClass classifyTypeForARCConversion(QualType type) {
1530  ARCConversionTypeClass ACTC = ACTC_retainable;
1531
1532  // Ignore an outermost reference type.
1533  if (const ReferenceType *ref = type->getAs<ReferenceType>())
1534    type = ref->getPointeeType();
1535
1536  // Drill through pointers and arrays recursively.
1537  while (true) {
1538    if (const PointerType *ptr = type->getAs<PointerType>()) {
1539      type = ptr->getPointeeType();
1540    } else if (const ArrayType *array = type->getAsArrayTypeUnsafe()) {
1541      type = QualType(array->getElementType()->getBaseElementTypeUnsafe(), 0);
1542    } else {
1543      break;
1544    }
1545    ACTC = ACTC_indirectRetainable;
1546  }
1547
1548  if (!type->isObjCRetainableType()) return ACTC_none;
1549  return ACTC;
1550}
1551
1552namespace {
1553  /// Return true if the given expression can be reasonably converted
1554  /// between a retainable pointer type and a C pointer type.
1555  struct ARCCastChecker : StmtVisitor<ARCCastChecker, bool> {
1556    ASTContext &Context;
1557    ARCCastChecker(ASTContext &Context) : Context(Context) {}
1558    bool VisitStmt(Stmt *s) {
1559      return false;
1560    }
1561    bool VisitExpr(Expr *e) {
1562      return e->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull);
1563    }
1564
1565    bool VisitParenExpr(ParenExpr *e) {
1566      return Visit(e->getSubExpr());
1567    }
1568    bool VisitCastExpr(CastExpr *e) {
1569      switch (e->getCastKind()) {
1570        case CK_NullToPointer:
1571          return true;
1572        case CK_NoOp:
1573        case CK_LValueToRValue:
1574        case CK_BitCast:
1575        case CK_AnyPointerToObjCPointerCast:
1576        case CK_AnyPointerToBlockPointerCast:
1577          return Visit(e->getSubExpr());
1578        default:
1579          return false;
1580      }
1581    }
1582    bool VisitUnaryExtension(UnaryOperator *e) {
1583      return Visit(e->getSubExpr());
1584    }
1585    bool VisitBinComma(BinaryOperator *e) {
1586      return Visit(e->getRHS());
1587    }
1588    bool VisitConditionalOperator(ConditionalOperator *e) {
1589      // Conditional operators are okay if both sides are okay.
1590      return Visit(e->getTrueExpr()) && Visit(e->getFalseExpr());
1591    }
1592    bool VisitObjCStringLiteral(ObjCStringLiteral *e) {
1593      // Always white-list Objective-C string literals.
1594      return true;
1595    }
1596    bool VisitStmtExpr(StmtExpr *e) {
1597      return Visit(e->getSubStmt()->body_back());
1598    }
1599    bool VisitDeclRefExpr(DeclRefExpr *e) {
1600      // White-list references to global extern strings from system
1601      // headers.
1602      if (VarDecl *var = dyn_cast<VarDecl>(e->getDecl()))
1603        if (var->getStorageClass() == SC_Extern &&
1604            var->getType().isConstQualified() &&
1605            Context.getSourceManager().isInSystemHeader(var->getLocation()))
1606          return true;
1607      return false;
1608    }
1609  };
1610}
1611
1612bool
1613Sema::ValidObjCARCNoBridgeCastExpr(Expr *&Exp, QualType castType) {
1614  Expr *NewExp = Exp->IgnoreParenCasts();
1615
1616  if (!isa<ObjCMessageExpr>(NewExp) && !isa<ObjCPropertyRefExpr>(NewExp)
1617      && !isa<CallExpr>(NewExp))
1618    return false;
1619  ObjCMethodDecl *method = 0;
1620  bool MethodReturnsPlusOne = false;
1621
1622  if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(NewExp)) {
1623    method = PRE->getExplicitProperty()->getGetterMethodDecl();
1624  }
1625  else if (ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(NewExp))
1626    method = ME->getMethodDecl();
1627  else {
1628    CallExpr *CE = cast<CallExpr>(NewExp);
1629    Decl *CallDecl = CE->getCalleeDecl();
1630    if (!CallDecl)
1631      return false;
1632    if (CallDecl->hasAttr<CFReturnsNotRetainedAttr>())
1633      return true;
1634    MethodReturnsPlusOne = CallDecl->hasAttr<CFReturnsRetainedAttr>();
1635    if (!MethodReturnsPlusOne) {
1636      if (NamedDecl *ND = dyn_cast<NamedDecl>(CallDecl))
1637        if (const IdentifierInfo *Id = ND->getIdentifier())
1638          if (Id->isStr("__builtin___CFStringMakeConstantString"))
1639            return true;
1640    }
1641  }
1642
1643  if (!MethodReturnsPlusOne) {
1644    if (!method)
1645      return false;
1646    if (method->hasAttr<CFReturnsNotRetainedAttr>())
1647      return true;
1648    MethodReturnsPlusOne = method->hasAttr<CFReturnsRetainedAttr>();
1649    if (!MethodReturnsPlusOne) {
1650      ObjCMethodFamily family = method->getSelector().getMethodFamily();
1651      switch (family) {
1652        case OMF_alloc:
1653        case OMF_copy:
1654        case OMF_mutableCopy:
1655        case OMF_new:
1656          MethodReturnsPlusOne = true;
1657          break;
1658        default:
1659          break;
1660      }
1661    }
1662  }
1663
1664  if (MethodReturnsPlusOne) {
1665    TypeSourceInfo *TSInfo =
1666      Context.getTrivialTypeSourceInfo(castType, SourceLocation());
1667    ExprResult ExpRes = BuildObjCBridgedCast(SourceLocation(), OBC_BridgeTransfer,
1668                                             SourceLocation(), TSInfo, Exp);
1669    Exp = ExpRes.take();
1670  }
1671  return true;
1672}
1673
1674void
1675Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType,
1676                             Expr *&castExpr, CheckedConversionKind CCK) {
1677  QualType castExprType = castExpr->getType();
1678
1679  ARCConversionTypeClass exprACTC = classifyTypeForARCConversion(castExprType);
1680  ARCConversionTypeClass castACTC = classifyTypeForARCConversion(castType);
1681  if (exprACTC == castACTC) return;
1682  if (exprACTC && castType->isIntegralType(Context)) return;
1683
1684  // Allow casts between pointers to lifetime types (e.g., __strong id*)
1685  // and pointers to void (e.g., cv void *). Casting from void* to lifetime*
1686  // must be explicit.
1687  if (const PointerType *CastPtr = castType->getAs<PointerType>()) {
1688    if (const PointerType *CastExprPtr = castExprType->getAs<PointerType>()) {
1689      QualType CastPointee = CastPtr->getPointeeType();
1690      QualType CastExprPointee = CastExprPtr->getPointeeType();
1691      if ((CCK != CCK_ImplicitConversion &&
1692           CastPointee->isObjCIndirectLifetimeType() &&
1693           CastExprPointee->isVoidType()) ||
1694          (CastPointee->isVoidType() &&
1695           CastExprPointee->isObjCIndirectLifetimeType()))
1696        return;
1697    }
1698  }
1699
1700  if (ARCCastChecker(Context).Visit(castExpr))
1701    return;
1702
1703  SourceLocation loc =
1704  (castRange.isValid() ? castRange.getBegin() : castExpr->getExprLoc());
1705
1706  if (makeUnavailableInSystemHeader(loc,
1707                                    "converts between Objective-C and C pointers in -fobjc-arc"))
1708    return;
1709
1710  unsigned srcKind = 0;
1711  switch (exprACTC) {
1712    case ACTC_none:
1713      srcKind = (castExprType->isPointerType() ? 1 : 0);
1714      break;
1715    case ACTC_retainable:
1716      srcKind = (castExprType->isBlockPointerType() ? 2 : 3);
1717      break;
1718    case ACTC_indirectRetainable:
1719      srcKind = 4;
1720      break;
1721  }
1722
1723  if (CCK == CCK_CStyleCast) {
1724    // Check whether this could be fixed with a bridge cast.
1725    SourceLocation AfterLParen = PP.getLocForEndOfToken(castRange.getBegin());
1726    SourceLocation NoteLoc = AfterLParen.isValid()? AfterLParen : loc;
1727
1728    if (castType->isObjCARCBridgableType() &&
1729        castExprType->isCARCBridgableType()) {
1730      // explicit unbridged casts are allowed if the source of the cast is a
1731      // message sent to an objc method (or property access)
1732      if (ValidObjCARCNoBridgeCastExpr(castExpr, castType))
1733        return;
1734      Diag(loc, diag::err_arc_cast_requires_bridge)
1735        << 2
1736        << castExprType
1737        << (castType->isBlockPointerType()? 1 : 0)
1738        << castType
1739        << castRange
1740        << castExpr->getSourceRange();
1741      Diag(NoteLoc, diag::note_arc_bridge)
1742        << FixItHint::CreateInsertion(AfterLParen, "__bridge ");
1743      Diag(NoteLoc, diag::note_arc_bridge_transfer)
1744        << castExprType
1745        << FixItHint::CreateInsertion(AfterLParen, "__bridge_transfer ");
1746
1747      return;
1748    }
1749
1750    if (castType->isCARCBridgableType() &&
1751        castExprType->isObjCARCBridgableType()){
1752      Diag(loc, diag::err_arc_cast_requires_bridge)
1753        << (castExprType->isBlockPointerType()? 1 : 0)
1754        << castExprType
1755        << 2
1756        << castType
1757        << castRange
1758        << castExpr->getSourceRange();
1759
1760      Diag(NoteLoc, diag::note_arc_bridge)
1761        << FixItHint::CreateInsertion(AfterLParen, "__bridge ");
1762      Diag(NoteLoc, diag::note_arc_bridge_retained)
1763        << castType
1764        << FixItHint::CreateInsertion(AfterLParen, "__bridge_retained ");
1765      return;
1766    }
1767  }
1768
1769  Diag(loc, diag::err_arc_mismatched_cast)
1770    << (CCK != CCK_ImplicitConversion) << srcKind << castExprType << castType
1771    << castRange << castExpr->getSourceRange();
1772}
1773
1774ExprResult Sema::BuildObjCBridgedCast(SourceLocation LParenLoc,
1775                                      ObjCBridgeCastKind Kind,
1776                                      SourceLocation BridgeKeywordLoc,
1777                                      TypeSourceInfo *TSInfo,
1778                                      Expr *SubExpr) {
1779  QualType T = TSInfo->getType();
1780  QualType FromType = SubExpr->getType();
1781
1782  bool MustConsume = false;
1783  if (T->isDependentType() || SubExpr->isTypeDependent()) {
1784    // Okay: we'll build a dependent expression type.
1785  } else if (T->isObjCARCBridgableType() && FromType->isCARCBridgableType()) {
1786    // Casting CF -> id
1787    switch (Kind) {
1788    case OBC_Bridge:
1789      break;
1790
1791    case OBC_BridgeRetained:
1792      Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
1793        << 2
1794        << FromType
1795        << (T->isBlockPointerType()? 1 : 0)
1796        << T
1797        << SubExpr->getSourceRange()
1798        << Kind;
1799      Diag(BridgeKeywordLoc, diag::note_arc_bridge)
1800        << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge");
1801      Diag(BridgeKeywordLoc, diag::note_arc_bridge_transfer)
1802        << FromType
1803        << FixItHint::CreateReplacement(BridgeKeywordLoc,
1804                                        "__bridge_transfer ");
1805
1806      Kind = OBC_Bridge;
1807      break;
1808
1809    case OBC_BridgeTransfer:
1810      // We must consume the Objective-C object produced by the cast.
1811      MustConsume = true;
1812      break;
1813    }
1814  } else if (T->isCARCBridgableType() && FromType->isObjCARCBridgableType()) {
1815    // Okay: id -> CF
1816    switch (Kind) {
1817    case OBC_Bridge:
1818      break;
1819
1820    case OBC_BridgeRetained:
1821      // Produce the object before casting it.
1822      SubExpr = ImplicitCastExpr::Create(Context, FromType,
1823                                         CK_ObjCProduceObject,
1824                                         SubExpr, 0, VK_RValue);
1825      break;
1826
1827    case OBC_BridgeTransfer:
1828      Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
1829        << (FromType->isBlockPointerType()? 1 : 0)
1830        << FromType
1831        << 2
1832        << T
1833        << SubExpr->getSourceRange()
1834        << Kind;
1835
1836      Diag(BridgeKeywordLoc, diag::note_arc_bridge)
1837        << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge ");
1838      Diag(BridgeKeywordLoc, diag::note_arc_bridge_retained)
1839        << T
1840        << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge_retained ");
1841
1842      Kind = OBC_Bridge;
1843      break;
1844    }
1845  } else {
1846    Diag(LParenLoc, diag::err_arc_bridge_cast_incompatible)
1847      << FromType << T << Kind
1848      << SubExpr->getSourceRange()
1849      << TSInfo->getTypeLoc().getSourceRange();
1850    return ExprError();
1851  }
1852
1853  Expr *Result = new (Context) ObjCBridgedCastExpr(LParenLoc, Kind,
1854                                                   BridgeKeywordLoc,
1855                                                   TSInfo, SubExpr);
1856
1857  if (MustConsume) {
1858    ExprNeedsCleanups = true;
1859    Result = ImplicitCastExpr::Create(Context, T, CK_ObjCConsumeObject, Result,
1860                                      0, VK_RValue);
1861  }
1862
1863  return Result;
1864}
1865
1866ExprResult Sema::ActOnObjCBridgedCast(Scope *S,
1867                                      SourceLocation LParenLoc,
1868                                      ObjCBridgeCastKind Kind,
1869                                      SourceLocation BridgeKeywordLoc,
1870                                      ParsedType Type,
1871                                      SourceLocation RParenLoc,
1872                                      Expr *SubExpr) {
1873  TypeSourceInfo *TSInfo = 0;
1874  QualType T = GetTypeFromParser(Type, &TSInfo);
1875  if (!TSInfo)
1876    TSInfo = Context.getTrivialTypeSourceInfo(T, LParenLoc);
1877  return BuildObjCBridgedCast(LParenLoc, Kind, BridgeKeywordLoc, TSInfo,
1878                              SubExpr);
1879}
1880