• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/AST/ASTContext.h"
16  #include "clang/AST/DeclObjC.h"
17  #include "clang/AST/ExprObjC.h"
18  #include "clang/AST/StmtVisitor.h"
19  #include "clang/AST/TypeLoc.h"
20  #include "clang/Analysis/DomainSpecific/CocoaConventions.h"
21  #include "clang/Edit/Commit.h"
22  #include "clang/Edit/Rewriters.h"
23  #include "clang/Lex/Preprocessor.h"
24  #include "clang/Sema/Initialization.h"
25  #include "clang/Sema/Lookup.h"
26  #include "clang/Sema/Scope.h"
27  #include "clang/Sema/ScopeInfo.h"
28  #include "llvm/ADT/SmallString.h"
29  
30  using namespace clang;
31  using namespace sema;
32  using llvm::makeArrayRef;
33  
ParseObjCStringLiteral(SourceLocation * AtLocs,Expr ** strings,unsigned NumStrings)34  ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs,
35                                          Expr **strings,
36                                          unsigned NumStrings) {
37    StringLiteral **Strings = reinterpret_cast<StringLiteral**>(strings);
38  
39    // Most ObjC strings are formed out of a single piece.  However, we *can*
40    // have strings formed out of multiple @ strings with multiple pptokens in
41    // each one, e.g. @"foo" "bar" @"baz" "qux"   which need to be turned into one
42    // StringLiteral for ObjCStringLiteral to hold onto.
43    StringLiteral *S = Strings[0];
44  
45    // If we have a multi-part string, merge it all together.
46    if (NumStrings != 1) {
47      // Concatenate objc strings.
48      SmallString<128> StrBuf;
49      SmallVector<SourceLocation, 8> StrLocs;
50  
51      for (unsigned i = 0; i != NumStrings; ++i) {
52        S = Strings[i];
53  
54        // ObjC strings can't be wide or UTF.
55        if (!S->isAscii()) {
56          Diag(S->getLocStart(), diag::err_cfstring_literal_not_string_constant)
57            << S->getSourceRange();
58          return true;
59        }
60  
61        // Append the string.
62        StrBuf += S->getString();
63  
64        // Get the locations of the string tokens.
65        StrLocs.append(S->tokloc_begin(), S->tokloc_end());
66      }
67  
68      // Create the aggregate string with the appropriate content and location
69      // information.
70      const ConstantArrayType *CAT = Context.getAsConstantArrayType(S->getType());
71      assert(CAT && "String literal not of constant array type!");
72      QualType StrTy = Context.getConstantArrayType(
73          CAT->getElementType(), llvm::APInt(32, StrBuf.size() + 1),
74          CAT->getSizeModifier(), CAT->getIndexTypeCVRQualifiers());
75      S = StringLiteral::Create(Context, StrBuf, StringLiteral::Ascii,
76                                /*Pascal=*/false, StrTy, &StrLocs[0],
77                                StrLocs.size());
78    }
79  
80    return BuildObjCStringLiteral(AtLocs[0], S);
81  }
82  
BuildObjCStringLiteral(SourceLocation AtLoc,StringLiteral * S)83  ExprResult Sema::BuildObjCStringLiteral(SourceLocation AtLoc, StringLiteral *S){
84    // Verify that this composite string is acceptable for ObjC strings.
85    if (CheckObjCString(S))
86      return true;
87  
88    // Initialize the constant string interface lazily. This assumes
89    // the NSString interface is seen in this translation unit. Note: We
90    // don't use NSConstantString, since the runtime team considers this
91    // interface private (even though it appears in the header files).
92    QualType Ty = Context.getObjCConstantStringInterface();
93    if (!Ty.isNull()) {
94      Ty = Context.getObjCObjectPointerType(Ty);
95    } else if (getLangOpts().NoConstantCFStrings) {
96      IdentifierInfo *NSIdent=nullptr;
97      std::string StringClass(getLangOpts().ObjCConstantStringClass);
98  
99      if (StringClass.empty())
100        NSIdent = &Context.Idents.get("NSConstantString");
101      else
102        NSIdent = &Context.Idents.get(StringClass);
103  
104      NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLoc,
105                                       LookupOrdinaryName);
106      if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) {
107        Context.setObjCConstantStringInterface(StrIF);
108        Ty = Context.getObjCConstantStringInterface();
109        Ty = Context.getObjCObjectPointerType(Ty);
110      } else {
111        // If there is no NSConstantString interface defined then treat this
112        // as error and recover from it.
113        Diag(S->getLocStart(), diag::err_no_nsconstant_string_class) << NSIdent
114          << S->getSourceRange();
115        Ty = Context.getObjCIdType();
116      }
117    } else {
118      IdentifierInfo *NSIdent = NSAPIObj->getNSClassId(NSAPI::ClassId_NSString);
119      NamedDecl *IF = LookupSingleName(TUScope, NSIdent, AtLoc,
120                                       LookupOrdinaryName);
121      if (ObjCInterfaceDecl *StrIF = dyn_cast_or_null<ObjCInterfaceDecl>(IF)) {
122        Context.setObjCConstantStringInterface(StrIF);
123        Ty = Context.getObjCConstantStringInterface();
124        Ty = Context.getObjCObjectPointerType(Ty);
125      } else {
126        // If there is no NSString interface defined, implicitly declare
127        // a @class NSString; and use that instead. This is to make sure
128        // type of an NSString literal is represented correctly, instead of
129        // being an 'id' type.
130        Ty = Context.getObjCNSStringType();
131        if (Ty.isNull()) {
132          ObjCInterfaceDecl *NSStringIDecl =
133            ObjCInterfaceDecl::Create (Context,
134                                       Context.getTranslationUnitDecl(),
135                                       SourceLocation(), NSIdent,
136                                       nullptr, nullptr, SourceLocation());
137          Ty = Context.getObjCInterfaceType(NSStringIDecl);
138          Context.setObjCNSStringType(Ty);
139        }
140        Ty = Context.getObjCObjectPointerType(Ty);
141      }
142    }
143  
144    return new (Context) ObjCStringLiteral(S, Ty, AtLoc);
145  }
146  
147  /// \brief Emits an error if the given method does not exist, or if the return
148  /// type is not an Objective-C object.
validateBoxingMethod(Sema & S,SourceLocation Loc,const ObjCInterfaceDecl * Class,Selector Sel,const ObjCMethodDecl * Method)149  static bool validateBoxingMethod(Sema &S, SourceLocation Loc,
150                                   const ObjCInterfaceDecl *Class,
151                                   Selector Sel, const ObjCMethodDecl *Method) {
152    if (!Method) {
153      // FIXME: Is there a better way to avoid quotes than using getName()?
154      S.Diag(Loc, diag::err_undeclared_boxing_method) << Sel << Class->getName();
155      return false;
156    }
157  
158    // Make sure the return type is reasonable.
159    QualType ReturnType = Method->getReturnType();
160    if (!ReturnType->isObjCObjectPointerType()) {
161      S.Diag(Loc, diag::err_objc_literal_method_sig)
162        << Sel;
163      S.Diag(Method->getLocation(), diag::note_objc_literal_method_return)
164        << ReturnType;
165      return false;
166    }
167  
168    return true;
169  }
170  
171  /// \brief Maps ObjCLiteralKind to NSClassIdKindKind
ClassKindFromLiteralKind(Sema::ObjCLiteralKind LiteralKind)172  static NSAPI::NSClassIdKindKind ClassKindFromLiteralKind(
173                                              Sema::ObjCLiteralKind LiteralKind) {
174    switch (LiteralKind) {
175      case Sema::LK_Array:
176        return NSAPI::ClassId_NSArray;
177      case Sema::LK_Dictionary:
178        return NSAPI::ClassId_NSDictionary;
179      case Sema::LK_Numeric:
180        return NSAPI::ClassId_NSNumber;
181      case Sema::LK_String:
182        return NSAPI::ClassId_NSString;
183      case Sema::LK_Boxed:
184        return NSAPI::ClassId_NSValue;
185  
186      // there is no corresponding matching
187      // between LK_None/LK_Block and NSClassIdKindKind
188      case Sema::LK_Block:
189      case Sema::LK_None:
190        break;
191    }
192    llvm_unreachable("LiteralKind can't be converted into a ClassKind");
193  }
194  
195  /// \brief Validates ObjCInterfaceDecl availability.
196  /// ObjCInterfaceDecl, used to create ObjC literals, should be defined
197  /// if clang not in a debugger mode.
ValidateObjCLiteralInterfaceDecl(Sema & S,ObjCInterfaceDecl * Decl,SourceLocation Loc,Sema::ObjCLiteralKind LiteralKind)198  static bool ValidateObjCLiteralInterfaceDecl(Sema &S, ObjCInterfaceDecl *Decl,
199                                              SourceLocation Loc,
200                                              Sema::ObjCLiteralKind LiteralKind) {
201    if (!Decl) {
202      NSAPI::NSClassIdKindKind Kind = ClassKindFromLiteralKind(LiteralKind);
203      IdentifierInfo *II = S.NSAPIObj->getNSClassId(Kind);
204      S.Diag(Loc, diag::err_undeclared_objc_literal_class)
205        << II->getName() << LiteralKind;
206      return false;
207    } else if (!Decl->hasDefinition() && !S.getLangOpts().DebuggerObjCLiteral) {
208      S.Diag(Loc, diag::err_undeclared_objc_literal_class)
209        << Decl->getName() << LiteralKind;
210      S.Diag(Decl->getLocation(), diag::note_forward_class);
211      return false;
212    }
213  
214    return true;
215  }
216  
217  /// \brief Looks up ObjCInterfaceDecl of a given NSClassIdKindKind.
218  /// Used to create ObjC literals, such as NSDictionary (@{}),
219  /// NSArray (@[]) and Boxed Expressions (@())
LookupObjCInterfaceDeclForLiteral(Sema & S,SourceLocation Loc,Sema::ObjCLiteralKind LiteralKind)220  static ObjCInterfaceDecl *LookupObjCInterfaceDeclForLiteral(Sema &S,
221                                              SourceLocation Loc,
222                                              Sema::ObjCLiteralKind LiteralKind) {
223    NSAPI::NSClassIdKindKind ClassKind = ClassKindFromLiteralKind(LiteralKind);
224    IdentifierInfo *II = S.NSAPIObj->getNSClassId(ClassKind);
225    NamedDecl *IF = S.LookupSingleName(S.TUScope, II, Loc,
226                                       Sema::LookupOrdinaryName);
227    ObjCInterfaceDecl *ID = dyn_cast_or_null<ObjCInterfaceDecl>(IF);
228    if (!ID && S.getLangOpts().DebuggerObjCLiteral) {
229      ASTContext &Context = S.Context;
230      TranslationUnitDecl *TU = Context.getTranslationUnitDecl();
231      ID = ObjCInterfaceDecl::Create (Context, TU, SourceLocation(), II,
232                                      nullptr, nullptr, SourceLocation());
233    }
234  
235    if (!ValidateObjCLiteralInterfaceDecl(S, ID, Loc, LiteralKind)) {
236      ID = nullptr;
237    }
238  
239    return ID;
240  }
241  
242  /// \brief Retrieve the NSNumber factory method that should be used to create
243  /// an Objective-C literal for the given type.
getNSNumberFactoryMethod(Sema & S,SourceLocation Loc,QualType NumberType,bool isLiteral=false,SourceRange R=SourceRange ())244  static ObjCMethodDecl *getNSNumberFactoryMethod(Sema &S, SourceLocation Loc,
245                                                  QualType NumberType,
246                                                  bool isLiteral = false,
247                                                  SourceRange R = SourceRange()) {
248    Optional<NSAPI::NSNumberLiteralMethodKind> Kind =
249        S.NSAPIObj->getNSNumberFactoryMethodKind(NumberType);
250  
251    if (!Kind) {
252      if (isLiteral) {
253        S.Diag(Loc, diag::err_invalid_nsnumber_type)
254          << NumberType << R;
255      }
256      return nullptr;
257    }
258  
259    // If we already looked up this method, we're done.
260    if (S.NSNumberLiteralMethods[*Kind])
261      return S.NSNumberLiteralMethods[*Kind];
262  
263    Selector Sel = S.NSAPIObj->getNSNumberLiteralSelector(*Kind,
264                                                          /*Instance=*/false);
265  
266    ASTContext &CX = S.Context;
267  
268    // Look up the NSNumber class, if we haven't done so already. It's cached
269    // in the Sema instance.
270    if (!S.NSNumberDecl) {
271      S.NSNumberDecl = LookupObjCInterfaceDeclForLiteral(S, Loc,
272                                                         Sema::LK_Numeric);
273      if (!S.NSNumberDecl) {
274        return nullptr;
275      }
276    }
277  
278    if (S.NSNumberPointer.isNull()) {
279      // generate the pointer to NSNumber type.
280      QualType NSNumberObject = CX.getObjCInterfaceType(S.NSNumberDecl);
281      S.NSNumberPointer = CX.getObjCObjectPointerType(NSNumberObject);
282    }
283  
284    // Look for the appropriate method within NSNumber.
285    ObjCMethodDecl *Method = S.NSNumberDecl->lookupClassMethod(Sel);
286    if (!Method && S.getLangOpts().DebuggerObjCLiteral) {
287      // create a stub definition this NSNumber factory method.
288      TypeSourceInfo *ReturnTInfo = nullptr;
289      Method =
290          ObjCMethodDecl::Create(CX, SourceLocation(), SourceLocation(), Sel,
291                                 S.NSNumberPointer, ReturnTInfo, S.NSNumberDecl,
292                                 /*isInstance=*/false, /*isVariadic=*/false,
293                                 /*isPropertyAccessor=*/false,
294                                 /*isImplicitlyDeclared=*/true,
295                                 /*isDefined=*/false, ObjCMethodDecl::Required,
296                                 /*HasRelatedResultType=*/false);
297      ParmVarDecl *value = ParmVarDecl::Create(S.Context, Method,
298                                               SourceLocation(), SourceLocation(),
299                                               &CX.Idents.get("value"),
300                                               NumberType, /*TInfo=*/nullptr,
301                                               SC_None, nullptr);
302      Method->setMethodParams(S.Context, value, None);
303    }
304  
305    if (!validateBoxingMethod(S, Loc, S.NSNumberDecl, Sel, Method))
306      return nullptr;
307  
308    // Note: if the parameter type is out-of-line, we'll catch it later in the
309    // implicit conversion.
310  
311    S.NSNumberLiteralMethods[*Kind] = Method;
312    return Method;
313  }
314  
315  /// BuildObjCNumericLiteral - builds an ObjCBoxedExpr AST node for the
316  /// numeric literal expression. Type of the expression will be "NSNumber *".
BuildObjCNumericLiteral(SourceLocation AtLoc,Expr * Number)317  ExprResult Sema::BuildObjCNumericLiteral(SourceLocation AtLoc, Expr *Number) {
318    // Determine the type of the literal.
319    QualType NumberType = Number->getType();
320    if (CharacterLiteral *Char = dyn_cast<CharacterLiteral>(Number)) {
321      // In C, character literals have type 'int'. That's not the type we want
322      // to use to determine the Objective-c literal kind.
323      switch (Char->getKind()) {
324      case CharacterLiteral::Ascii:
325        NumberType = Context.CharTy;
326        break;
327  
328      case CharacterLiteral::Wide:
329        NumberType = Context.getWideCharType();
330        break;
331  
332      case CharacterLiteral::UTF16:
333        NumberType = Context.Char16Ty;
334        break;
335  
336      case CharacterLiteral::UTF32:
337        NumberType = Context.Char32Ty;
338        break;
339      }
340    }
341  
342    // Look for the appropriate method within NSNumber.
343    // Construct the literal.
344    SourceRange NR(Number->getSourceRange());
345    ObjCMethodDecl *Method = getNSNumberFactoryMethod(*this, AtLoc, NumberType,
346                                                      true, NR);
347    if (!Method)
348      return ExprError();
349  
350    // Convert the number to the type that the parameter expects.
351    ParmVarDecl *ParamDecl = Method->parameters()[0];
352    InitializedEntity Entity = InitializedEntity::InitializeParameter(Context,
353                                                                      ParamDecl);
354    ExprResult ConvertedNumber = PerformCopyInitialization(Entity,
355                                                           SourceLocation(),
356                                                           Number);
357    if (ConvertedNumber.isInvalid())
358      return ExprError();
359    Number = ConvertedNumber.get();
360  
361    // Use the effective source range of the literal, including the leading '@'.
362    return MaybeBindToTemporary(
363             new (Context) ObjCBoxedExpr(Number, NSNumberPointer, Method,
364                                         SourceRange(AtLoc, NR.getEnd())));
365  }
366  
ActOnObjCBoolLiteral(SourceLocation AtLoc,SourceLocation ValueLoc,bool Value)367  ExprResult Sema::ActOnObjCBoolLiteral(SourceLocation AtLoc,
368                                        SourceLocation ValueLoc,
369                                        bool Value) {
370    ExprResult Inner;
371    if (getLangOpts().CPlusPlus) {
372      Inner = ActOnCXXBoolLiteral(ValueLoc, Value? tok::kw_true : tok::kw_false);
373    } else {
374      // C doesn't actually have a way to represent literal values of type
375      // _Bool. So, we'll use 0/1 and implicit cast to _Bool.
376      Inner = ActOnIntegerConstant(ValueLoc, Value? 1 : 0);
377      Inner = ImpCastExprToType(Inner.get(), Context.BoolTy,
378                                CK_IntegralToBoolean);
379    }
380  
381    return BuildObjCNumericLiteral(AtLoc, Inner.get());
382  }
383  
384  /// \brief Check that the given expression is a valid element of an Objective-C
385  /// collection literal.
CheckObjCCollectionLiteralElement(Sema & S,Expr * Element,QualType T,bool ArrayLiteral=false)386  static ExprResult CheckObjCCollectionLiteralElement(Sema &S, Expr *Element,
387                                                      QualType T,
388                                                      bool ArrayLiteral = false) {
389    // If the expression is type-dependent, there's nothing for us to do.
390    if (Element->isTypeDependent())
391      return Element;
392  
393    ExprResult Result = S.CheckPlaceholderExpr(Element);
394    if (Result.isInvalid())
395      return ExprError();
396    Element = Result.get();
397  
398    // In C++, check for an implicit conversion to an Objective-C object pointer
399    // type.
400    if (S.getLangOpts().CPlusPlus && Element->getType()->isRecordType()) {
401      InitializedEntity Entity
402        = InitializedEntity::InitializeParameter(S.Context, T,
403                                                 /*Consumed=*/false);
404      InitializationKind Kind
405        = InitializationKind::CreateCopy(Element->getLocStart(),
406                                         SourceLocation());
407      InitializationSequence Seq(S, Entity, Kind, Element);
408      if (!Seq.Failed())
409        return Seq.Perform(S, Entity, Kind, Element);
410    }
411  
412    Expr *OrigElement = Element;
413  
414    // Perform lvalue-to-rvalue conversion.
415    Result = S.DefaultLvalueConversion(Element);
416    if (Result.isInvalid())
417      return ExprError();
418    Element = Result.get();
419  
420    // Make sure that we have an Objective-C pointer type or block.
421    if (!Element->getType()->isObjCObjectPointerType() &&
422        !Element->getType()->isBlockPointerType()) {
423      bool Recovered = false;
424  
425      // If this is potentially an Objective-C numeric literal, add the '@'.
426      if (isa<IntegerLiteral>(OrigElement) ||
427          isa<CharacterLiteral>(OrigElement) ||
428          isa<FloatingLiteral>(OrigElement) ||
429          isa<ObjCBoolLiteralExpr>(OrigElement) ||
430          isa<CXXBoolLiteralExpr>(OrigElement)) {
431        if (S.NSAPIObj->getNSNumberFactoryMethodKind(OrigElement->getType())) {
432          int Which = isa<CharacterLiteral>(OrigElement) ? 1
433                    : (isa<CXXBoolLiteralExpr>(OrigElement) ||
434                       isa<ObjCBoolLiteralExpr>(OrigElement)) ? 2
435                    : 3;
436  
437          S.Diag(OrigElement->getLocStart(), diag::err_box_literal_collection)
438            << Which << OrigElement->getSourceRange()
439            << FixItHint::CreateInsertion(OrigElement->getLocStart(), "@");
440  
441          Result = S.BuildObjCNumericLiteral(OrigElement->getLocStart(),
442                                             OrigElement);
443          if (Result.isInvalid())
444            return ExprError();
445  
446          Element = Result.get();
447          Recovered = true;
448        }
449      }
450      // If this is potentially an Objective-C string literal, add the '@'.
451      else if (StringLiteral *String = dyn_cast<StringLiteral>(OrigElement)) {
452        if (String->isAscii()) {
453          S.Diag(OrigElement->getLocStart(), diag::err_box_literal_collection)
454            << 0 << OrigElement->getSourceRange()
455            << FixItHint::CreateInsertion(OrigElement->getLocStart(), "@");
456  
457          Result = S.BuildObjCStringLiteral(OrigElement->getLocStart(), String);
458          if (Result.isInvalid())
459            return ExprError();
460  
461          Element = Result.get();
462          Recovered = true;
463        }
464      }
465  
466      if (!Recovered) {
467        S.Diag(Element->getLocStart(), diag::err_invalid_collection_element)
468          << Element->getType();
469        return ExprError();
470      }
471    }
472    if (ArrayLiteral)
473      if (ObjCStringLiteral *getString =
474            dyn_cast<ObjCStringLiteral>(OrigElement)) {
475        if (StringLiteral *SL = getString->getString()) {
476          unsigned numConcat = SL->getNumConcatenated();
477          if (numConcat > 1) {
478            // Only warn if the concatenated string doesn't come from a macro.
479            bool hasMacro = false;
480            for (unsigned i = 0; i < numConcat ; ++i)
481              if (SL->getStrTokenLoc(i).isMacroID()) {
482                hasMacro = true;
483                break;
484              }
485            if (!hasMacro)
486              S.Diag(Element->getLocStart(),
487                     diag::warn_concatenated_nsarray_literal)
488                << Element->getType();
489          }
490        }
491      }
492  
493    // Make sure that the element has the type that the container factory
494    // function expects.
495    return S.PerformCopyInitialization(
496             InitializedEntity::InitializeParameter(S.Context, T,
497                                                    /*Consumed=*/false),
498             Element->getLocStart(), Element);
499  }
500  
BuildObjCBoxedExpr(SourceRange SR,Expr * ValueExpr)501  ExprResult Sema::BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
502    if (ValueExpr->isTypeDependent()) {
503      ObjCBoxedExpr *BoxedExpr =
504        new (Context) ObjCBoxedExpr(ValueExpr, Context.DependentTy, nullptr, SR);
505      return BoxedExpr;
506    }
507    ObjCMethodDecl *BoxingMethod = nullptr;
508    QualType BoxedType;
509    // Convert the expression to an RValue, so we can check for pointer types...
510    ExprResult RValue = DefaultFunctionArrayLvalueConversion(ValueExpr);
511    if (RValue.isInvalid()) {
512      return ExprError();
513    }
514    SourceLocation Loc = SR.getBegin();
515    ValueExpr = RValue.get();
516    QualType ValueType(ValueExpr->getType());
517    if (const PointerType *PT = ValueType->getAs<PointerType>()) {
518      QualType PointeeType = PT->getPointeeType();
519      if (Context.hasSameUnqualifiedType(PointeeType, Context.CharTy)) {
520  
521        if (!NSStringDecl) {
522          NSStringDecl = LookupObjCInterfaceDeclForLiteral(*this, Loc,
523                                                           Sema::LK_String);
524          if (!NSStringDecl) {
525            return ExprError();
526          }
527          QualType NSStringObject = Context.getObjCInterfaceType(NSStringDecl);
528          NSStringPointer = Context.getObjCObjectPointerType(NSStringObject);
529        }
530  
531        if (!StringWithUTF8StringMethod) {
532          IdentifierInfo *II = &Context.Idents.get("stringWithUTF8String");
533          Selector stringWithUTF8String = Context.Selectors.getUnarySelector(II);
534  
535          // Look for the appropriate method within NSString.
536          BoxingMethod = NSStringDecl->lookupClassMethod(stringWithUTF8String);
537          if (!BoxingMethod && getLangOpts().DebuggerObjCLiteral) {
538            // Debugger needs to work even if NSString hasn't been defined.
539            TypeSourceInfo *ReturnTInfo = nullptr;
540            ObjCMethodDecl *M = ObjCMethodDecl::Create(
541                Context, SourceLocation(), SourceLocation(), stringWithUTF8String,
542                NSStringPointer, ReturnTInfo, NSStringDecl,
543                /*isInstance=*/false, /*isVariadic=*/false,
544                /*isPropertyAccessor=*/false,
545                /*isImplicitlyDeclared=*/true,
546                /*isDefined=*/false, ObjCMethodDecl::Required,
547                /*HasRelatedResultType=*/false);
548            QualType ConstCharType = Context.CharTy.withConst();
549            ParmVarDecl *value =
550              ParmVarDecl::Create(Context, M,
551                                  SourceLocation(), SourceLocation(),
552                                  &Context.Idents.get("value"),
553                                  Context.getPointerType(ConstCharType),
554                                  /*TInfo=*/nullptr,
555                                  SC_None, nullptr);
556            M->setMethodParams(Context, value, None);
557            BoxingMethod = M;
558          }
559  
560          if (!validateBoxingMethod(*this, Loc, NSStringDecl,
561                                    stringWithUTF8String, BoxingMethod))
562             return ExprError();
563  
564          StringWithUTF8StringMethod = BoxingMethod;
565        }
566  
567        BoxingMethod = StringWithUTF8StringMethod;
568        BoxedType = NSStringPointer;
569      }
570    } else if (ValueType->isBuiltinType()) {
571      // The other types we support are numeric, char and BOOL/bool. We could also
572      // provide limited support for structure types, such as NSRange, NSRect, and
573      // NSSize. See NSValue (NSValueGeometryExtensions) in <Foundation/NSGeometry.h>
574      // for more details.
575  
576      // Check for a top-level character literal.
577      if (const CharacterLiteral *Char =
578          dyn_cast<CharacterLiteral>(ValueExpr->IgnoreParens())) {
579        // In C, character literals have type 'int'. That's not the type we want
580        // to use to determine the Objective-c literal kind.
581        switch (Char->getKind()) {
582        case CharacterLiteral::Ascii:
583          ValueType = Context.CharTy;
584          break;
585  
586        case CharacterLiteral::Wide:
587          ValueType = Context.getWideCharType();
588          break;
589  
590        case CharacterLiteral::UTF16:
591          ValueType = Context.Char16Ty;
592          break;
593  
594        case CharacterLiteral::UTF32:
595          ValueType = Context.Char32Ty;
596          break;
597        }
598      }
599      CheckForIntOverflow(ValueExpr);
600      // FIXME:  Do I need to do anything special with BoolTy expressions?
601  
602      // Look for the appropriate method within NSNumber.
603      BoxingMethod = getNSNumberFactoryMethod(*this, Loc, ValueType);
604      BoxedType = NSNumberPointer;
605    } else if (const EnumType *ET = ValueType->getAs<EnumType>()) {
606      if (!ET->getDecl()->isComplete()) {
607        Diag(Loc, diag::err_objc_incomplete_boxed_expression_type)
608          << ValueType << ValueExpr->getSourceRange();
609        return ExprError();
610      }
611  
612      BoxingMethod = getNSNumberFactoryMethod(*this, Loc,
613                                              ET->getDecl()->getIntegerType());
614      BoxedType = NSNumberPointer;
615    } else if (ValueType->isObjCBoxableRecordType()) {
616      // Support for structure types, that marked as objc_boxable
617      // struct __attribute__((objc_boxable)) s { ... };
618  
619      // Look up the NSValue class, if we haven't done so already. It's cached
620      // in the Sema instance.
621      if (!NSValueDecl) {
622        NSValueDecl = LookupObjCInterfaceDeclForLiteral(*this, Loc,
623                                                        Sema::LK_Boxed);
624        if (!NSValueDecl) {
625          return ExprError();
626        }
627  
628        // generate the pointer to NSValue type.
629        QualType NSValueObject = Context.getObjCInterfaceType(NSValueDecl);
630        NSValuePointer = Context.getObjCObjectPointerType(NSValueObject);
631      }
632  
633      if (!ValueWithBytesObjCTypeMethod) {
634        IdentifierInfo *II[] = {
635          &Context.Idents.get("valueWithBytes"),
636          &Context.Idents.get("objCType")
637        };
638        Selector ValueWithBytesObjCType = Context.Selectors.getSelector(2, II);
639  
640        // Look for the appropriate method within NSValue.
641        BoxingMethod = NSValueDecl->lookupClassMethod(ValueWithBytesObjCType);
642        if (!BoxingMethod && getLangOpts().DebuggerObjCLiteral) {
643          // Debugger needs to work even if NSValue hasn't been defined.
644          TypeSourceInfo *ReturnTInfo = nullptr;
645          ObjCMethodDecl *M = ObjCMethodDecl::Create(
646                                                 Context,
647                                                 SourceLocation(),
648                                                 SourceLocation(),
649                                                 ValueWithBytesObjCType,
650                                                 NSValuePointer,
651                                                 ReturnTInfo,
652                                                 NSValueDecl,
653                                                 /*isInstance=*/false,
654                                                 /*isVariadic=*/false,
655                                                 /*isPropertyAccessor=*/false,
656                                                 /*isImplicitlyDeclared=*/true,
657                                                 /*isDefined=*/false,
658                                                 ObjCMethodDecl::Required,
659                                                 /*HasRelatedResultType=*/false);
660  
661          SmallVector<ParmVarDecl *, 2> Params;
662  
663          ParmVarDecl *bytes =
664          ParmVarDecl::Create(Context, M,
665                              SourceLocation(), SourceLocation(),
666                              &Context.Idents.get("bytes"),
667                              Context.VoidPtrTy.withConst(),
668                              /*TInfo=*/nullptr,
669                              SC_None, nullptr);
670          Params.push_back(bytes);
671  
672          QualType ConstCharType = Context.CharTy.withConst();
673          ParmVarDecl *type =
674          ParmVarDecl::Create(Context, M,
675                              SourceLocation(), SourceLocation(),
676                              &Context.Idents.get("type"),
677                              Context.getPointerType(ConstCharType),
678                              /*TInfo=*/nullptr,
679                              SC_None, nullptr);
680          Params.push_back(type);
681  
682          M->setMethodParams(Context, Params, None);
683          BoxingMethod = M;
684        }
685  
686        if (!validateBoxingMethod(*this, Loc, NSValueDecl,
687                                  ValueWithBytesObjCType, BoxingMethod))
688          return ExprError();
689  
690        ValueWithBytesObjCTypeMethod = BoxingMethod;
691      }
692  
693      if (!ValueType.isTriviallyCopyableType(Context)) {
694        Diag(Loc, diag::err_objc_non_trivially_copyable_boxed_expression_type)
695          << ValueType << ValueExpr->getSourceRange();
696        return ExprError();
697      }
698  
699      BoxingMethod = ValueWithBytesObjCTypeMethod;
700      BoxedType = NSValuePointer;
701    }
702  
703    if (!BoxingMethod) {
704      Diag(Loc, diag::err_objc_illegal_boxed_expression_type)
705        << ValueType << ValueExpr->getSourceRange();
706      return ExprError();
707    }
708  
709    DiagnoseUseOfDecl(BoxingMethod, Loc);
710  
711    ExprResult ConvertedValueExpr;
712    if (ValueType->isObjCBoxableRecordType()) {
713      InitializedEntity IE = InitializedEntity::InitializeTemporary(ValueType);
714      ConvertedValueExpr = PerformCopyInitialization(IE, ValueExpr->getExprLoc(),
715                                                     ValueExpr);
716    } else {
717      // Convert the expression to the type that the parameter requires.
718      ParmVarDecl *ParamDecl = BoxingMethod->parameters()[0];
719      InitializedEntity IE = InitializedEntity::InitializeParameter(Context,
720                                                                    ParamDecl);
721      ConvertedValueExpr = PerformCopyInitialization(IE, SourceLocation(),
722                                                     ValueExpr);
723    }
724  
725    if (ConvertedValueExpr.isInvalid())
726      return ExprError();
727    ValueExpr = ConvertedValueExpr.get();
728  
729    ObjCBoxedExpr *BoxedExpr =
730      new (Context) ObjCBoxedExpr(ValueExpr, BoxedType,
731                                        BoxingMethod, SR);
732    return MaybeBindToTemporary(BoxedExpr);
733  }
734  
735  /// Build an ObjC subscript pseudo-object expression, given that
736  /// that's supported by the runtime.
BuildObjCSubscriptExpression(SourceLocation RB,Expr * BaseExpr,Expr * IndexExpr,ObjCMethodDecl * getterMethod,ObjCMethodDecl * setterMethod)737  ExprResult Sema::BuildObjCSubscriptExpression(SourceLocation RB, Expr *BaseExpr,
738                                          Expr *IndexExpr,
739                                          ObjCMethodDecl *getterMethod,
740                                          ObjCMethodDecl *setterMethod) {
741    assert(!LangOpts.isSubscriptPointerArithmetic());
742  
743    // We can't get dependent types here; our callers should have
744    // filtered them out.
745    assert((!BaseExpr->isTypeDependent() && !IndexExpr->isTypeDependent()) &&
746           "base or index cannot have dependent type here");
747  
748    // Filter out placeholders in the index.  In theory, overloads could
749    // be preserved here, although that might not actually work correctly.
750    ExprResult Result = CheckPlaceholderExpr(IndexExpr);
751    if (Result.isInvalid())
752      return ExprError();
753    IndexExpr = Result.get();
754  
755    // Perform lvalue-to-rvalue conversion on the base.
756    Result = DefaultLvalueConversion(BaseExpr);
757    if (Result.isInvalid())
758      return ExprError();
759    BaseExpr = Result.get();
760  
761    // Build the pseudo-object expression.
762    return ObjCSubscriptRefExpr::Create(Context, BaseExpr, IndexExpr,
763                                        Context.PseudoObjectTy, getterMethod,
764                                        setterMethod, RB);
765  }
766  
BuildObjCArrayLiteral(SourceRange SR,MultiExprArg Elements)767  ExprResult Sema::BuildObjCArrayLiteral(SourceRange SR, MultiExprArg Elements) {
768    SourceLocation Loc = SR.getBegin();
769  
770    if (!NSArrayDecl) {
771      NSArrayDecl = LookupObjCInterfaceDeclForLiteral(*this, Loc,
772                                                      Sema::LK_Array);
773      if (!NSArrayDecl) {
774        return ExprError();
775      }
776    }
777  
778    // Find the arrayWithObjects:count: method, if we haven't done so already.
779    QualType IdT = Context.getObjCIdType();
780    if (!ArrayWithObjectsMethod) {
781      Selector
782        Sel = NSAPIObj->getNSArraySelector(NSAPI::NSArr_arrayWithObjectsCount);
783      ObjCMethodDecl *Method = NSArrayDecl->lookupClassMethod(Sel);
784      if (!Method && getLangOpts().DebuggerObjCLiteral) {
785        TypeSourceInfo *ReturnTInfo = nullptr;
786        Method = ObjCMethodDecl::Create(
787            Context, SourceLocation(), SourceLocation(), Sel, IdT, ReturnTInfo,
788            Context.getTranslationUnitDecl(), false /*Instance*/,
789            false /*isVariadic*/,
790            /*isPropertyAccessor=*/false,
791            /*isImplicitlyDeclared=*/true, /*isDefined=*/false,
792            ObjCMethodDecl::Required, false);
793        SmallVector<ParmVarDecl *, 2> Params;
794        ParmVarDecl *objects = ParmVarDecl::Create(Context, Method,
795                                                   SourceLocation(),
796                                                   SourceLocation(),
797                                                   &Context.Idents.get("objects"),
798                                                   Context.getPointerType(IdT),
799                                                   /*TInfo=*/nullptr,
800                                                   SC_None, nullptr);
801        Params.push_back(objects);
802        ParmVarDecl *cnt = ParmVarDecl::Create(Context, Method,
803                                               SourceLocation(),
804                                               SourceLocation(),
805                                               &Context.Idents.get("cnt"),
806                                               Context.UnsignedLongTy,
807                                               /*TInfo=*/nullptr, SC_None,
808                                               nullptr);
809        Params.push_back(cnt);
810        Method->setMethodParams(Context, Params, None);
811      }
812  
813      if (!validateBoxingMethod(*this, Loc, NSArrayDecl, Sel, Method))
814        return ExprError();
815  
816      // Dig out the type that all elements should be converted to.
817      QualType T = Method->parameters()[0]->getType();
818      const PointerType *PtrT = T->getAs<PointerType>();
819      if (!PtrT ||
820          !Context.hasSameUnqualifiedType(PtrT->getPointeeType(), IdT)) {
821        Diag(SR.getBegin(), diag::err_objc_literal_method_sig)
822          << Sel;
823        Diag(Method->parameters()[0]->getLocation(),
824             diag::note_objc_literal_method_param)
825          << 0 << T
826          << Context.getPointerType(IdT.withConst());
827        return ExprError();
828      }
829  
830      // Check that the 'count' parameter is integral.
831      if (!Method->parameters()[1]->getType()->isIntegerType()) {
832        Diag(SR.getBegin(), diag::err_objc_literal_method_sig)
833          << Sel;
834        Diag(Method->parameters()[1]->getLocation(),
835             diag::note_objc_literal_method_param)
836          << 1
837          << Method->parameters()[1]->getType()
838          << "integral";
839        return ExprError();
840      }
841  
842      // We've found a good +arrayWithObjects:count: method. Save it!
843      ArrayWithObjectsMethod = Method;
844    }
845  
846    QualType ObjectsType = ArrayWithObjectsMethod->parameters()[0]->getType();
847    QualType RequiredType = ObjectsType->castAs<PointerType>()->getPointeeType();
848  
849    // Check that each of the elements provided is valid in a collection literal,
850    // performing conversions as necessary.
851    Expr **ElementsBuffer = Elements.data();
852    for (unsigned I = 0, N = Elements.size(); I != N; ++I) {
853      ExprResult Converted = CheckObjCCollectionLiteralElement(*this,
854                                                               ElementsBuffer[I],
855                                                               RequiredType, true);
856      if (Converted.isInvalid())
857        return ExprError();
858  
859      ElementsBuffer[I] = Converted.get();
860    }
861  
862    QualType Ty
863      = Context.getObjCObjectPointerType(
864                                      Context.getObjCInterfaceType(NSArrayDecl));
865  
866    return MaybeBindToTemporary(
867             ObjCArrayLiteral::Create(Context, Elements, Ty,
868                                      ArrayWithObjectsMethod, SR));
869  }
870  
BuildObjCDictionaryLiteral(SourceRange SR,ObjCDictionaryElement * Elements,unsigned NumElements)871  ExprResult Sema::BuildObjCDictionaryLiteral(SourceRange SR,
872                                              ObjCDictionaryElement *Elements,
873                                              unsigned NumElements) {
874    SourceLocation Loc = SR.getBegin();
875  
876    if (!NSDictionaryDecl) {
877      NSDictionaryDecl = LookupObjCInterfaceDeclForLiteral(*this, Loc,
878                                                           Sema::LK_Dictionary);
879      if (!NSDictionaryDecl) {
880        return ExprError();
881      }
882    }
883  
884    // Find the dictionaryWithObjects:forKeys:count: method, if we haven't done
885    // so already.
886    QualType IdT = Context.getObjCIdType();
887    if (!DictionaryWithObjectsMethod) {
888      Selector Sel = NSAPIObj->getNSDictionarySelector(
889                                 NSAPI::NSDict_dictionaryWithObjectsForKeysCount);
890      ObjCMethodDecl *Method = NSDictionaryDecl->lookupClassMethod(Sel);
891      if (!Method && getLangOpts().DebuggerObjCLiteral) {
892        Method = ObjCMethodDecl::Create(Context,
893                             SourceLocation(), SourceLocation(), Sel,
894                             IdT,
895                             nullptr /*TypeSourceInfo */,
896                             Context.getTranslationUnitDecl(),
897                             false /*Instance*/, false/*isVariadic*/,
898                             /*isPropertyAccessor=*/false,
899                             /*isImplicitlyDeclared=*/true, /*isDefined=*/false,
900                             ObjCMethodDecl::Required,
901                             false);
902        SmallVector<ParmVarDecl *, 3> Params;
903        ParmVarDecl *objects = ParmVarDecl::Create(Context, Method,
904                                                   SourceLocation(),
905                                                   SourceLocation(),
906                                                   &Context.Idents.get("objects"),
907                                                   Context.getPointerType(IdT),
908                                                   /*TInfo=*/nullptr, SC_None,
909                                                   nullptr);
910        Params.push_back(objects);
911        ParmVarDecl *keys = ParmVarDecl::Create(Context, Method,
912                                                SourceLocation(),
913                                                SourceLocation(),
914                                                &Context.Idents.get("keys"),
915                                                Context.getPointerType(IdT),
916                                                /*TInfo=*/nullptr, SC_None,
917                                                nullptr);
918        Params.push_back(keys);
919        ParmVarDecl *cnt = ParmVarDecl::Create(Context, Method,
920                                               SourceLocation(),
921                                               SourceLocation(),
922                                               &Context.Idents.get("cnt"),
923                                               Context.UnsignedLongTy,
924                                               /*TInfo=*/nullptr, SC_None,
925                                               nullptr);
926        Params.push_back(cnt);
927        Method->setMethodParams(Context, Params, None);
928      }
929  
930      if (!validateBoxingMethod(*this, SR.getBegin(), NSDictionaryDecl, Sel,
931                                Method))
932         return ExprError();
933  
934      // Dig out the type that all values should be converted to.
935      QualType ValueT = Method->parameters()[0]->getType();
936      const PointerType *PtrValue = ValueT->getAs<PointerType>();
937      if (!PtrValue ||
938          !Context.hasSameUnqualifiedType(PtrValue->getPointeeType(), IdT)) {
939        Diag(SR.getBegin(), diag::err_objc_literal_method_sig)
940          << Sel;
941        Diag(Method->parameters()[0]->getLocation(),
942             diag::note_objc_literal_method_param)
943          << 0 << ValueT
944          << Context.getPointerType(IdT.withConst());
945        return ExprError();
946      }
947  
948      // Dig out the type that all keys should be converted to.
949      QualType KeyT = Method->parameters()[1]->getType();
950      const PointerType *PtrKey = KeyT->getAs<PointerType>();
951      if (!PtrKey ||
952          !Context.hasSameUnqualifiedType(PtrKey->getPointeeType(),
953                                          IdT)) {
954        bool err = true;
955        if (PtrKey) {
956          if (QIDNSCopying.isNull()) {
957            // key argument of selector is id<NSCopying>?
958            if (ObjCProtocolDecl *NSCopyingPDecl =
959                LookupProtocol(&Context.Idents.get("NSCopying"), SR.getBegin())) {
960              ObjCProtocolDecl *PQ[] = {NSCopyingPDecl};
961              QIDNSCopying =
962                Context.getObjCObjectType(Context.ObjCBuiltinIdTy, { },
963                                          llvm::makeArrayRef(
964                                            (ObjCProtocolDecl**) PQ,
965                                            1),
966                                          false);
967              QIDNSCopying = Context.getObjCObjectPointerType(QIDNSCopying);
968            }
969          }
970          if (!QIDNSCopying.isNull())
971            err = !Context.hasSameUnqualifiedType(PtrKey->getPointeeType(),
972                                                  QIDNSCopying);
973        }
974  
975        if (err) {
976          Diag(SR.getBegin(), diag::err_objc_literal_method_sig)
977            << Sel;
978          Diag(Method->parameters()[1]->getLocation(),
979               diag::note_objc_literal_method_param)
980            << 1 << KeyT
981            << Context.getPointerType(IdT.withConst());
982          return ExprError();
983        }
984      }
985  
986      // Check that the 'count' parameter is integral.
987      QualType CountType = Method->parameters()[2]->getType();
988      if (!CountType->isIntegerType()) {
989        Diag(SR.getBegin(), diag::err_objc_literal_method_sig)
990          << Sel;
991        Diag(Method->parameters()[2]->getLocation(),
992             diag::note_objc_literal_method_param)
993          << 2 << CountType
994          << "integral";
995        return ExprError();
996      }
997  
998      // We've found a good +dictionaryWithObjects:keys:count: method; save it!
999      DictionaryWithObjectsMethod = Method;
1000    }
1001  
1002    QualType ValuesT = DictionaryWithObjectsMethod->parameters()[0]->getType();
1003    QualType ValueT = ValuesT->castAs<PointerType>()->getPointeeType();
1004    QualType KeysT = DictionaryWithObjectsMethod->parameters()[1]->getType();
1005    QualType KeyT = KeysT->castAs<PointerType>()->getPointeeType();
1006  
1007    // Check that each of the keys and values provided is valid in a collection
1008    // literal, performing conversions as necessary.
1009    bool HasPackExpansions = false;
1010    for (unsigned I = 0, N = NumElements; I != N; ++I) {
1011      // Check the key.
1012      ExprResult Key = CheckObjCCollectionLiteralElement(*this, Elements[I].Key,
1013                                                         KeyT);
1014      if (Key.isInvalid())
1015        return ExprError();
1016  
1017      // Check the value.
1018      ExprResult Value
1019        = CheckObjCCollectionLiteralElement(*this, Elements[I].Value, ValueT);
1020      if (Value.isInvalid())
1021        return ExprError();
1022  
1023      Elements[I].Key = Key.get();
1024      Elements[I].Value = Value.get();
1025  
1026      if (Elements[I].EllipsisLoc.isInvalid())
1027        continue;
1028  
1029      if (!Elements[I].Key->containsUnexpandedParameterPack() &&
1030          !Elements[I].Value->containsUnexpandedParameterPack()) {
1031        Diag(Elements[I].EllipsisLoc,
1032             diag::err_pack_expansion_without_parameter_packs)
1033          << SourceRange(Elements[I].Key->getLocStart(),
1034                         Elements[I].Value->getLocEnd());
1035        return ExprError();
1036      }
1037  
1038      HasPackExpansions = true;
1039    }
1040  
1041  
1042    QualType Ty
1043      = Context.getObjCObjectPointerType(
1044                                  Context.getObjCInterfaceType(NSDictionaryDecl));
1045    return MaybeBindToTemporary(ObjCDictionaryLiteral::Create(
1046        Context, makeArrayRef(Elements, NumElements), HasPackExpansions, Ty,
1047        DictionaryWithObjectsMethod, SR));
1048  }
1049  
BuildObjCEncodeExpression(SourceLocation AtLoc,TypeSourceInfo * EncodedTypeInfo,SourceLocation RParenLoc)1050  ExprResult Sema::BuildObjCEncodeExpression(SourceLocation AtLoc,
1051                                        TypeSourceInfo *EncodedTypeInfo,
1052                                        SourceLocation RParenLoc) {
1053    QualType EncodedType = EncodedTypeInfo->getType();
1054    QualType StrTy;
1055    if (EncodedType->isDependentType())
1056      StrTy = Context.DependentTy;
1057    else {
1058      if (!EncodedType->getAsArrayTypeUnsafe() && //// Incomplete array is handled.
1059          !EncodedType->isVoidType()) // void is handled too.
1060        if (RequireCompleteType(AtLoc, EncodedType,
1061                                diag::err_incomplete_type_objc_at_encode,
1062                                EncodedTypeInfo->getTypeLoc()))
1063          return ExprError();
1064  
1065      std::string Str;
1066      QualType NotEncodedT;
1067      Context.getObjCEncodingForType(EncodedType, Str, nullptr, &NotEncodedT);
1068      if (!NotEncodedT.isNull())
1069        Diag(AtLoc, diag::warn_incomplete_encoded_type)
1070          << EncodedType << NotEncodedT;
1071  
1072      // The type of @encode is the same as the type of the corresponding string,
1073      // which is an array type.
1074      StrTy = Context.CharTy;
1075      // A C++ string literal has a const-qualified element type (C++ 2.13.4p1).
1076      if (getLangOpts().CPlusPlus || getLangOpts().ConstStrings)
1077        StrTy.addConst();
1078      StrTy = Context.getConstantArrayType(StrTy, llvm::APInt(32, Str.size()+1),
1079                                           ArrayType::Normal, 0);
1080    }
1081  
1082    return new (Context) ObjCEncodeExpr(StrTy, EncodedTypeInfo, AtLoc, RParenLoc);
1083  }
1084  
ParseObjCEncodeExpression(SourceLocation AtLoc,SourceLocation EncodeLoc,SourceLocation LParenLoc,ParsedType ty,SourceLocation RParenLoc)1085  ExprResult Sema::ParseObjCEncodeExpression(SourceLocation AtLoc,
1086                                             SourceLocation EncodeLoc,
1087                                             SourceLocation LParenLoc,
1088                                             ParsedType ty,
1089                                             SourceLocation RParenLoc) {
1090    // FIXME: Preserve type source info ?
1091    TypeSourceInfo *TInfo;
1092    QualType EncodedType = GetTypeFromParser(ty, &TInfo);
1093    if (!TInfo)
1094      TInfo = Context.getTrivialTypeSourceInfo(EncodedType,
1095                                               getLocForEndOfToken(LParenLoc));
1096  
1097    return BuildObjCEncodeExpression(AtLoc, TInfo, RParenLoc);
1098  }
1099  
HelperToDiagnoseMismatchedMethodsInGlobalPool(Sema & S,SourceLocation AtLoc,SourceLocation LParenLoc,SourceLocation RParenLoc,ObjCMethodDecl * Method,ObjCMethodList & MethList)1100  static bool HelperToDiagnoseMismatchedMethodsInGlobalPool(Sema &S,
1101                                                 SourceLocation AtLoc,
1102                                                 SourceLocation LParenLoc,
1103                                                 SourceLocation RParenLoc,
1104                                                 ObjCMethodDecl *Method,
1105                                                 ObjCMethodList &MethList) {
1106    ObjCMethodList *M = &MethList;
1107    bool Warned = false;
1108    for (M = M->getNext(); M; M=M->getNext()) {
1109      ObjCMethodDecl *MatchingMethodDecl = M->getMethod();
1110      if (MatchingMethodDecl == Method ||
1111          isa<ObjCImplDecl>(MatchingMethodDecl->getDeclContext()) ||
1112          MatchingMethodDecl->getSelector() != Method->getSelector())
1113        continue;
1114      if (!S.MatchTwoMethodDeclarations(Method,
1115                                        MatchingMethodDecl, Sema::MMS_loose)) {
1116        if (!Warned) {
1117          Warned = true;
1118          S.Diag(AtLoc, diag::warning_multiple_selectors)
1119            << Method->getSelector() << FixItHint::CreateInsertion(LParenLoc, "(")
1120            << FixItHint::CreateInsertion(RParenLoc, ")");
1121          S.Diag(Method->getLocation(), diag::note_method_declared_at)
1122            << Method->getDeclName();
1123        }
1124        S.Diag(MatchingMethodDecl->getLocation(), diag::note_method_declared_at)
1125          << MatchingMethodDecl->getDeclName();
1126      }
1127    }
1128    return Warned;
1129  }
1130  
DiagnoseMismatchedSelectors(Sema & S,SourceLocation AtLoc,ObjCMethodDecl * Method,SourceLocation LParenLoc,SourceLocation RParenLoc,bool WarnMultipleSelectors)1131  static void DiagnoseMismatchedSelectors(Sema &S, SourceLocation AtLoc,
1132                                          ObjCMethodDecl *Method,
1133                                          SourceLocation LParenLoc,
1134                                          SourceLocation RParenLoc,
1135                                          bool WarnMultipleSelectors) {
1136    if (!WarnMultipleSelectors ||
1137        S.Diags.isIgnored(diag::warning_multiple_selectors, SourceLocation()))
1138      return;
1139    bool Warned = false;
1140    for (Sema::GlobalMethodPool::iterator b = S.MethodPool.begin(),
1141         e = S.MethodPool.end(); b != e; b++) {
1142      // first, instance methods
1143      ObjCMethodList &InstMethList = b->second.first;
1144      if (HelperToDiagnoseMismatchedMethodsInGlobalPool(S, AtLoc, LParenLoc, RParenLoc,
1145                                                        Method, InstMethList))
1146        Warned = true;
1147  
1148      // second, class methods
1149      ObjCMethodList &ClsMethList = b->second.second;
1150      if (HelperToDiagnoseMismatchedMethodsInGlobalPool(S, AtLoc, LParenLoc, RParenLoc,
1151                                                        Method, ClsMethList) || Warned)
1152        return;
1153    }
1154  }
1155  
ParseObjCSelectorExpression(Selector Sel,SourceLocation AtLoc,SourceLocation SelLoc,SourceLocation LParenLoc,SourceLocation RParenLoc,bool WarnMultipleSelectors)1156  ExprResult Sema::ParseObjCSelectorExpression(Selector Sel,
1157                                               SourceLocation AtLoc,
1158                                               SourceLocation SelLoc,
1159                                               SourceLocation LParenLoc,
1160                                               SourceLocation RParenLoc,
1161                                               bool WarnMultipleSelectors) {
1162    ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(Sel,
1163                               SourceRange(LParenLoc, RParenLoc));
1164    if (!Method)
1165      Method = LookupFactoryMethodInGlobalPool(Sel,
1166                                            SourceRange(LParenLoc, RParenLoc));
1167    if (!Method) {
1168      if (const ObjCMethodDecl *OM = SelectorsForTypoCorrection(Sel)) {
1169        Selector MatchedSel = OM->getSelector();
1170        SourceRange SelectorRange(LParenLoc.getLocWithOffset(1),
1171                                  RParenLoc.getLocWithOffset(-1));
1172        Diag(SelLoc, diag::warn_undeclared_selector_with_typo)
1173          << Sel << MatchedSel
1174          << FixItHint::CreateReplacement(SelectorRange, MatchedSel.getAsString());
1175  
1176      } else
1177          Diag(SelLoc, diag::warn_undeclared_selector) << Sel;
1178    } else
1179      DiagnoseMismatchedSelectors(*this, AtLoc, Method, LParenLoc, RParenLoc,
1180                                  WarnMultipleSelectors);
1181  
1182    if (Method &&
1183        Method->getImplementationControl() != ObjCMethodDecl::Optional &&
1184        !getSourceManager().isInSystemHeader(Method->getLocation()))
1185      ReferencedSelectors.insert(std::make_pair(Sel, AtLoc));
1186  
1187    // In ARC, forbid the user from using @selector for
1188    // retain/release/autorelease/dealloc/retainCount.
1189    if (getLangOpts().ObjCAutoRefCount) {
1190      switch (Sel.getMethodFamily()) {
1191      case OMF_retain:
1192      case OMF_release:
1193      case OMF_autorelease:
1194      case OMF_retainCount:
1195      case OMF_dealloc:
1196        Diag(AtLoc, diag::err_arc_illegal_selector) <<
1197          Sel << SourceRange(LParenLoc, RParenLoc);
1198        break;
1199  
1200      case OMF_None:
1201      case OMF_alloc:
1202      case OMF_copy:
1203      case OMF_finalize:
1204      case OMF_init:
1205      case OMF_mutableCopy:
1206      case OMF_new:
1207      case OMF_self:
1208      case OMF_initialize:
1209      case OMF_performSelector:
1210        break;
1211      }
1212    }
1213    QualType Ty = Context.getObjCSelType();
1214    return new (Context) ObjCSelectorExpr(Ty, Sel, AtLoc, RParenLoc);
1215  }
1216  
ParseObjCProtocolExpression(IdentifierInfo * ProtocolId,SourceLocation AtLoc,SourceLocation ProtoLoc,SourceLocation LParenLoc,SourceLocation ProtoIdLoc,SourceLocation RParenLoc)1217  ExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId,
1218                                               SourceLocation AtLoc,
1219                                               SourceLocation ProtoLoc,
1220                                               SourceLocation LParenLoc,
1221                                               SourceLocation ProtoIdLoc,
1222                                               SourceLocation RParenLoc) {
1223    ObjCProtocolDecl* PDecl = LookupProtocol(ProtocolId, ProtoIdLoc);
1224    if (!PDecl) {
1225      Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId;
1226      return true;
1227    }
1228    if (PDecl->hasDefinition())
1229      PDecl = PDecl->getDefinition();
1230  
1231    QualType Ty = Context.getObjCProtoType();
1232    if (Ty.isNull())
1233      return true;
1234    Ty = Context.getObjCObjectPointerType(Ty);
1235    return new (Context) ObjCProtocolExpr(Ty, PDecl, AtLoc, ProtoIdLoc, RParenLoc);
1236  }
1237  
1238  /// Try to capture an implicit reference to 'self'.
tryCaptureObjCSelf(SourceLocation Loc)1239  ObjCMethodDecl *Sema::tryCaptureObjCSelf(SourceLocation Loc) {
1240    DeclContext *DC = getFunctionLevelDeclContext();
1241  
1242    // If we're not in an ObjC method, error out.  Note that, unlike the
1243    // C++ case, we don't require an instance method --- class methods
1244    // still have a 'self', and we really do still need to capture it!
1245    ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(DC);
1246    if (!method)
1247      return nullptr;
1248  
1249    tryCaptureVariable(method->getSelfDecl(), Loc);
1250  
1251    return method;
1252  }
1253  
stripObjCInstanceType(ASTContext & Context,QualType T)1254  static QualType stripObjCInstanceType(ASTContext &Context, QualType T) {
1255    QualType origType = T;
1256    if (auto nullability = AttributedType::stripOuterNullability(T)) {
1257      if (T == Context.getObjCInstanceType()) {
1258        return Context.getAttributedType(
1259                 AttributedType::getNullabilityAttrKind(*nullability),
1260                 Context.getObjCIdType(),
1261                 Context.getObjCIdType());
1262      }
1263  
1264      return origType;
1265    }
1266  
1267    if (T == Context.getObjCInstanceType())
1268      return Context.getObjCIdType();
1269  
1270    return origType;
1271  }
1272  
1273  /// Determine the result type of a message send based on the receiver type,
1274  /// method, and the kind of message send.
1275  ///
1276  /// This is the "base" result type, which will still need to be adjusted
1277  /// to account for nullability.
getBaseMessageSendResultType(Sema & S,QualType ReceiverType,ObjCMethodDecl * Method,bool isClassMessage,bool isSuperMessage)1278  static QualType getBaseMessageSendResultType(Sema &S,
1279                                               QualType ReceiverType,
1280                                               ObjCMethodDecl *Method,
1281                                               bool isClassMessage,
1282                                               bool isSuperMessage) {
1283    assert(Method && "Must have a method");
1284    if (!Method->hasRelatedResultType())
1285      return Method->getSendResultType(ReceiverType);
1286  
1287    ASTContext &Context = S.Context;
1288  
1289    // Local function that transfers the nullability of the method's
1290    // result type to the returned result.
1291    auto transferNullability = [&](QualType type) -> QualType {
1292      // If the method's result type has nullability, extract it.
1293      if (auto nullability = Method->getSendResultType(ReceiverType)
1294                               ->getNullability(Context)){
1295        // Strip off any outer nullability sugar from the provided type.
1296        (void)AttributedType::stripOuterNullability(type);
1297  
1298        // Form a new attributed type using the method result type's nullability.
1299        return Context.getAttributedType(
1300                 AttributedType::getNullabilityAttrKind(*nullability),
1301                 type,
1302                 type);
1303      }
1304  
1305      return type;
1306    };
1307  
1308    // If a method has a related return type:
1309    //   - if the method found is an instance method, but the message send
1310    //     was a class message send, T is the declared return type of the method
1311    //     found
1312    if (Method->isInstanceMethod() && isClassMessage)
1313      return stripObjCInstanceType(Context,
1314                                   Method->getSendResultType(ReceiverType));
1315  
1316    //   - if the receiver is super, T is a pointer to the class of the
1317    //     enclosing method definition
1318    if (isSuperMessage) {
1319      if (ObjCMethodDecl *CurMethod = S.getCurMethodDecl())
1320        if (ObjCInterfaceDecl *Class = CurMethod->getClassInterface()) {
1321          return transferNullability(
1322                   Context.getObjCObjectPointerType(
1323                     Context.getObjCInterfaceType(Class)));
1324        }
1325    }
1326  
1327    //   - if the receiver is the name of a class U, T is a pointer to U
1328    if (ReceiverType->getAsObjCInterfaceType())
1329      return transferNullability(Context.getObjCObjectPointerType(ReceiverType));
1330    //   - if the receiver is of type Class or qualified Class type,
1331    //     T is the declared return type of the method.
1332    if (ReceiverType->isObjCClassType() ||
1333        ReceiverType->isObjCQualifiedClassType())
1334      return stripObjCInstanceType(Context,
1335                                   Method->getSendResultType(ReceiverType));
1336  
1337    //   - if the receiver is id, qualified id, Class, or qualified Class, T
1338    //     is the receiver type, otherwise
1339    //   - T is the type of the receiver expression.
1340    return transferNullability(ReceiverType);
1341  }
1342  
getMessageSendResultType(QualType ReceiverType,ObjCMethodDecl * Method,bool isClassMessage,bool isSuperMessage)1343  QualType Sema::getMessageSendResultType(QualType ReceiverType,
1344                                          ObjCMethodDecl *Method,
1345                                          bool isClassMessage,
1346                                          bool isSuperMessage) {
1347    // Produce the result type.
1348    QualType resultType = getBaseMessageSendResultType(*this, ReceiverType,
1349                                                       Method,
1350                                                       isClassMessage,
1351                                                       isSuperMessage);
1352  
1353    // If this is a class message, ignore the nullability of the receiver.
1354    if (isClassMessage)
1355      return resultType;
1356  
1357    // Map the nullability of the result into a table index.
1358    unsigned receiverNullabilityIdx = 0;
1359    if (auto nullability = ReceiverType->getNullability(Context))
1360      receiverNullabilityIdx = 1 + static_cast<unsigned>(*nullability);
1361  
1362    unsigned resultNullabilityIdx = 0;
1363    if (auto nullability = resultType->getNullability(Context))
1364      resultNullabilityIdx = 1 + static_cast<unsigned>(*nullability);
1365  
1366    // The table of nullability mappings, indexed by the receiver's nullability
1367    // and then the result type's nullability.
1368    static const uint8_t None = 0;
1369    static const uint8_t NonNull = 1;
1370    static const uint8_t Nullable = 2;
1371    static const uint8_t Unspecified = 3;
1372    static const uint8_t nullabilityMap[4][4] = {
1373      //                  None        NonNull       Nullable    Unspecified
1374      /* None */        { None,       None,         Nullable,   None },
1375      /* NonNull */     { None,       NonNull,      Nullable,   Unspecified },
1376      /* Nullable */    { Nullable,   Nullable,     Nullable,   Nullable },
1377      /* Unspecified */ { None,       Unspecified,  Nullable,   Unspecified }
1378    };
1379  
1380    unsigned newResultNullabilityIdx
1381      = nullabilityMap[receiverNullabilityIdx][resultNullabilityIdx];
1382    if (newResultNullabilityIdx == resultNullabilityIdx)
1383      return resultType;
1384  
1385    // Strip off the existing nullability. This removes as little type sugar as
1386    // possible.
1387    do {
1388      if (auto attributed = dyn_cast<AttributedType>(resultType.getTypePtr())) {
1389        resultType = attributed->getModifiedType();
1390      } else {
1391        resultType = resultType.getDesugaredType(Context);
1392      }
1393    } while (resultType->getNullability(Context));
1394  
1395    // Add nullability back if needed.
1396    if (newResultNullabilityIdx > 0) {
1397      auto newNullability
1398        = static_cast<NullabilityKind>(newResultNullabilityIdx-1);
1399      return Context.getAttributedType(
1400               AttributedType::getNullabilityAttrKind(newNullability),
1401               resultType, resultType);
1402    }
1403  
1404    return resultType;
1405  }
1406  
1407  /// Look for an ObjC method whose result type exactly matches the given type.
1408  static const ObjCMethodDecl *
findExplicitInstancetypeDeclarer(const ObjCMethodDecl * MD,QualType instancetype)1409  findExplicitInstancetypeDeclarer(const ObjCMethodDecl *MD,
1410                                   QualType instancetype) {
1411    if (MD->getReturnType() == instancetype)
1412      return MD;
1413  
1414    // For these purposes, a method in an @implementation overrides a
1415    // declaration in the @interface.
1416    if (const ObjCImplDecl *impl =
1417          dyn_cast<ObjCImplDecl>(MD->getDeclContext())) {
1418      const ObjCContainerDecl *iface;
1419      if (const ObjCCategoryImplDecl *catImpl =
1420            dyn_cast<ObjCCategoryImplDecl>(impl)) {
1421        iface = catImpl->getCategoryDecl();
1422      } else {
1423        iface = impl->getClassInterface();
1424      }
1425  
1426      const ObjCMethodDecl *ifaceMD =
1427        iface->getMethod(MD->getSelector(), MD->isInstanceMethod());
1428      if (ifaceMD) return findExplicitInstancetypeDeclarer(ifaceMD, instancetype);
1429    }
1430  
1431    SmallVector<const ObjCMethodDecl *, 4> overrides;
1432    MD->getOverriddenMethods(overrides);
1433    for (unsigned i = 0, e = overrides.size(); i != e; ++i) {
1434      if (const ObjCMethodDecl *result =
1435            findExplicitInstancetypeDeclarer(overrides[i], instancetype))
1436        return result;
1437    }
1438  
1439    return nullptr;
1440  }
1441  
EmitRelatedResultTypeNoteForReturn(QualType destType)1442  void Sema::EmitRelatedResultTypeNoteForReturn(QualType destType) {
1443    // Only complain if we're in an ObjC method and the required return
1444    // type doesn't match the method's declared return type.
1445    ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurContext);
1446    if (!MD || !MD->hasRelatedResultType() ||
1447        Context.hasSameUnqualifiedType(destType, MD->getReturnType()))
1448      return;
1449  
1450    // Look for a method overridden by this method which explicitly uses
1451    // 'instancetype'.
1452    if (const ObjCMethodDecl *overridden =
1453          findExplicitInstancetypeDeclarer(MD, Context.getObjCInstanceType())) {
1454      SourceRange range = overridden->getReturnTypeSourceRange();
1455      SourceLocation loc = range.getBegin();
1456      if (loc.isInvalid())
1457        loc = overridden->getLocation();
1458      Diag(loc, diag::note_related_result_type_explicit)
1459        << /*current method*/ 1 << range;
1460      return;
1461    }
1462  
1463    // Otherwise, if we have an interesting method family, note that.
1464    // This should always trigger if the above didn't.
1465    if (ObjCMethodFamily family = MD->getMethodFamily())
1466      Diag(MD->getLocation(), diag::note_related_result_type_family)
1467        << /*current method*/ 1
1468        << family;
1469  }
1470  
EmitRelatedResultTypeNote(const Expr * E)1471  void Sema::EmitRelatedResultTypeNote(const Expr *E) {
1472    E = E->IgnoreParenImpCasts();
1473    const ObjCMessageExpr *MsgSend = dyn_cast<ObjCMessageExpr>(E);
1474    if (!MsgSend)
1475      return;
1476  
1477    const ObjCMethodDecl *Method = MsgSend->getMethodDecl();
1478    if (!Method)
1479      return;
1480  
1481    if (!Method->hasRelatedResultType())
1482      return;
1483  
1484    if (Context.hasSameUnqualifiedType(
1485            Method->getReturnType().getNonReferenceType(), MsgSend->getType()))
1486      return;
1487  
1488    if (!Context.hasSameUnqualifiedType(Method->getReturnType(),
1489                                        Context.getObjCInstanceType()))
1490      return;
1491  
1492    Diag(Method->getLocation(), diag::note_related_result_type_inferred)
1493      << Method->isInstanceMethod() << Method->getSelector()
1494      << MsgSend->getType();
1495  }
1496  
CheckMessageArgumentTypes(QualType ReceiverType,MultiExprArg Args,Selector Sel,ArrayRef<SourceLocation> SelectorLocs,ObjCMethodDecl * Method,bool isClassMessage,bool isSuperMessage,SourceLocation lbrac,SourceLocation rbrac,SourceRange RecRange,QualType & ReturnType,ExprValueKind & VK)1497  bool Sema::CheckMessageArgumentTypes(QualType ReceiverType,
1498                                       MultiExprArg Args,
1499                                       Selector Sel,
1500                                       ArrayRef<SourceLocation> SelectorLocs,
1501                                       ObjCMethodDecl *Method,
1502                                       bool isClassMessage, bool isSuperMessage,
1503                                       SourceLocation lbrac, SourceLocation rbrac,
1504                                       SourceRange RecRange,
1505                                       QualType &ReturnType, ExprValueKind &VK) {
1506    SourceLocation SelLoc;
1507    if (!SelectorLocs.empty() && SelectorLocs.front().isValid())
1508      SelLoc = SelectorLocs.front();
1509    else
1510      SelLoc = lbrac;
1511  
1512    if (!Method) {
1513      // Apply default argument promotion as for (C99 6.5.2.2p6).
1514      for (unsigned i = 0, e = Args.size(); i != e; i++) {
1515        if (Args[i]->isTypeDependent())
1516          continue;
1517  
1518        ExprResult result;
1519        if (getLangOpts().DebuggerSupport) {
1520          QualType paramTy; // ignored
1521          result = checkUnknownAnyArg(SelLoc, Args[i], paramTy);
1522        } else {
1523          result = DefaultArgumentPromotion(Args[i]);
1524        }
1525        if (result.isInvalid())
1526          return true;
1527        Args[i] = result.get();
1528      }
1529  
1530      unsigned DiagID;
1531      if (getLangOpts().ObjCAutoRefCount)
1532        DiagID = diag::err_arc_method_not_found;
1533      else
1534        DiagID = isClassMessage ? diag::warn_class_method_not_found
1535                                : diag::warn_inst_method_not_found;
1536      if (!getLangOpts().DebuggerSupport) {
1537        const ObjCMethodDecl *OMD = SelectorsForTypoCorrection(Sel, ReceiverType);
1538        if (OMD && !OMD->isInvalidDecl()) {
1539          if (getLangOpts().ObjCAutoRefCount)
1540            DiagID = diag::error_method_not_found_with_typo;
1541          else
1542            DiagID = isClassMessage ? diag::warn_class_method_not_found_with_typo
1543                                    : diag::warn_instance_method_not_found_with_typo;
1544          Selector MatchedSel = OMD->getSelector();
1545          SourceRange SelectorRange(SelectorLocs.front(), SelectorLocs.back());
1546          if (MatchedSel.isUnarySelector())
1547            Diag(SelLoc, DiagID)
1548              << Sel<< isClassMessage << MatchedSel
1549              << FixItHint::CreateReplacement(SelectorRange, MatchedSel.getAsString());
1550          else
1551            Diag(SelLoc, DiagID) << Sel<< isClassMessage << MatchedSel;
1552        }
1553        else
1554          Diag(SelLoc, DiagID)
1555            << Sel << isClassMessage << SourceRange(SelectorLocs.front(),
1556                                                  SelectorLocs.back());
1557        // Find the class to which we are sending this message.
1558        if (ReceiverType->isObjCObjectPointerType()) {
1559          if (ObjCInterfaceDecl *ThisClass =
1560              ReceiverType->getAs<ObjCObjectPointerType>()->getInterfaceDecl()) {
1561            Diag(ThisClass->getLocation(), diag::note_receiver_class_declared);
1562            if (!RecRange.isInvalid())
1563              if (ThisClass->lookupClassMethod(Sel))
1564                Diag(RecRange.getBegin(),diag::note_receiver_expr_here)
1565                  << FixItHint::CreateReplacement(RecRange,
1566                                                  ThisClass->getNameAsString());
1567          }
1568        }
1569      }
1570  
1571      // In debuggers, we want to use __unknown_anytype for these
1572      // results so that clients can cast them.
1573      if (getLangOpts().DebuggerSupport) {
1574        ReturnType = Context.UnknownAnyTy;
1575      } else {
1576        ReturnType = Context.getObjCIdType();
1577      }
1578      VK = VK_RValue;
1579      return false;
1580    }
1581  
1582    ReturnType = getMessageSendResultType(ReceiverType, Method, isClassMessage,
1583                                          isSuperMessage);
1584    VK = Expr::getValueKindForType(Method->getReturnType());
1585  
1586    unsigned NumNamedArgs = Sel.getNumArgs();
1587    // Method might have more arguments than selector indicates. This is due
1588    // to addition of c-style arguments in method.
1589    if (Method->param_size() > Sel.getNumArgs())
1590      NumNamedArgs = Method->param_size();
1591    // FIXME. This need be cleaned up.
1592    if (Args.size() < NumNamedArgs) {
1593      Diag(SelLoc, diag::err_typecheck_call_too_few_args)
1594        << 2 << NumNamedArgs << static_cast<unsigned>(Args.size());
1595      return false;
1596    }
1597  
1598    // Compute the set of type arguments to be substituted into each parameter
1599    // type.
1600    Optional<ArrayRef<QualType>> typeArgs
1601      = ReceiverType->getObjCSubstitutions(Method->getDeclContext());
1602    bool IsError = false;
1603    for (unsigned i = 0; i < NumNamedArgs; i++) {
1604      // We can't do any type-checking on a type-dependent argument.
1605      if (Args[i]->isTypeDependent())
1606        continue;
1607  
1608      Expr *argExpr = Args[i];
1609  
1610      ParmVarDecl *param = Method->parameters()[i];
1611      assert(argExpr && "CheckMessageArgumentTypes(): missing expression");
1612  
1613      // Strip the unbridged-cast placeholder expression off unless it's
1614      // a consumed argument.
1615      if (argExpr->hasPlaceholderType(BuiltinType::ARCUnbridgedCast) &&
1616          !param->hasAttr<CFConsumedAttr>())
1617        argExpr = stripARCUnbridgedCast(argExpr);
1618  
1619      // If the parameter is __unknown_anytype, infer its type
1620      // from the argument.
1621      if (param->getType() == Context.UnknownAnyTy) {
1622        QualType paramType;
1623        ExprResult argE = checkUnknownAnyArg(SelLoc, argExpr, paramType);
1624        if (argE.isInvalid()) {
1625          IsError = true;
1626        } else {
1627          Args[i] = argE.get();
1628  
1629          // Update the parameter type in-place.
1630          param->setType(paramType);
1631        }
1632        continue;
1633      }
1634  
1635      QualType origParamType = param->getType();
1636      QualType paramType = param->getType();
1637      if (typeArgs)
1638        paramType = paramType.substObjCTypeArgs(
1639                      Context,
1640                      *typeArgs,
1641                      ObjCSubstitutionContext::Parameter);
1642  
1643      if (RequireCompleteType(argExpr->getSourceRange().getBegin(),
1644                              paramType,
1645                              diag::err_call_incomplete_argument, argExpr))
1646        return true;
1647  
1648      InitializedEntity Entity
1649        = InitializedEntity::InitializeParameter(Context, param, paramType);
1650      ExprResult ArgE = PerformCopyInitialization(Entity, SourceLocation(), argExpr);
1651      if (ArgE.isInvalid())
1652        IsError = true;
1653      else {
1654        Args[i] = ArgE.getAs<Expr>();
1655  
1656        // If we are type-erasing a block to a block-compatible
1657        // Objective-C pointer type, we may need to extend the lifetime
1658        // of the block object.
1659        if (typeArgs && Args[i]->isRValue() && paramType->isBlockPointerType() &&
1660            Args[i]->getType()->isBlockPointerType() &&
1661            origParamType->isObjCObjectPointerType()) {
1662          ExprResult arg = Args[i];
1663          maybeExtendBlockObject(arg);
1664          Args[i] = arg.get();
1665        }
1666      }
1667    }
1668  
1669    // Promote additional arguments to variadic methods.
1670    if (Method->isVariadic()) {
1671      for (unsigned i = NumNamedArgs, e = Args.size(); i < e; ++i) {
1672        if (Args[i]->isTypeDependent())
1673          continue;
1674  
1675        ExprResult Arg = DefaultVariadicArgumentPromotion(Args[i], VariadicMethod,
1676                                                          nullptr);
1677        IsError |= Arg.isInvalid();
1678        Args[i] = Arg.get();
1679      }
1680    } else {
1681      // Check for extra arguments to non-variadic methods.
1682      if (Args.size() != NumNamedArgs) {
1683        Diag(Args[NumNamedArgs]->getLocStart(),
1684             diag::err_typecheck_call_too_many_args)
1685          << 2 /*method*/ << NumNamedArgs << static_cast<unsigned>(Args.size())
1686          << Method->getSourceRange()
1687          << SourceRange(Args[NumNamedArgs]->getLocStart(),
1688                         Args.back()->getLocEnd());
1689      }
1690    }
1691  
1692    DiagnoseSentinelCalls(Method, SelLoc, Args);
1693  
1694    // Do additional checkings on method.
1695    IsError |= CheckObjCMethodCall(
1696        Method, SelLoc, makeArrayRef(Args.data(), Args.size()));
1697  
1698    return IsError;
1699  }
1700  
isSelfExpr(Expr * RExpr)1701  bool Sema::isSelfExpr(Expr *RExpr) {
1702    // 'self' is objc 'self' in an objc method only.
1703    ObjCMethodDecl *Method =
1704        dyn_cast_or_null<ObjCMethodDecl>(CurContext->getNonClosureAncestor());
1705    return isSelfExpr(RExpr, Method);
1706  }
1707  
isSelfExpr(Expr * receiver,const ObjCMethodDecl * method)1708  bool Sema::isSelfExpr(Expr *receiver, const ObjCMethodDecl *method) {
1709    if (!method) return false;
1710  
1711    receiver = receiver->IgnoreParenLValueCasts();
1712    if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(receiver))
1713      if (DRE->getDecl() == method->getSelfDecl())
1714        return true;
1715    return false;
1716  }
1717  
1718  /// LookupMethodInType - Look up a method in an ObjCObjectType.
LookupMethodInObjectType(Selector sel,QualType type,bool isInstance)1719  ObjCMethodDecl *Sema::LookupMethodInObjectType(Selector sel, QualType type,
1720                                                 bool isInstance) {
1721    const ObjCObjectType *objType = type->castAs<ObjCObjectType>();
1722    if (ObjCInterfaceDecl *iface = objType->getInterface()) {
1723      // Look it up in the main interface (and categories, etc.)
1724      if (ObjCMethodDecl *method = iface->lookupMethod(sel, isInstance))
1725        return method;
1726  
1727      // Okay, look for "private" methods declared in any
1728      // @implementations we've seen.
1729      if (ObjCMethodDecl *method = iface->lookupPrivateMethod(sel, isInstance))
1730        return method;
1731    }
1732  
1733    // Check qualifiers.
1734    for (const auto *I : objType->quals())
1735      if (ObjCMethodDecl *method = I->lookupMethod(sel, isInstance))
1736        return method;
1737  
1738    return nullptr;
1739  }
1740  
1741  /// LookupMethodInQualifiedType - Lookups up a method in protocol qualifier
1742  /// list of a qualified objective pointer type.
LookupMethodInQualifiedType(Selector Sel,const ObjCObjectPointerType * OPT,bool Instance)1743  ObjCMethodDecl *Sema::LookupMethodInQualifiedType(Selector Sel,
1744                                                const ObjCObjectPointerType *OPT,
1745                                                bool Instance)
1746  {
1747    ObjCMethodDecl *MD = nullptr;
1748    for (const auto *PROTO : OPT->quals()) {
1749      if ((MD = PROTO->lookupMethod(Sel, Instance))) {
1750        return MD;
1751      }
1752    }
1753    return nullptr;
1754  }
1755  
1756  /// HandleExprPropertyRefExpr - Handle foo.bar where foo is a pointer to an
1757  /// objective C interface.  This is a property reference expression.
1758  ExprResult Sema::
HandleExprPropertyRefExpr(const ObjCObjectPointerType * OPT,Expr * BaseExpr,SourceLocation OpLoc,DeclarationName MemberName,SourceLocation MemberLoc,SourceLocation SuperLoc,QualType SuperType,bool Super)1759  HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
1760                            Expr *BaseExpr, SourceLocation OpLoc,
1761                            DeclarationName MemberName,
1762                            SourceLocation MemberLoc,
1763                            SourceLocation SuperLoc, QualType SuperType,
1764                            bool Super) {
1765    const ObjCInterfaceType *IFaceT = OPT->getInterfaceType();
1766    ObjCInterfaceDecl *IFace = IFaceT->getDecl();
1767  
1768    if (!MemberName.isIdentifier()) {
1769      Diag(MemberLoc, diag::err_invalid_property_name)
1770        << MemberName << QualType(OPT, 0);
1771      return ExprError();
1772    }
1773  
1774    IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
1775  
1776    SourceRange BaseRange = Super? SourceRange(SuperLoc)
1777                                 : BaseExpr->getSourceRange();
1778    if (RequireCompleteType(MemberLoc, OPT->getPointeeType(),
1779                            diag::err_property_not_found_forward_class,
1780                            MemberName, BaseRange))
1781      return ExprError();
1782  
1783    if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(Member)) {
1784      // Check whether we can reference this property.
1785      if (DiagnoseUseOfDecl(PD, MemberLoc))
1786        return ExprError();
1787      if (Super)
1788        return new (Context)
1789            ObjCPropertyRefExpr(PD, Context.PseudoObjectTy, VK_LValue,
1790                                OK_ObjCProperty, MemberLoc, SuperLoc, SuperType);
1791      else
1792        return new (Context)
1793            ObjCPropertyRefExpr(PD, Context.PseudoObjectTy, VK_LValue,
1794                                OK_ObjCProperty, MemberLoc, BaseExpr);
1795    }
1796    // Check protocols on qualified interfaces.
1797    for (const auto *I : OPT->quals())
1798      if (ObjCPropertyDecl *PD = I->FindPropertyDeclaration(Member)) {
1799        // Check whether we can reference this property.
1800        if (DiagnoseUseOfDecl(PD, MemberLoc))
1801          return ExprError();
1802  
1803        if (Super)
1804          return new (Context) ObjCPropertyRefExpr(
1805              PD, Context.PseudoObjectTy, VK_LValue, OK_ObjCProperty, MemberLoc,
1806              SuperLoc, SuperType);
1807        else
1808          return new (Context)
1809              ObjCPropertyRefExpr(PD, Context.PseudoObjectTy, VK_LValue,
1810                                  OK_ObjCProperty, MemberLoc, BaseExpr);
1811      }
1812    // If that failed, look for an "implicit" property by seeing if the nullary
1813    // selector is implemented.
1814  
1815    // FIXME: The logic for looking up nullary and unary selectors should be
1816    // shared with the code in ActOnInstanceMessage.
1817  
1818    Selector Sel = PP.getSelectorTable().getNullarySelector(Member);
1819    ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel);
1820  
1821    // May be founf in property's qualified list.
1822    if (!Getter)
1823      Getter = LookupMethodInQualifiedType(Sel, OPT, true);
1824  
1825    // If this reference is in an @implementation, check for 'private' methods.
1826    if (!Getter)
1827      Getter = IFace->lookupPrivateMethod(Sel);
1828  
1829    if (Getter) {
1830      // Check if we can reference this property.
1831      if (DiagnoseUseOfDecl(Getter, MemberLoc))
1832        return ExprError();
1833    }
1834    // If we found a getter then this may be a valid dot-reference, we
1835    // will look for the matching setter, in case it is needed.
1836    Selector SetterSel =
1837      SelectorTable::constructSetterSelector(PP.getIdentifierTable(),
1838                                             PP.getSelectorTable(), Member);
1839    ObjCMethodDecl *Setter = IFace->lookupInstanceMethod(SetterSel);
1840  
1841    // May be founf in property's qualified list.
1842    if (!Setter)
1843      Setter = LookupMethodInQualifiedType(SetterSel, OPT, true);
1844  
1845    if (!Setter) {
1846      // If this reference is in an @implementation, also check for 'private'
1847      // methods.
1848      Setter = IFace->lookupPrivateMethod(SetterSel);
1849    }
1850  
1851    if (Setter && DiagnoseUseOfDecl(Setter, MemberLoc))
1852      return ExprError();
1853  
1854    // Special warning if member name used in a property-dot for a setter accessor
1855    // does not use a property with same name; e.g. obj.X = ... for a property with
1856    // name 'x'.
1857    if (Setter && Setter->isImplicit() && Setter->isPropertyAccessor()
1858        && !IFace->FindPropertyDeclaration(Member)) {
1859        if (const ObjCPropertyDecl *PDecl = Setter->findPropertyDecl()) {
1860          // Do not warn if user is using property-dot syntax to make call to
1861          // user named setter.
1862          if (!(PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter))
1863            Diag(MemberLoc,
1864                 diag::warn_property_access_suggest)
1865            << MemberName << QualType(OPT, 0) << PDecl->getName()
1866            << FixItHint::CreateReplacement(MemberLoc, PDecl->getName());
1867        }
1868    }
1869  
1870    if (Getter || Setter) {
1871      if (Super)
1872        return new (Context)
1873            ObjCPropertyRefExpr(Getter, Setter, Context.PseudoObjectTy, VK_LValue,
1874                                OK_ObjCProperty, MemberLoc, SuperLoc, SuperType);
1875      else
1876        return new (Context)
1877            ObjCPropertyRefExpr(Getter, Setter, Context.PseudoObjectTy, VK_LValue,
1878                                OK_ObjCProperty, MemberLoc, BaseExpr);
1879  
1880    }
1881  
1882    // Attempt to correct for typos in property names.
1883    if (TypoCorrection Corrected =
1884            CorrectTypo(DeclarationNameInfo(MemberName, MemberLoc),
1885                        LookupOrdinaryName, nullptr, nullptr,
1886                        llvm::make_unique<DeclFilterCCC<ObjCPropertyDecl>>(),
1887                        CTK_ErrorRecovery, IFace, false, OPT)) {
1888      diagnoseTypo(Corrected, PDiag(diag::err_property_not_found_suggest)
1889                                << MemberName << QualType(OPT, 0));
1890      DeclarationName TypoResult = Corrected.getCorrection();
1891      return HandleExprPropertyRefExpr(OPT, BaseExpr, OpLoc,
1892                                       TypoResult, MemberLoc,
1893                                       SuperLoc, SuperType, Super);
1894    }
1895    ObjCInterfaceDecl *ClassDeclared;
1896    if (ObjCIvarDecl *Ivar =
1897        IFace->lookupInstanceVariable(Member, ClassDeclared)) {
1898      QualType T = Ivar->getType();
1899      if (const ObjCObjectPointerType * OBJPT =
1900          T->getAsObjCInterfacePointerType()) {
1901        if (RequireCompleteType(MemberLoc, OBJPT->getPointeeType(),
1902                                diag::err_property_not_as_forward_class,
1903                                MemberName, BaseExpr))
1904          return ExprError();
1905      }
1906      Diag(MemberLoc,
1907           diag::err_ivar_access_using_property_syntax_suggest)
1908      << MemberName << QualType(OPT, 0) << Ivar->getDeclName()
1909      << FixItHint::CreateReplacement(OpLoc, "->");
1910      return ExprError();
1911    }
1912  
1913    Diag(MemberLoc, diag::err_property_not_found)
1914      << MemberName << QualType(OPT, 0);
1915    if (Setter)
1916      Diag(Setter->getLocation(), diag::note_getter_unavailable)
1917            << MemberName << BaseExpr->getSourceRange();
1918    return ExprError();
1919  }
1920  
1921  
1922  
1923  ExprResult Sema::
ActOnClassPropertyRefExpr(IdentifierInfo & receiverName,IdentifierInfo & propertyName,SourceLocation receiverNameLoc,SourceLocation propertyNameLoc)1924  ActOnClassPropertyRefExpr(IdentifierInfo &receiverName,
1925                            IdentifierInfo &propertyName,
1926                            SourceLocation receiverNameLoc,
1927                            SourceLocation propertyNameLoc) {
1928  
1929    IdentifierInfo *receiverNamePtr = &receiverName;
1930    ObjCInterfaceDecl *IFace = getObjCInterfaceDecl(receiverNamePtr,
1931                                                    receiverNameLoc);
1932  
1933    QualType SuperType;
1934    if (!IFace) {
1935      // If the "receiver" is 'super' in a method, handle it as an expression-like
1936      // property reference.
1937      if (receiverNamePtr->isStr("super")) {
1938        if (ObjCMethodDecl *CurMethod = tryCaptureObjCSelf(receiverNameLoc)) {
1939          if (auto classDecl = CurMethod->getClassInterface()) {
1940            SuperType = QualType(classDecl->getSuperClassType(), 0);
1941            if (CurMethod->isInstanceMethod()) {
1942              if (SuperType.isNull()) {
1943                // The current class does not have a superclass.
1944                Diag(receiverNameLoc, diag::error_root_class_cannot_use_super)
1945                  << CurMethod->getClassInterface()->getIdentifier();
1946                return ExprError();
1947              }
1948              QualType T = Context.getObjCObjectPointerType(SuperType);
1949  
1950              return HandleExprPropertyRefExpr(T->castAs<ObjCObjectPointerType>(),
1951                                               /*BaseExpr*/nullptr,
1952                                               SourceLocation()/*OpLoc*/,
1953                                               &propertyName,
1954                                               propertyNameLoc,
1955                                               receiverNameLoc, T, true);
1956            }
1957  
1958            // Otherwise, if this is a class method, try dispatching to our
1959            // superclass.
1960            IFace = CurMethod->getClassInterface()->getSuperClass();
1961          }
1962        }
1963      }
1964  
1965      if (!IFace) {
1966        Diag(receiverNameLoc, diag::err_expected_either) << tok::identifier
1967                                                         << tok::l_paren;
1968        return ExprError();
1969      }
1970    }
1971  
1972    // Search for a declared property first.
1973    Selector Sel = PP.getSelectorTable().getNullarySelector(&propertyName);
1974    ObjCMethodDecl *Getter = IFace->lookupClassMethod(Sel);
1975  
1976    // If this reference is in an @implementation, check for 'private' methods.
1977    if (!Getter)
1978      Getter = IFace->lookupPrivateClassMethod(Sel);
1979  
1980    if (Getter) {
1981      // FIXME: refactor/share with ActOnMemberReference().
1982      // Check if we can reference this property.
1983      if (DiagnoseUseOfDecl(Getter, propertyNameLoc))
1984        return ExprError();
1985    }
1986  
1987    // Look for the matching setter, in case it is needed.
1988    Selector SetterSel =
1989      SelectorTable::constructSetterSelector(PP.getIdentifierTable(),
1990                                              PP.getSelectorTable(),
1991                                             &propertyName);
1992  
1993    ObjCMethodDecl *Setter = IFace->lookupClassMethod(SetterSel);
1994    if (!Setter) {
1995      // If this reference is in an @implementation, also check for 'private'
1996      // methods.
1997      Setter = IFace->lookupPrivateClassMethod(SetterSel);
1998    }
1999    // Look through local category implementations associated with the class.
2000    if (!Setter)
2001      Setter = IFace->getCategoryClassMethod(SetterSel);
2002  
2003    if (Setter && DiagnoseUseOfDecl(Setter, propertyNameLoc))
2004      return ExprError();
2005  
2006    if (Getter || Setter) {
2007      if (!SuperType.isNull())
2008        return new (Context)
2009            ObjCPropertyRefExpr(Getter, Setter, Context.PseudoObjectTy, VK_LValue,
2010                                OK_ObjCProperty, propertyNameLoc, receiverNameLoc,
2011                                SuperType);
2012  
2013      return new (Context) ObjCPropertyRefExpr(
2014          Getter, Setter, Context.PseudoObjectTy, VK_LValue, OK_ObjCProperty,
2015          propertyNameLoc, receiverNameLoc, IFace);
2016    }
2017    return ExprError(Diag(propertyNameLoc, diag::err_property_not_found)
2018                       << &propertyName << Context.getObjCInterfaceType(IFace));
2019  }
2020  
2021  namespace {
2022  
2023  class ObjCInterfaceOrSuperCCC : public CorrectionCandidateCallback {
2024   public:
ObjCInterfaceOrSuperCCC(ObjCMethodDecl * Method)2025    ObjCInterfaceOrSuperCCC(ObjCMethodDecl *Method) {
2026      // Determine whether "super" is acceptable in the current context.
2027      if (Method && Method->getClassInterface())
2028        WantObjCSuper = Method->getClassInterface()->getSuperClass();
2029    }
2030  
ValidateCandidate(const TypoCorrection & candidate)2031    bool ValidateCandidate(const TypoCorrection &candidate) override {
2032      return candidate.getCorrectionDeclAs<ObjCInterfaceDecl>() ||
2033          candidate.isKeyword("super");
2034    }
2035  };
2036  
2037  }
2038  
getObjCMessageKind(Scope * S,IdentifierInfo * Name,SourceLocation NameLoc,bool IsSuper,bool HasTrailingDot,ParsedType & ReceiverType)2039  Sema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S,
2040                                                 IdentifierInfo *Name,
2041                                                 SourceLocation NameLoc,
2042                                                 bool IsSuper,
2043                                                 bool HasTrailingDot,
2044                                                 ParsedType &ReceiverType) {
2045    ReceiverType = ParsedType();
2046  
2047    // If the identifier is "super" and there is no trailing dot, we're
2048    // messaging super. If the identifier is "super" and there is a
2049    // trailing dot, it's an instance message.
2050    if (IsSuper && S->isInObjcMethodScope())
2051      return HasTrailingDot? ObjCInstanceMessage : ObjCSuperMessage;
2052  
2053    LookupResult Result(*this, Name, NameLoc, LookupOrdinaryName);
2054    LookupName(Result, S);
2055  
2056    switch (Result.getResultKind()) {
2057    case LookupResult::NotFound:
2058      // Normal name lookup didn't find anything. If we're in an
2059      // Objective-C method, look for ivars. If we find one, we're done!
2060      // FIXME: This is a hack. Ivar lookup should be part of normal
2061      // lookup.
2062      if (ObjCMethodDecl *Method = getCurMethodDecl()) {
2063        if (!Method->getClassInterface()) {
2064          // Fall back: let the parser try to parse it as an instance message.
2065          return ObjCInstanceMessage;
2066        }
2067  
2068        ObjCInterfaceDecl *ClassDeclared;
2069        if (Method->getClassInterface()->lookupInstanceVariable(Name,
2070                                                                ClassDeclared))
2071          return ObjCInstanceMessage;
2072      }
2073  
2074      // Break out; we'll perform typo correction below.
2075      break;
2076  
2077    case LookupResult::NotFoundInCurrentInstantiation:
2078    case LookupResult::FoundOverloaded:
2079    case LookupResult::FoundUnresolvedValue:
2080    case LookupResult::Ambiguous:
2081      Result.suppressDiagnostics();
2082      return ObjCInstanceMessage;
2083  
2084    case LookupResult::Found: {
2085      // If the identifier is a class or not, and there is a trailing dot,
2086      // it's an instance message.
2087      if (HasTrailingDot)
2088        return ObjCInstanceMessage;
2089      // We found something. If it's a type, then we have a class
2090      // message. Otherwise, it's an instance message.
2091      NamedDecl *ND = Result.getFoundDecl();
2092      QualType T;
2093      if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND))
2094        T = Context.getObjCInterfaceType(Class);
2095      else if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) {
2096        T = Context.getTypeDeclType(Type);
2097        DiagnoseUseOfDecl(Type, NameLoc);
2098      }
2099      else
2100        return ObjCInstanceMessage;
2101  
2102      //  We have a class message, and T is the type we're
2103      //  messaging. Build source-location information for it.
2104      TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc);
2105      ReceiverType = CreateParsedType(T, TSInfo);
2106      return ObjCClassMessage;
2107    }
2108    }
2109  
2110    if (TypoCorrection Corrected = CorrectTypo(
2111            Result.getLookupNameInfo(), Result.getLookupKind(), S, nullptr,
2112            llvm::make_unique<ObjCInterfaceOrSuperCCC>(getCurMethodDecl()),
2113            CTK_ErrorRecovery, nullptr, false, nullptr, false)) {
2114      if (Corrected.isKeyword()) {
2115        // If we've found the keyword "super" (the only keyword that would be
2116        // returned by CorrectTypo), this is a send to super.
2117        diagnoseTypo(Corrected,
2118                     PDiag(diag::err_unknown_receiver_suggest) << Name);
2119        return ObjCSuperMessage;
2120      } else if (ObjCInterfaceDecl *Class =
2121                     Corrected.getCorrectionDeclAs<ObjCInterfaceDecl>()) {
2122        // If we found a declaration, correct when it refers to an Objective-C
2123        // class.
2124        diagnoseTypo(Corrected,
2125                     PDiag(diag::err_unknown_receiver_suggest) << Name);
2126        QualType T = Context.getObjCInterfaceType(Class);
2127        TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, NameLoc);
2128        ReceiverType = CreateParsedType(T, TSInfo);
2129        return ObjCClassMessage;
2130      }
2131    }
2132  
2133    // Fall back: let the parser try to parse it as an instance message.
2134    return ObjCInstanceMessage;
2135  }
2136  
ActOnSuperMessage(Scope * S,SourceLocation SuperLoc,Selector Sel,SourceLocation LBracLoc,ArrayRef<SourceLocation> SelectorLocs,SourceLocation RBracLoc,MultiExprArg Args)2137  ExprResult Sema::ActOnSuperMessage(Scope *S,
2138                                     SourceLocation SuperLoc,
2139                                     Selector Sel,
2140                                     SourceLocation LBracLoc,
2141                                     ArrayRef<SourceLocation> SelectorLocs,
2142                                     SourceLocation RBracLoc,
2143                                     MultiExprArg Args) {
2144    // Determine whether we are inside a method or not.
2145    ObjCMethodDecl *Method = tryCaptureObjCSelf(SuperLoc);
2146    if (!Method) {
2147      Diag(SuperLoc, diag::err_invalid_receiver_to_message_super);
2148      return ExprError();
2149    }
2150  
2151    ObjCInterfaceDecl *Class = Method->getClassInterface();
2152    if (!Class) {
2153      Diag(SuperLoc, diag::error_no_super_class_message)
2154        << Method->getDeclName();
2155      return ExprError();
2156    }
2157  
2158    QualType SuperTy(Class->getSuperClassType(), 0);
2159    if (SuperTy.isNull()) {
2160      // The current class does not have a superclass.
2161      Diag(SuperLoc, diag::error_root_class_cannot_use_super)
2162        << Class->getIdentifier();
2163      return ExprError();
2164    }
2165  
2166    // We are in a method whose class has a superclass, so 'super'
2167    // is acting as a keyword.
2168    if (Method->getSelector() == Sel)
2169      getCurFunction()->ObjCShouldCallSuper = false;
2170  
2171    if (Method->isInstanceMethod()) {
2172      // Since we are in an instance method, this is an instance
2173      // message to the superclass instance.
2174      SuperTy = Context.getObjCObjectPointerType(SuperTy);
2175      return BuildInstanceMessage(nullptr, SuperTy, SuperLoc,
2176                                  Sel, /*Method=*/nullptr,
2177                                  LBracLoc, SelectorLocs, RBracLoc, Args);
2178    }
2179  
2180    // Since we are in a class method, this is a class message to
2181    // the superclass.
2182    return BuildClassMessage(/*ReceiverTypeInfo=*/nullptr,
2183                             SuperTy,
2184                             SuperLoc, Sel, /*Method=*/nullptr,
2185                             LBracLoc, SelectorLocs, RBracLoc, Args);
2186  }
2187  
2188  
BuildClassMessageImplicit(QualType ReceiverType,bool isSuperReceiver,SourceLocation Loc,Selector Sel,ObjCMethodDecl * Method,MultiExprArg Args)2189  ExprResult Sema::BuildClassMessageImplicit(QualType ReceiverType,
2190                                             bool isSuperReceiver,
2191                                             SourceLocation Loc,
2192                                             Selector Sel,
2193                                             ObjCMethodDecl *Method,
2194                                             MultiExprArg Args) {
2195    TypeSourceInfo *receiverTypeInfo = nullptr;
2196    if (!ReceiverType.isNull())
2197      receiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType);
2198  
2199    return BuildClassMessage(receiverTypeInfo, ReceiverType,
2200                            /*SuperLoc=*/isSuperReceiver ? Loc : SourceLocation(),
2201                             Sel, Method, Loc, Loc, Loc, Args,
2202                             /*isImplicit=*/true);
2203  
2204  }
2205  
applyCocoaAPICheck(Sema & S,const ObjCMessageExpr * Msg,unsigned DiagID,bool (* refactor)(const ObjCMessageExpr *,const NSAPI &,edit::Commit &))2206  static void applyCocoaAPICheck(Sema &S, const ObjCMessageExpr *Msg,
2207                                 unsigned DiagID,
2208                                 bool (*refactor)(const ObjCMessageExpr *,
2209                                                const NSAPI &, edit::Commit &)) {
2210    SourceLocation MsgLoc = Msg->getExprLoc();
2211    if (S.Diags.isIgnored(DiagID, MsgLoc))
2212      return;
2213  
2214    SourceManager &SM = S.SourceMgr;
2215    edit::Commit ECommit(SM, S.LangOpts);
2216    if (refactor(Msg,*S.NSAPIObj, ECommit)) {
2217      DiagnosticBuilder Builder = S.Diag(MsgLoc, DiagID)
2218                          << Msg->getSelector() << Msg->getSourceRange();
2219      // FIXME: Don't emit diagnostic at all if fixits are non-commitable.
2220      if (!ECommit.isCommitable())
2221        return;
2222      for (edit::Commit::edit_iterator
2223             I = ECommit.edit_begin(), E = ECommit.edit_end(); I != E; ++I) {
2224        const edit::Commit::Edit &Edit = *I;
2225        switch (Edit.Kind) {
2226        case edit::Commit::Act_Insert:
2227          Builder.AddFixItHint(FixItHint::CreateInsertion(Edit.OrigLoc,
2228                                                          Edit.Text,
2229                                                          Edit.BeforePrev));
2230          break;
2231        case edit::Commit::Act_InsertFromRange:
2232          Builder.AddFixItHint(
2233              FixItHint::CreateInsertionFromRange(Edit.OrigLoc,
2234                                                  Edit.getInsertFromRange(SM),
2235                                                  Edit.BeforePrev));
2236          break;
2237        case edit::Commit::Act_Remove:
2238          Builder.AddFixItHint(FixItHint::CreateRemoval(Edit.getFileRange(SM)));
2239          break;
2240        }
2241      }
2242    }
2243  }
2244  
checkCocoaAPI(Sema & S,const ObjCMessageExpr * Msg)2245  static void checkCocoaAPI(Sema &S, const ObjCMessageExpr *Msg) {
2246    applyCocoaAPICheck(S, Msg, diag::warn_objc_redundant_literal_use,
2247                       edit::rewriteObjCRedundantCallWithLiteral);
2248  }
2249  
2250  /// \brief Diagnose use of %s directive in an NSString which is being passed
2251  /// as formatting string to formatting method.
2252  static void
DiagnoseCStringFormatDirectiveInObjCAPI(Sema & S,ObjCMethodDecl * Method,Selector Sel,Expr ** Args,unsigned NumArgs)2253  DiagnoseCStringFormatDirectiveInObjCAPI(Sema &S,
2254                                          ObjCMethodDecl *Method,
2255                                          Selector Sel,
2256                                          Expr **Args, unsigned NumArgs) {
2257    unsigned Idx = 0;
2258    bool Format = false;
2259    ObjCStringFormatFamily SFFamily = Sel.getStringFormatFamily();
2260    if (SFFamily == ObjCStringFormatFamily::SFF_NSString) {
2261      Idx = 0;
2262      Format = true;
2263    }
2264    else if (Method) {
2265      for (const auto *I : Method->specific_attrs<FormatAttr>()) {
2266        if (S.GetFormatNSStringIdx(I, Idx)) {
2267          Format = true;
2268          break;
2269        }
2270      }
2271    }
2272    if (!Format || NumArgs <= Idx)
2273      return;
2274  
2275    Expr *FormatExpr = Args[Idx];
2276    if (ObjCStringLiteral *OSL =
2277        dyn_cast<ObjCStringLiteral>(FormatExpr->IgnoreParenImpCasts())) {
2278      StringLiteral *FormatString = OSL->getString();
2279      if (S.FormatStringHasSArg(FormatString)) {
2280        S.Diag(FormatExpr->getExprLoc(), diag::warn_objc_cdirective_format_string)
2281          << "%s" << 0 << 0;
2282        if (Method)
2283          S.Diag(Method->getLocation(), diag::note_method_declared_at)
2284            << Method->getDeclName();
2285      }
2286    }
2287  }
2288  
2289  /// \brief Build an Objective-C class message expression.
2290  ///
2291  /// This routine takes care of both normal class messages and
2292  /// class messages to the superclass.
2293  ///
2294  /// \param ReceiverTypeInfo Type source information that describes the
2295  /// receiver of this message. This may be NULL, in which case we are
2296  /// sending to the superclass and \p SuperLoc must be a valid source
2297  /// location.
2298  
2299  /// \param ReceiverType The type of the object receiving the
2300  /// message. When \p ReceiverTypeInfo is non-NULL, this is the same
2301  /// type as that refers to. For a superclass send, this is the type of
2302  /// the superclass.
2303  ///
2304  /// \param SuperLoc The location of the "super" keyword in a
2305  /// superclass message.
2306  ///
2307  /// \param Sel The selector to which the message is being sent.
2308  ///
2309  /// \param Method The method that this class message is invoking, if
2310  /// already known.
2311  ///
2312  /// \param LBracLoc The location of the opening square bracket ']'.
2313  ///
2314  /// \param RBracLoc The location of the closing square bracket ']'.
2315  ///
2316  /// \param ArgsIn The message arguments.
BuildClassMessage(TypeSourceInfo * ReceiverTypeInfo,QualType ReceiverType,SourceLocation SuperLoc,Selector Sel,ObjCMethodDecl * Method,SourceLocation LBracLoc,ArrayRef<SourceLocation> SelectorLocs,SourceLocation RBracLoc,MultiExprArg ArgsIn,bool isImplicit)2317  ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
2318                                     QualType ReceiverType,
2319                                     SourceLocation SuperLoc,
2320                                     Selector Sel,
2321                                     ObjCMethodDecl *Method,
2322                                     SourceLocation LBracLoc,
2323                                     ArrayRef<SourceLocation> SelectorLocs,
2324                                     SourceLocation RBracLoc,
2325                                     MultiExprArg ArgsIn,
2326                                     bool isImplicit) {
2327    SourceLocation Loc = SuperLoc.isValid()? SuperLoc
2328      : ReceiverTypeInfo->getTypeLoc().getSourceRange().getBegin();
2329    if (LBracLoc.isInvalid()) {
2330      Diag(Loc, diag::err_missing_open_square_message_send)
2331        << FixItHint::CreateInsertion(Loc, "[");
2332      LBracLoc = Loc;
2333    }
2334    SourceLocation SelLoc;
2335    if (!SelectorLocs.empty() && SelectorLocs.front().isValid())
2336      SelLoc = SelectorLocs.front();
2337    else
2338      SelLoc = Loc;
2339  
2340    if (ReceiverType->isDependentType()) {
2341      // If the receiver type is dependent, we can't type-check anything
2342      // at this point. Build a dependent expression.
2343      unsigned NumArgs = ArgsIn.size();
2344      Expr **Args = ArgsIn.data();
2345      assert(SuperLoc.isInvalid() && "Message to super with dependent type");
2346      return ObjCMessageExpr::Create(
2347          Context, ReceiverType, VK_RValue, LBracLoc, ReceiverTypeInfo, Sel,
2348          SelectorLocs, /*Method=*/nullptr, makeArrayRef(Args, NumArgs), RBracLoc,
2349          isImplicit);
2350    }
2351  
2352    // Find the class to which we are sending this message.
2353    ObjCInterfaceDecl *Class = nullptr;
2354    const ObjCObjectType *ClassType = ReceiverType->getAs<ObjCObjectType>();
2355    if (!ClassType || !(Class = ClassType->getInterface())) {
2356      Diag(Loc, diag::err_invalid_receiver_class_message)
2357        << ReceiverType;
2358      return ExprError();
2359    }
2360    assert(Class && "We don't know which class we're messaging?");
2361    // objc++ diagnoses during typename annotation.
2362    if (!getLangOpts().CPlusPlus)
2363      (void)DiagnoseUseOfDecl(Class, SelLoc);
2364    // Find the method we are messaging.
2365    if (!Method) {
2366      SourceRange TypeRange
2367        = SuperLoc.isValid()? SourceRange(SuperLoc)
2368                            : ReceiverTypeInfo->getTypeLoc().getSourceRange();
2369      if (RequireCompleteType(Loc, Context.getObjCInterfaceType(Class),
2370                              (getLangOpts().ObjCAutoRefCount
2371                                 ? diag::err_arc_receiver_forward_class
2372                                 : diag::warn_receiver_forward_class),
2373                              TypeRange)) {
2374        // A forward class used in messaging is treated as a 'Class'
2375        Method = LookupFactoryMethodInGlobalPool(Sel,
2376                                                 SourceRange(LBracLoc, RBracLoc));
2377        if (Method && !getLangOpts().ObjCAutoRefCount)
2378          Diag(Method->getLocation(), diag::note_method_sent_forward_class)
2379            << Method->getDeclName();
2380      }
2381      if (!Method)
2382        Method = Class->lookupClassMethod(Sel);
2383  
2384      // If we have an implementation in scope, check "private" methods.
2385      if (!Method)
2386        Method = Class->lookupPrivateClassMethod(Sel);
2387  
2388      if (Method && DiagnoseUseOfDecl(Method, SelLoc))
2389        return ExprError();
2390    }
2391  
2392    // Check the argument types and determine the result type.
2393    QualType ReturnType;
2394    ExprValueKind VK = VK_RValue;
2395  
2396    unsigned NumArgs = ArgsIn.size();
2397    Expr **Args = ArgsIn.data();
2398    if (CheckMessageArgumentTypes(ReceiverType, MultiExprArg(Args, NumArgs),
2399                                  Sel, SelectorLocs,
2400                                  Method, true,
2401                                  SuperLoc.isValid(), LBracLoc, RBracLoc,
2402                                  SourceRange(),
2403                                  ReturnType, VK))
2404      return ExprError();
2405  
2406    if (Method && !Method->getReturnType()->isVoidType() &&
2407        RequireCompleteType(LBracLoc, Method->getReturnType(),
2408                            diag::err_illegal_message_expr_incomplete_type))
2409      return ExprError();
2410  
2411    // Warn about explicit call of +initialize on its own class. But not on 'super'.
2412    if (Method && Method->getMethodFamily() == OMF_initialize) {
2413      if (!SuperLoc.isValid()) {
2414        const ObjCInterfaceDecl *ID =
2415          dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext());
2416        if (ID == Class) {
2417          Diag(Loc, diag::warn_direct_initialize_call);
2418          Diag(Method->getLocation(), diag::note_method_declared_at)
2419            << Method->getDeclName();
2420        }
2421      }
2422      else if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) {
2423        // [super initialize] is allowed only within an +initialize implementation
2424        if (CurMeth->getMethodFamily() != OMF_initialize) {
2425          Diag(Loc, diag::warn_direct_super_initialize_call);
2426          Diag(Method->getLocation(), diag::note_method_declared_at)
2427            << Method->getDeclName();
2428          Diag(CurMeth->getLocation(), diag::note_method_declared_at)
2429          << CurMeth->getDeclName();
2430        }
2431      }
2432    }
2433  
2434    DiagnoseCStringFormatDirectiveInObjCAPI(*this, Method, Sel, Args, NumArgs);
2435  
2436    // Construct the appropriate ObjCMessageExpr.
2437    ObjCMessageExpr *Result;
2438    if (SuperLoc.isValid())
2439      Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
2440                                       SuperLoc, /*IsInstanceSuper=*/false,
2441                                       ReceiverType, Sel, SelectorLocs,
2442                                       Method, makeArrayRef(Args, NumArgs),
2443                                       RBracLoc, isImplicit);
2444    else {
2445      Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
2446                                       ReceiverTypeInfo, Sel, SelectorLocs,
2447                                       Method, makeArrayRef(Args, NumArgs),
2448                                       RBracLoc, isImplicit);
2449      if (!isImplicit)
2450        checkCocoaAPI(*this, Result);
2451    }
2452    return MaybeBindToTemporary(Result);
2453  }
2454  
2455  // ActOnClassMessage - used for both unary and keyword messages.
2456  // ArgExprs is optional - if it is present, the number of expressions
2457  // is obtained from Sel.getNumArgs().
ActOnClassMessage(Scope * S,ParsedType Receiver,Selector Sel,SourceLocation LBracLoc,ArrayRef<SourceLocation> SelectorLocs,SourceLocation RBracLoc,MultiExprArg Args)2458  ExprResult Sema::ActOnClassMessage(Scope *S,
2459                                     ParsedType Receiver,
2460                                     Selector Sel,
2461                                     SourceLocation LBracLoc,
2462                                     ArrayRef<SourceLocation> SelectorLocs,
2463                                     SourceLocation RBracLoc,
2464                                     MultiExprArg Args) {
2465    TypeSourceInfo *ReceiverTypeInfo;
2466    QualType ReceiverType = GetTypeFromParser(Receiver, &ReceiverTypeInfo);
2467    if (ReceiverType.isNull())
2468      return ExprError();
2469  
2470  
2471    if (!ReceiverTypeInfo)
2472      ReceiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType, LBracLoc);
2473  
2474    return BuildClassMessage(ReceiverTypeInfo, ReceiverType,
2475                             /*SuperLoc=*/SourceLocation(), Sel,
2476                             /*Method=*/nullptr, LBracLoc, SelectorLocs, RBracLoc,
2477                             Args);
2478  }
2479  
BuildInstanceMessageImplicit(Expr * Receiver,QualType ReceiverType,SourceLocation Loc,Selector Sel,ObjCMethodDecl * Method,MultiExprArg Args)2480  ExprResult Sema::BuildInstanceMessageImplicit(Expr *Receiver,
2481                                                QualType ReceiverType,
2482                                                SourceLocation Loc,
2483                                                Selector Sel,
2484                                                ObjCMethodDecl *Method,
2485                                                MultiExprArg Args) {
2486    return BuildInstanceMessage(Receiver, ReceiverType,
2487                                /*SuperLoc=*/!Receiver ? Loc : SourceLocation(),
2488                                Sel, Method, Loc, Loc, Loc, Args,
2489                                /*isImplicit=*/true);
2490  }
2491  
2492  /// \brief Build an Objective-C instance message expression.
2493  ///
2494  /// This routine takes care of both normal instance messages and
2495  /// instance messages to the superclass instance.
2496  ///
2497  /// \param Receiver The expression that computes the object that will
2498  /// receive this message. This may be empty, in which case we are
2499  /// sending to the superclass instance and \p SuperLoc must be a valid
2500  /// source location.
2501  ///
2502  /// \param ReceiverType The (static) type of the object receiving the
2503  /// message. When a \p Receiver expression is provided, this is the
2504  /// same type as that expression. For a superclass instance send, this
2505  /// is a pointer to the type of the superclass.
2506  ///
2507  /// \param SuperLoc The location of the "super" keyword in a
2508  /// superclass instance message.
2509  ///
2510  /// \param Sel The selector to which the message is being sent.
2511  ///
2512  /// \param Method The method that this instance message is invoking, if
2513  /// already known.
2514  ///
2515  /// \param LBracLoc The location of the opening square bracket ']'.
2516  ///
2517  /// \param RBracLoc The location of the closing square bracket ']'.
2518  ///
2519  /// \param ArgsIn The message arguments.
BuildInstanceMessage(Expr * Receiver,QualType ReceiverType,SourceLocation SuperLoc,Selector Sel,ObjCMethodDecl * Method,SourceLocation LBracLoc,ArrayRef<SourceLocation> SelectorLocs,SourceLocation RBracLoc,MultiExprArg ArgsIn,bool isImplicit)2520  ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
2521                                        QualType ReceiverType,
2522                                        SourceLocation SuperLoc,
2523                                        Selector Sel,
2524                                        ObjCMethodDecl *Method,
2525                                        SourceLocation LBracLoc,
2526                                        ArrayRef<SourceLocation> SelectorLocs,
2527                                        SourceLocation RBracLoc,
2528                                        MultiExprArg ArgsIn,
2529                                        bool isImplicit) {
2530    // The location of the receiver.
2531    SourceLocation Loc = SuperLoc.isValid()? SuperLoc : Receiver->getLocStart();
2532    SourceRange RecRange =
2533        SuperLoc.isValid()? SuperLoc : Receiver->getSourceRange();
2534    SourceLocation SelLoc;
2535    if (!SelectorLocs.empty() && SelectorLocs.front().isValid())
2536      SelLoc = SelectorLocs.front();
2537    else
2538      SelLoc = Loc;
2539  
2540    if (LBracLoc.isInvalid()) {
2541      Diag(Loc, diag::err_missing_open_square_message_send)
2542        << FixItHint::CreateInsertion(Loc, "[");
2543      LBracLoc = Loc;
2544    }
2545  
2546    // If we have a receiver expression, perform appropriate promotions
2547    // and determine receiver type.
2548    if (Receiver) {
2549      if (Receiver->hasPlaceholderType()) {
2550        ExprResult Result;
2551        if (Receiver->getType() == Context.UnknownAnyTy)
2552          Result = forceUnknownAnyToType(Receiver, Context.getObjCIdType());
2553        else
2554          Result = CheckPlaceholderExpr(Receiver);
2555        if (Result.isInvalid()) return ExprError();
2556        Receiver = Result.get();
2557      }
2558  
2559      if (Receiver->isTypeDependent()) {
2560        // If the receiver is type-dependent, we can't type-check anything
2561        // at this point. Build a dependent expression.
2562        unsigned NumArgs = ArgsIn.size();
2563        Expr **Args = ArgsIn.data();
2564        assert(SuperLoc.isInvalid() && "Message to super with dependent type");
2565        return ObjCMessageExpr::Create(
2566            Context, Context.DependentTy, VK_RValue, LBracLoc, Receiver, Sel,
2567            SelectorLocs, /*Method=*/nullptr, makeArrayRef(Args, NumArgs),
2568            RBracLoc, isImplicit);
2569      }
2570  
2571      // If necessary, apply function/array conversion to the receiver.
2572      // C99 6.7.5.3p[7,8].
2573      ExprResult Result = DefaultFunctionArrayLvalueConversion(Receiver);
2574      if (Result.isInvalid())
2575        return ExprError();
2576      Receiver = Result.get();
2577      ReceiverType = Receiver->getType();
2578  
2579      // If the receiver is an ObjC pointer, a block pointer, or an
2580      // __attribute__((NSObject)) pointer, we don't need to do any
2581      // special conversion in order to look up a receiver.
2582      if (ReceiverType->isObjCRetainableType()) {
2583        // do nothing
2584      } else if (!getLangOpts().ObjCAutoRefCount &&
2585                 !Context.getObjCIdType().isNull() &&
2586                 (ReceiverType->isPointerType() ||
2587                  ReceiverType->isIntegerType())) {
2588        // Implicitly convert integers and pointers to 'id' but emit a warning.
2589        // But not in ARC.
2590        Diag(Loc, diag::warn_bad_receiver_type)
2591          << ReceiverType
2592          << Receiver->getSourceRange();
2593        if (ReceiverType->isPointerType()) {
2594          Receiver = ImpCastExprToType(Receiver, Context.getObjCIdType(),
2595                                       CK_CPointerToObjCPointerCast).get();
2596        } else {
2597          // TODO: specialized warning on null receivers?
2598          bool IsNull = Receiver->isNullPointerConstant(Context,
2599                                                Expr::NPC_ValueDependentIsNull);
2600          CastKind Kind = IsNull ? CK_NullToPointer : CK_IntegralToPointer;
2601          Receiver = ImpCastExprToType(Receiver, Context.getObjCIdType(),
2602                                       Kind).get();
2603        }
2604        ReceiverType = Receiver->getType();
2605      } else if (getLangOpts().CPlusPlus) {
2606        // The receiver must be a complete type.
2607        if (RequireCompleteType(Loc, Receiver->getType(),
2608                                diag::err_incomplete_receiver_type))
2609          return ExprError();
2610  
2611        ExprResult result = PerformContextuallyConvertToObjCPointer(Receiver);
2612        if (result.isUsable()) {
2613          Receiver = result.get();
2614          ReceiverType = Receiver->getType();
2615        }
2616      }
2617    }
2618  
2619    // There's a somewhat weird interaction here where we assume that we
2620    // won't actually have a method unless we also don't need to do some
2621    // of the more detailed type-checking on the receiver.
2622  
2623    if (!Method) {
2624      // Handle messages to id and __kindof types (where we use the
2625      // global method pool).
2626      // FIXME: The type bound is currently ignored by lookup in the
2627      // global pool.
2628      const ObjCObjectType *typeBound = nullptr;
2629      bool receiverIsIdLike = ReceiverType->isObjCIdOrObjectKindOfType(Context,
2630                                                                       typeBound);
2631      if (receiverIsIdLike || ReceiverType->isBlockPointerType() ||
2632          (Receiver && Context.isObjCNSObjectType(Receiver->getType()))) {
2633        Method = LookupInstanceMethodInGlobalPool(Sel,
2634                                                  SourceRange(LBracLoc, RBracLoc),
2635                                                  receiverIsIdLike);
2636        if (!Method)
2637          Method = LookupFactoryMethodInGlobalPool(Sel,
2638                                                   SourceRange(LBracLoc,RBracLoc),
2639                                                   receiverIsIdLike);
2640        if (Method) {
2641          if (ObjCMethodDecl *BestMethod =
2642                SelectBestMethod(Sel, ArgsIn, Method->isInstanceMethod()))
2643            Method = BestMethod;
2644          if (!AreMultipleMethodsInGlobalPool(Sel, Method,
2645                                              SourceRange(LBracLoc, RBracLoc),
2646                                              receiverIsIdLike)) {
2647            DiagnoseUseOfDecl(Method, SelLoc);
2648          }
2649        }
2650      } else if (ReceiverType->isObjCClassOrClassKindOfType() ||
2651                 ReceiverType->isObjCQualifiedClassType()) {
2652        // Handle messages to Class.
2653        // We allow sending a message to a qualified Class ("Class<foo>"), which
2654        // is ok as long as one of the protocols implements the selector (if not,
2655        // warn).
2656        if (!ReceiverType->isObjCClassOrClassKindOfType()) {
2657          const ObjCObjectPointerType *QClassTy
2658            = ReceiverType->getAsObjCQualifiedClassType();
2659          // Search protocols for class methods.
2660          Method = LookupMethodInQualifiedType(Sel, QClassTy, false);
2661          if (!Method) {
2662            Method = LookupMethodInQualifiedType(Sel, QClassTy, true);
2663            // warn if instance method found for a Class message.
2664            if (Method) {
2665              Diag(SelLoc, diag::warn_instance_method_on_class_found)
2666                << Method->getSelector() << Sel;
2667              Diag(Method->getLocation(), diag::note_method_declared_at)
2668                << Method->getDeclName();
2669            }
2670          }
2671        } else {
2672          if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) {
2673            if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) {
2674              // First check the public methods in the class interface.
2675              Method = ClassDecl->lookupClassMethod(Sel);
2676  
2677              if (!Method)
2678                Method = ClassDecl->lookupPrivateClassMethod(Sel);
2679            }
2680            if (Method && DiagnoseUseOfDecl(Method, SelLoc))
2681              return ExprError();
2682          }
2683          if (!Method) {
2684            // If not messaging 'self', look for any factory method named 'Sel'.
2685            if (!Receiver || !isSelfExpr(Receiver)) {
2686              Method = LookupFactoryMethodInGlobalPool(Sel,
2687                                                  SourceRange(LBracLoc, RBracLoc));
2688              if (!Method) {
2689                // If no class (factory) method was found, check if an _instance_
2690                // method of the same name exists in the root class only.
2691                Method = LookupInstanceMethodInGlobalPool(Sel,
2692                                                 SourceRange(LBracLoc, RBracLoc));
2693                if (Method)
2694                    if (const ObjCInterfaceDecl *ID =
2695                        dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) {
2696                      if (ID->getSuperClass())
2697                        Diag(SelLoc, diag::warn_root_inst_method_not_found)
2698                        << Sel << SourceRange(LBracLoc, RBracLoc);
2699                    }
2700              }
2701              if (Method)
2702                if (ObjCMethodDecl *BestMethod =
2703                    SelectBestMethod(Sel, ArgsIn, Method->isInstanceMethod()))
2704                  Method = BestMethod;
2705            }
2706          }
2707        }
2708      } else {
2709        ObjCInterfaceDecl *ClassDecl = nullptr;
2710  
2711        // We allow sending a message to a qualified ID ("id<foo>"), which is ok as
2712        // long as one of the protocols implements the selector (if not, warn).
2713        // And as long as message is not deprecated/unavailable (warn if it is).
2714        if (const ObjCObjectPointerType *QIdTy
2715                                     = ReceiverType->getAsObjCQualifiedIdType()) {
2716          // Search protocols for instance methods.
2717          Method = LookupMethodInQualifiedType(Sel, QIdTy, true);
2718          if (!Method)
2719            Method = LookupMethodInQualifiedType(Sel, QIdTy, false);
2720          if (Method && DiagnoseUseOfDecl(Method, SelLoc))
2721            return ExprError();
2722        } else if (const ObjCObjectPointerType *OCIType
2723                     = ReceiverType->getAsObjCInterfacePointerType()) {
2724          // We allow sending a message to a pointer to an interface (an object).
2725          ClassDecl = OCIType->getInterfaceDecl();
2726  
2727          // Try to complete the type. Under ARC, this is a hard error from which
2728          // we don't try to recover.
2729          // FIXME: In the non-ARC case, this will still be a hard error if the
2730          // definition is found in a module that's not visible.
2731          const ObjCInterfaceDecl *forwardClass = nullptr;
2732          if (RequireCompleteType(Loc, OCIType->getPointeeType(),
2733                getLangOpts().ObjCAutoRefCount
2734                  ? diag::err_arc_receiver_forward_instance
2735                  : diag::warn_receiver_forward_instance,
2736                                  Receiver? Receiver->getSourceRange()
2737                                          : SourceRange(SuperLoc))) {
2738            if (getLangOpts().ObjCAutoRefCount)
2739              return ExprError();
2740  
2741            forwardClass = OCIType->getInterfaceDecl();
2742            Diag(Receiver ? Receiver->getLocStart()
2743                          : SuperLoc, diag::note_receiver_is_id);
2744            Method = nullptr;
2745          } else {
2746            Method = ClassDecl->lookupInstanceMethod(Sel);
2747          }
2748  
2749          if (!Method)
2750            // Search protocol qualifiers.
2751            Method = LookupMethodInQualifiedType(Sel, OCIType, true);
2752  
2753          if (!Method) {
2754            // If we have implementations in scope, check "private" methods.
2755            Method = ClassDecl->lookupPrivateMethod(Sel);
2756  
2757            if (!Method && getLangOpts().ObjCAutoRefCount) {
2758              Diag(SelLoc, diag::err_arc_may_not_respond)
2759                << OCIType->getPointeeType() << Sel << RecRange
2760                << SourceRange(SelectorLocs.front(), SelectorLocs.back());
2761              return ExprError();
2762            }
2763  
2764            if (!Method && (!Receiver || !isSelfExpr(Receiver))) {
2765              // If we still haven't found a method, look in the global pool. This
2766              // behavior isn't very desirable, however we need it for GCC
2767              // compatibility. FIXME: should we deviate??
2768              if (OCIType->qual_empty()) {
2769                Method = LookupInstanceMethodInGlobalPool(Sel,
2770                                                SourceRange(LBracLoc, RBracLoc));
2771                if (Method) {
2772                  if (auto BestMethod =
2773                        SelectBestMethod(Sel, ArgsIn, Method->isInstanceMethod()))
2774                    Method = BestMethod;
2775                  AreMultipleMethodsInGlobalPool(Sel, Method,
2776                                                 SourceRange(LBracLoc, RBracLoc),
2777                                                 true);
2778                }
2779                if (Method && !forwardClass)
2780                  Diag(SelLoc, diag::warn_maynot_respond)
2781                    << OCIType->getInterfaceDecl()->getIdentifier()
2782                    << Sel << RecRange;
2783              }
2784            }
2785          }
2786          if (Method && DiagnoseUseOfDecl(Method, SelLoc, forwardClass))
2787            return ExprError();
2788        } else {
2789          // Reject other random receiver types (e.g. structs).
2790          Diag(Loc, diag::err_bad_receiver_type)
2791            << ReceiverType << Receiver->getSourceRange();
2792          return ExprError();
2793        }
2794      }
2795    }
2796  
2797    FunctionScopeInfo *DIFunctionScopeInfo =
2798      (Method && Method->getMethodFamily() == OMF_init)
2799        ? getEnclosingFunction() : nullptr;
2800  
2801    if (DIFunctionScopeInfo &&
2802        DIFunctionScopeInfo->ObjCIsDesignatedInit &&
2803        (SuperLoc.isValid() || isSelfExpr(Receiver))) {
2804      bool isDesignatedInitChain = false;
2805      if (SuperLoc.isValid()) {
2806        if (const ObjCObjectPointerType *
2807              OCIType = ReceiverType->getAsObjCInterfacePointerType()) {
2808          if (const ObjCInterfaceDecl *ID = OCIType->getInterfaceDecl()) {
2809            // Either we know this is a designated initializer or we
2810            // conservatively assume it because we don't know for sure.
2811            if (!ID->declaresOrInheritsDesignatedInitializers() ||
2812                ID->isDesignatedInitializer(Sel)) {
2813              isDesignatedInitChain = true;
2814              DIFunctionScopeInfo->ObjCWarnForNoDesignatedInitChain = false;
2815            }
2816          }
2817        }
2818      }
2819      if (!isDesignatedInitChain) {
2820        const ObjCMethodDecl *InitMethod = nullptr;
2821        bool isDesignated =
2822          getCurMethodDecl()->isDesignatedInitializerForTheInterface(&InitMethod);
2823        assert(isDesignated && InitMethod);
2824        (void)isDesignated;
2825        Diag(SelLoc, SuperLoc.isValid() ?
2826               diag::warn_objc_designated_init_non_designated_init_call :
2827               diag::warn_objc_designated_init_non_super_designated_init_call);
2828        Diag(InitMethod->getLocation(),
2829             diag::note_objc_designated_init_marked_here);
2830      }
2831    }
2832  
2833    if (DIFunctionScopeInfo &&
2834        DIFunctionScopeInfo->ObjCIsSecondaryInit &&
2835        (SuperLoc.isValid() || isSelfExpr(Receiver))) {
2836      if (SuperLoc.isValid()) {
2837        Diag(SelLoc, diag::warn_objc_secondary_init_super_init_call);
2838      } else {
2839        DIFunctionScopeInfo->ObjCWarnForNoInitDelegation = false;
2840      }
2841    }
2842  
2843    // Check the message arguments.
2844    unsigned NumArgs = ArgsIn.size();
2845    Expr **Args = ArgsIn.data();
2846    QualType ReturnType;
2847    ExprValueKind VK = VK_RValue;
2848    bool ClassMessage = (ReceiverType->isObjCClassType() ||
2849                         ReceiverType->isObjCQualifiedClassType());
2850    if (CheckMessageArgumentTypes(ReceiverType, MultiExprArg(Args, NumArgs),
2851                                  Sel, SelectorLocs, Method,
2852                                  ClassMessage, SuperLoc.isValid(),
2853                                  LBracLoc, RBracLoc, RecRange, ReturnType, VK))
2854      return ExprError();
2855  
2856    if (Method && !Method->getReturnType()->isVoidType() &&
2857        RequireCompleteType(LBracLoc, Method->getReturnType(),
2858                            diag::err_illegal_message_expr_incomplete_type))
2859      return ExprError();
2860  
2861    // In ARC, forbid the user from sending messages to
2862    // retain/release/autorelease/dealloc/retainCount explicitly.
2863    if (getLangOpts().ObjCAutoRefCount) {
2864      ObjCMethodFamily family =
2865        (Method ? Method->getMethodFamily() : Sel.getMethodFamily());
2866      switch (family) {
2867      case OMF_init:
2868        if (Method)
2869          checkInitMethod(Method, ReceiverType);
2870  
2871      case OMF_None:
2872      case OMF_alloc:
2873      case OMF_copy:
2874      case OMF_finalize:
2875      case OMF_mutableCopy:
2876      case OMF_new:
2877      case OMF_self:
2878      case OMF_initialize:
2879        break;
2880  
2881      case OMF_dealloc:
2882      case OMF_retain:
2883      case OMF_release:
2884      case OMF_autorelease:
2885      case OMF_retainCount:
2886        Diag(SelLoc, diag::err_arc_illegal_explicit_message)
2887          << Sel << RecRange;
2888        break;
2889  
2890      case OMF_performSelector:
2891        if (Method && NumArgs >= 1) {
2892          if (ObjCSelectorExpr *SelExp = dyn_cast<ObjCSelectorExpr>(Args[0])) {
2893            Selector ArgSel = SelExp->getSelector();
2894            ObjCMethodDecl *SelMethod =
2895              LookupInstanceMethodInGlobalPool(ArgSel,
2896                                               SelExp->getSourceRange());
2897            if (!SelMethod)
2898              SelMethod =
2899                LookupFactoryMethodInGlobalPool(ArgSel,
2900                                                SelExp->getSourceRange());
2901            if (SelMethod) {
2902              ObjCMethodFamily SelFamily = SelMethod->getMethodFamily();
2903              switch (SelFamily) {
2904                case OMF_alloc:
2905                case OMF_copy:
2906                case OMF_mutableCopy:
2907                case OMF_new:
2908                case OMF_self:
2909                case OMF_init:
2910                  // Issue error, unless ns_returns_not_retained.
2911                  if (!SelMethod->hasAttr<NSReturnsNotRetainedAttr>()) {
2912                    // selector names a +1 method
2913                    Diag(SelLoc,
2914                         diag::err_arc_perform_selector_retains);
2915                    Diag(SelMethod->getLocation(), diag::note_method_declared_at)
2916                      << SelMethod->getDeclName();
2917                  }
2918                  break;
2919                default:
2920                  // +0 call. OK. unless ns_returns_retained.
2921                  if (SelMethod->hasAttr<NSReturnsRetainedAttr>()) {
2922                    // selector names a +1 method
2923                    Diag(SelLoc,
2924                         diag::err_arc_perform_selector_retains);
2925                    Diag(SelMethod->getLocation(), diag::note_method_declared_at)
2926                      << SelMethod->getDeclName();
2927                  }
2928                  break;
2929              }
2930            }
2931          } else {
2932            // error (may leak).
2933            Diag(SelLoc, diag::warn_arc_perform_selector_leaks);
2934            Diag(Args[0]->getExprLoc(), diag::note_used_here);
2935          }
2936        }
2937        break;
2938      }
2939    }
2940  
2941    DiagnoseCStringFormatDirectiveInObjCAPI(*this, Method, Sel, Args, NumArgs);
2942  
2943    // Construct the appropriate ObjCMessageExpr instance.
2944    ObjCMessageExpr *Result;
2945    if (SuperLoc.isValid())
2946      Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
2947                                       SuperLoc,  /*IsInstanceSuper=*/true,
2948                                       ReceiverType, Sel, SelectorLocs, Method,
2949                                       makeArrayRef(Args, NumArgs), RBracLoc,
2950                                       isImplicit);
2951    else {
2952      Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
2953                                       Receiver, Sel, SelectorLocs, Method,
2954                                       makeArrayRef(Args, NumArgs), RBracLoc,
2955                                       isImplicit);
2956      if (!isImplicit)
2957        checkCocoaAPI(*this, Result);
2958    }
2959  
2960    if (getLangOpts().ObjCAutoRefCount) {
2961      // In ARC, annotate delegate init calls.
2962      if (Result->getMethodFamily() == OMF_init &&
2963          (SuperLoc.isValid() || isSelfExpr(Receiver))) {
2964        // Only consider init calls *directly* in init implementations,
2965        // not within blocks.
2966        ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(CurContext);
2967        if (method && method->getMethodFamily() == OMF_init) {
2968          // The implicit assignment to self means we also don't want to
2969          // consume the result.
2970          Result->setDelegateInitCall(true);
2971          return Result;
2972        }
2973      }
2974  
2975      // In ARC, check for message sends which are likely to introduce
2976      // retain cycles.
2977      checkRetainCycles(Result);
2978  
2979      if (!isImplicit && Method) {
2980        if (const ObjCPropertyDecl *Prop = Method->findPropertyDecl()) {
2981          bool IsWeak =
2982            Prop->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak;
2983          if (!IsWeak && Sel.isUnarySelector())
2984            IsWeak = ReturnType.getObjCLifetime() & Qualifiers::OCL_Weak;
2985          if (IsWeak &&
2986              !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, LBracLoc))
2987            getCurFunction()->recordUseOfWeak(Result, Prop);
2988        }
2989      }
2990    }
2991  
2992    CheckObjCCircularContainer(Result);
2993  
2994    return MaybeBindToTemporary(Result);
2995  }
2996  
RemoveSelectorFromWarningCache(Sema & S,Expr * Arg)2997  static void RemoveSelectorFromWarningCache(Sema &S, Expr* Arg) {
2998    if (ObjCSelectorExpr *OSE =
2999        dyn_cast<ObjCSelectorExpr>(Arg->IgnoreParenCasts())) {
3000      Selector Sel = OSE->getSelector();
3001      SourceLocation Loc = OSE->getAtLoc();
3002      auto Pos = S.ReferencedSelectors.find(Sel);
3003      if (Pos != S.ReferencedSelectors.end() && Pos->second == Loc)
3004        S.ReferencedSelectors.erase(Pos);
3005    }
3006  }
3007  
3008  // ActOnInstanceMessage - used for both unary and keyword messages.
3009  // ArgExprs is optional - if it is present, the number of expressions
3010  // is obtained from Sel.getNumArgs().
ActOnInstanceMessage(Scope * S,Expr * Receiver,Selector Sel,SourceLocation LBracLoc,ArrayRef<SourceLocation> SelectorLocs,SourceLocation RBracLoc,MultiExprArg Args)3011  ExprResult Sema::ActOnInstanceMessage(Scope *S,
3012                                        Expr *Receiver,
3013                                        Selector Sel,
3014                                        SourceLocation LBracLoc,
3015                                        ArrayRef<SourceLocation> SelectorLocs,
3016                                        SourceLocation RBracLoc,
3017                                        MultiExprArg Args) {
3018    if (!Receiver)
3019      return ExprError();
3020  
3021    // A ParenListExpr can show up while doing error recovery with invalid code.
3022    if (isa<ParenListExpr>(Receiver)) {
3023      ExprResult Result = MaybeConvertParenListExprToParenExpr(S, Receiver);
3024      if (Result.isInvalid()) return ExprError();
3025      Receiver = Result.get();
3026    }
3027  
3028    if (RespondsToSelectorSel.isNull()) {
3029      IdentifierInfo *SelectorId = &Context.Idents.get("respondsToSelector");
3030      RespondsToSelectorSel = Context.Selectors.getUnarySelector(SelectorId);
3031    }
3032    if (Sel == RespondsToSelectorSel)
3033      RemoveSelectorFromWarningCache(*this, Args[0]);
3034  
3035    return BuildInstanceMessage(Receiver, Receiver->getType(),
3036                                /*SuperLoc=*/SourceLocation(), Sel,
3037                                /*Method=*/nullptr, LBracLoc, SelectorLocs,
3038                                RBracLoc, Args);
3039  }
3040  
3041  enum ARCConversionTypeClass {
3042    /// int, void, struct A
3043    ACTC_none,
3044  
3045    /// id, void (^)()
3046    ACTC_retainable,
3047  
3048    /// id*, id***, void (^*)(),
3049    ACTC_indirectRetainable,
3050  
3051    /// void* might be a normal C type, or it might a CF type.
3052    ACTC_voidPtr,
3053  
3054    /// struct A*
3055    ACTC_coreFoundation
3056  };
isAnyRetainable(ARCConversionTypeClass ACTC)3057  static bool isAnyRetainable(ARCConversionTypeClass ACTC) {
3058    return (ACTC == ACTC_retainable ||
3059            ACTC == ACTC_coreFoundation ||
3060            ACTC == ACTC_voidPtr);
3061  }
isAnyCLike(ARCConversionTypeClass ACTC)3062  static bool isAnyCLike(ARCConversionTypeClass ACTC) {
3063    return ACTC == ACTC_none ||
3064           ACTC == ACTC_voidPtr ||
3065           ACTC == ACTC_coreFoundation;
3066  }
3067  
classifyTypeForARCConversion(QualType type)3068  static ARCConversionTypeClass classifyTypeForARCConversion(QualType type) {
3069    bool isIndirect = false;
3070  
3071    // Ignore an outermost reference type.
3072    if (const ReferenceType *ref = type->getAs<ReferenceType>()) {
3073      type = ref->getPointeeType();
3074      isIndirect = true;
3075    }
3076  
3077    // Drill through pointers and arrays recursively.
3078    while (true) {
3079      if (const PointerType *ptr = type->getAs<PointerType>()) {
3080        type = ptr->getPointeeType();
3081  
3082        // The first level of pointer may be the innermost pointer on a CF type.
3083        if (!isIndirect) {
3084          if (type->isVoidType()) return ACTC_voidPtr;
3085          if (type->isRecordType()) return ACTC_coreFoundation;
3086        }
3087      } else if (const ArrayType *array = type->getAsArrayTypeUnsafe()) {
3088        type = QualType(array->getElementType()->getBaseElementTypeUnsafe(), 0);
3089      } else {
3090        break;
3091      }
3092      isIndirect = true;
3093    }
3094  
3095    if (isIndirect) {
3096      if (type->isObjCARCBridgableType())
3097        return ACTC_indirectRetainable;
3098      return ACTC_none;
3099    }
3100  
3101    if (type->isObjCARCBridgableType())
3102      return ACTC_retainable;
3103  
3104    return ACTC_none;
3105  }
3106  
3107  namespace {
3108    /// A result from the cast checker.
3109    enum ACCResult {
3110      /// Cannot be casted.
3111      ACC_invalid,
3112  
3113      /// Can be safely retained or not retained.
3114      ACC_bottom,
3115  
3116      /// Can be casted at +0.
3117      ACC_plusZero,
3118  
3119      /// Can be casted at +1.
3120      ACC_plusOne
3121    };
merge(ACCResult left,ACCResult right)3122    ACCResult merge(ACCResult left, ACCResult right) {
3123      if (left == right) return left;
3124      if (left == ACC_bottom) return right;
3125      if (right == ACC_bottom) return left;
3126      return ACC_invalid;
3127    }
3128  
3129    /// A checker which white-lists certain expressions whose conversion
3130    /// to or from retainable type would otherwise be forbidden in ARC.
3131    class ARCCastChecker : public StmtVisitor<ARCCastChecker, ACCResult> {
3132      typedef StmtVisitor<ARCCastChecker, ACCResult> super;
3133  
3134      ASTContext &Context;
3135      ARCConversionTypeClass SourceClass;
3136      ARCConversionTypeClass TargetClass;
3137      bool Diagnose;
3138  
isCFType(QualType type)3139      static bool isCFType(QualType type) {
3140        // Someday this can use ns_bridged.  For now, it has to do this.
3141        return type->isCARCBridgableType();
3142      }
3143  
3144    public:
ARCCastChecker(ASTContext & Context,ARCConversionTypeClass source,ARCConversionTypeClass target,bool diagnose)3145      ARCCastChecker(ASTContext &Context, ARCConversionTypeClass source,
3146                     ARCConversionTypeClass target, bool diagnose)
3147        : Context(Context), SourceClass(source), TargetClass(target),
3148          Diagnose(diagnose) {}
3149  
3150      using super::Visit;
Visit(Expr * e)3151      ACCResult Visit(Expr *e) {
3152        return super::Visit(e->IgnoreParens());
3153      }
3154  
VisitStmt(Stmt * s)3155      ACCResult VisitStmt(Stmt *s) {
3156        return ACC_invalid;
3157      }
3158  
3159      /// Null pointer constants can be casted however you please.
VisitExpr(Expr * e)3160      ACCResult VisitExpr(Expr *e) {
3161        if (e->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull))
3162          return ACC_bottom;
3163        return ACC_invalid;
3164      }
3165  
3166      /// Objective-C string literals can be safely casted.
VisitObjCStringLiteral(ObjCStringLiteral * e)3167      ACCResult VisitObjCStringLiteral(ObjCStringLiteral *e) {
3168        // If we're casting to any retainable type, go ahead.  Global
3169        // strings are immune to retains, so this is bottom.
3170        if (isAnyRetainable(TargetClass)) return ACC_bottom;
3171  
3172        return ACC_invalid;
3173      }
3174  
3175      /// Look through certain implicit and explicit casts.
VisitCastExpr(CastExpr * e)3176      ACCResult VisitCastExpr(CastExpr *e) {
3177        switch (e->getCastKind()) {
3178          case CK_NullToPointer:
3179            return ACC_bottom;
3180  
3181          case CK_NoOp:
3182          case CK_LValueToRValue:
3183          case CK_BitCast:
3184          case CK_CPointerToObjCPointerCast:
3185          case CK_BlockPointerToObjCPointerCast:
3186          case CK_AnyPointerToBlockPointerCast:
3187            return Visit(e->getSubExpr());
3188  
3189          default:
3190            return ACC_invalid;
3191        }
3192      }
3193  
3194      /// Look through unary extension.
VisitUnaryExtension(UnaryOperator * e)3195      ACCResult VisitUnaryExtension(UnaryOperator *e) {
3196        return Visit(e->getSubExpr());
3197      }
3198  
3199      /// Ignore the LHS of a comma operator.
VisitBinComma(BinaryOperator * e)3200      ACCResult VisitBinComma(BinaryOperator *e) {
3201        return Visit(e->getRHS());
3202      }
3203  
3204      /// Conditional operators are okay if both sides are okay.
VisitConditionalOperator(ConditionalOperator * e)3205      ACCResult VisitConditionalOperator(ConditionalOperator *e) {
3206        ACCResult left = Visit(e->getTrueExpr());
3207        if (left == ACC_invalid) return ACC_invalid;
3208        return merge(left, Visit(e->getFalseExpr()));
3209      }
3210  
3211      /// Look through pseudo-objects.
VisitPseudoObjectExpr(PseudoObjectExpr * e)3212      ACCResult VisitPseudoObjectExpr(PseudoObjectExpr *e) {
3213        // If we're getting here, we should always have a result.
3214        return Visit(e->getResultExpr());
3215      }
3216  
3217      /// Statement expressions are okay if their result expression is okay.
VisitStmtExpr(StmtExpr * e)3218      ACCResult VisitStmtExpr(StmtExpr *e) {
3219        return Visit(e->getSubStmt()->body_back());
3220      }
3221  
3222      /// Some declaration references are okay.
VisitDeclRefExpr(DeclRefExpr * e)3223      ACCResult VisitDeclRefExpr(DeclRefExpr *e) {
3224        VarDecl *var = dyn_cast<VarDecl>(e->getDecl());
3225        // References to global constants are okay.
3226        if (isAnyRetainable(TargetClass) &&
3227            isAnyRetainable(SourceClass) &&
3228            var &&
3229            var->getStorageClass() == SC_Extern &&
3230            var->getType().isConstQualified()) {
3231  
3232          // In system headers, they can also be assumed to be immune to retains.
3233          // These are things like 'kCFStringTransformToLatin'.
3234          if (Context.getSourceManager().isInSystemHeader(var->getLocation()))
3235            return ACC_bottom;
3236  
3237          return ACC_plusZero;
3238        }
3239  
3240        // Nothing else.
3241        return ACC_invalid;
3242      }
3243  
3244      /// Some calls are okay.
VisitCallExpr(CallExpr * e)3245      ACCResult VisitCallExpr(CallExpr *e) {
3246        if (FunctionDecl *fn = e->getDirectCallee())
3247          if (ACCResult result = checkCallToFunction(fn))
3248            return result;
3249  
3250        return super::VisitCallExpr(e);
3251      }
3252  
checkCallToFunction(FunctionDecl * fn)3253      ACCResult checkCallToFunction(FunctionDecl *fn) {
3254        // Require a CF*Ref return type.
3255        if (!isCFType(fn->getReturnType()))
3256          return ACC_invalid;
3257  
3258        if (!isAnyRetainable(TargetClass))
3259          return ACC_invalid;
3260  
3261        // Honor an explicit 'not retained' attribute.
3262        if (fn->hasAttr<CFReturnsNotRetainedAttr>())
3263          return ACC_plusZero;
3264  
3265        // Honor an explicit 'retained' attribute, except that for
3266        // now we're not going to permit implicit handling of +1 results,
3267        // because it's a bit frightening.
3268        if (fn->hasAttr<CFReturnsRetainedAttr>())
3269          return Diagnose ? ACC_plusOne
3270                          : ACC_invalid; // ACC_plusOne if we start accepting this
3271  
3272        // Recognize this specific builtin function, which is used by CFSTR.
3273        unsigned builtinID = fn->getBuiltinID();
3274        if (builtinID == Builtin::BI__builtin___CFStringMakeConstantString)
3275          return ACC_bottom;
3276  
3277        // Otherwise, don't do anything implicit with an unaudited function.
3278        if (!fn->hasAttr<CFAuditedTransferAttr>())
3279          return ACC_invalid;
3280  
3281        // Otherwise, it's +0 unless it follows the create convention.
3282        if (ento::coreFoundation::followsCreateRule(fn))
3283          return Diagnose ? ACC_plusOne
3284                          : ACC_invalid; // ACC_plusOne if we start accepting this
3285  
3286        return ACC_plusZero;
3287      }
3288  
VisitObjCMessageExpr(ObjCMessageExpr * e)3289      ACCResult VisitObjCMessageExpr(ObjCMessageExpr *e) {
3290        return checkCallToMethod(e->getMethodDecl());
3291      }
3292  
VisitObjCPropertyRefExpr(ObjCPropertyRefExpr * e)3293      ACCResult VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *e) {
3294        ObjCMethodDecl *method;
3295        if (e->isExplicitProperty())
3296          method = e->getExplicitProperty()->getGetterMethodDecl();
3297        else
3298          method = e->getImplicitPropertyGetter();
3299        return checkCallToMethod(method);
3300      }
3301  
checkCallToMethod(ObjCMethodDecl * method)3302      ACCResult checkCallToMethod(ObjCMethodDecl *method) {
3303        if (!method) return ACC_invalid;
3304  
3305        // Check for message sends to functions returning CF types.  We
3306        // just obey the Cocoa conventions with these, even though the
3307        // return type is CF.
3308        if (!isAnyRetainable(TargetClass) || !isCFType(method->getReturnType()))
3309          return ACC_invalid;
3310  
3311        // If the method is explicitly marked not-retained, it's +0.
3312        if (method->hasAttr<CFReturnsNotRetainedAttr>())
3313          return ACC_plusZero;
3314  
3315        // If the method is explicitly marked as returning retained, or its
3316        // selector follows a +1 Cocoa convention, treat it as +1.
3317        if (method->hasAttr<CFReturnsRetainedAttr>())
3318          return ACC_plusOne;
3319  
3320        switch (method->getSelector().getMethodFamily()) {
3321        case OMF_alloc:
3322        case OMF_copy:
3323        case OMF_mutableCopy:
3324        case OMF_new:
3325          return ACC_plusOne;
3326  
3327        default:
3328          // Otherwise, treat it as +0.
3329          return ACC_plusZero;
3330        }
3331      }
3332    };
3333  }
3334  
isKnownName(StringRef name)3335  bool Sema::isKnownName(StringRef name) {
3336    if (name.empty())
3337      return false;
3338    LookupResult R(*this, &Context.Idents.get(name), SourceLocation(),
3339                   Sema::LookupOrdinaryName);
3340    return LookupName(R, TUScope, false);
3341  }
3342  
addFixitForObjCARCConversion(Sema & S,DiagnosticBuilder & DiagB,Sema::CheckedConversionKind CCK,SourceLocation afterLParen,QualType castType,Expr * castExpr,Expr * realCast,const char * bridgeKeyword,const char * CFBridgeName)3343  static void addFixitForObjCARCConversion(Sema &S,
3344                                           DiagnosticBuilder &DiagB,
3345                                           Sema::CheckedConversionKind CCK,
3346                                           SourceLocation afterLParen,
3347                                           QualType castType,
3348                                           Expr *castExpr,
3349                                           Expr *realCast,
3350                                           const char *bridgeKeyword,
3351                                           const char *CFBridgeName) {
3352    // We handle C-style and implicit casts here.
3353    switch (CCK) {
3354    case Sema::CCK_ImplicitConversion:
3355    case Sema::CCK_CStyleCast:
3356    case Sema::CCK_OtherCast:
3357      break;
3358    case Sema::CCK_FunctionalCast:
3359      return;
3360    }
3361  
3362    if (CFBridgeName) {
3363      if (CCK == Sema::CCK_OtherCast) {
3364        if (const CXXNamedCastExpr *NCE = dyn_cast<CXXNamedCastExpr>(realCast)) {
3365          SourceRange range(NCE->getOperatorLoc(),
3366                            NCE->getAngleBrackets().getEnd());
3367          SmallString<32> BridgeCall;
3368  
3369          SourceManager &SM = S.getSourceManager();
3370          char PrevChar = *SM.getCharacterData(range.getBegin().getLocWithOffset(-1));
3371          if (Lexer::isIdentifierBodyChar(PrevChar, S.getLangOpts()))
3372            BridgeCall += ' ';
3373  
3374          BridgeCall += CFBridgeName;
3375          DiagB.AddFixItHint(FixItHint::CreateReplacement(range, BridgeCall));
3376        }
3377        return;
3378      }
3379      Expr *castedE = castExpr;
3380      if (CStyleCastExpr *CCE = dyn_cast<CStyleCastExpr>(castedE))
3381        castedE = CCE->getSubExpr();
3382      castedE = castedE->IgnoreImpCasts();
3383      SourceRange range = castedE->getSourceRange();
3384  
3385      SmallString<32> BridgeCall;
3386  
3387      SourceManager &SM = S.getSourceManager();
3388      char PrevChar = *SM.getCharacterData(range.getBegin().getLocWithOffset(-1));
3389      if (Lexer::isIdentifierBodyChar(PrevChar, S.getLangOpts()))
3390        BridgeCall += ' ';
3391  
3392      BridgeCall += CFBridgeName;
3393  
3394      if (isa<ParenExpr>(castedE)) {
3395        DiagB.AddFixItHint(FixItHint::CreateInsertion(range.getBegin(),
3396                           BridgeCall));
3397      } else {
3398        BridgeCall += '(';
3399        DiagB.AddFixItHint(FixItHint::CreateInsertion(range.getBegin(),
3400                                                      BridgeCall));
3401        DiagB.AddFixItHint(FixItHint::CreateInsertion(
3402                                         S.getLocForEndOfToken(range.getEnd()),
3403                                         ")"));
3404      }
3405      return;
3406    }
3407  
3408    if (CCK == Sema::CCK_CStyleCast) {
3409      DiagB.AddFixItHint(FixItHint::CreateInsertion(afterLParen, bridgeKeyword));
3410    } else if (CCK == Sema::CCK_OtherCast) {
3411      if (const CXXNamedCastExpr *NCE = dyn_cast<CXXNamedCastExpr>(realCast)) {
3412        std::string castCode = "(";
3413        castCode += bridgeKeyword;
3414        castCode += castType.getAsString();
3415        castCode += ")";
3416        SourceRange Range(NCE->getOperatorLoc(),
3417                          NCE->getAngleBrackets().getEnd());
3418        DiagB.AddFixItHint(FixItHint::CreateReplacement(Range, castCode));
3419      }
3420    } else {
3421      std::string castCode = "(";
3422      castCode += bridgeKeyword;
3423      castCode += castType.getAsString();
3424      castCode += ")";
3425      Expr *castedE = castExpr->IgnoreImpCasts();
3426      SourceRange range = castedE->getSourceRange();
3427      if (isa<ParenExpr>(castedE)) {
3428        DiagB.AddFixItHint(FixItHint::CreateInsertion(range.getBegin(),
3429                           castCode));
3430      } else {
3431        castCode += "(";
3432        DiagB.AddFixItHint(FixItHint::CreateInsertion(range.getBegin(),
3433                                                      castCode));
3434        DiagB.AddFixItHint(FixItHint::CreateInsertion(
3435                                         S.getLocForEndOfToken(range.getEnd()),
3436                                         ")"));
3437      }
3438    }
3439  }
3440  
3441  template <typename T>
getObjCBridgeAttr(const TypedefType * TD)3442  static inline T *getObjCBridgeAttr(const TypedefType *TD) {
3443    TypedefNameDecl *TDNDecl = TD->getDecl();
3444    QualType QT = TDNDecl->getUnderlyingType();
3445    if (QT->isPointerType()) {
3446      QT = QT->getPointeeType();
3447      if (const RecordType *RT = QT->getAs<RecordType>())
3448        if (RecordDecl *RD = RT->getDecl()->getMostRecentDecl())
3449          return RD->getAttr<T>();
3450    }
3451    return nullptr;
3452  }
3453  
ObjCBridgeRelatedAttrFromType(QualType T,TypedefNameDecl * & TDNDecl)3454  static ObjCBridgeRelatedAttr *ObjCBridgeRelatedAttrFromType(QualType T,
3455                                                              TypedefNameDecl *&TDNDecl) {
3456    while (const TypedefType *TD = dyn_cast<TypedefType>(T.getTypePtr())) {
3457      TDNDecl = TD->getDecl();
3458      if (ObjCBridgeRelatedAttr *ObjCBAttr =
3459          getObjCBridgeAttr<ObjCBridgeRelatedAttr>(TD))
3460        return ObjCBAttr;
3461      T = TDNDecl->getUnderlyingType();
3462    }
3463    return nullptr;
3464  }
3465  
3466  static void
diagnoseObjCARCConversion(Sema & S,SourceRange castRange,QualType castType,ARCConversionTypeClass castACTC,Expr * castExpr,Expr * realCast,ARCConversionTypeClass exprACTC,Sema::CheckedConversionKind CCK)3467  diagnoseObjCARCConversion(Sema &S, SourceRange castRange,
3468                            QualType castType, ARCConversionTypeClass castACTC,
3469                            Expr *castExpr, Expr *realCast,
3470                            ARCConversionTypeClass exprACTC,
3471                            Sema::CheckedConversionKind CCK) {
3472    SourceLocation loc =
3473      (castRange.isValid() ? castRange.getBegin() : castExpr->getExprLoc());
3474  
3475    if (S.makeUnavailableInSystemHeader(loc,
3476                                   UnavailableAttr::IR_ARCForbiddenConversion))
3477      return;
3478  
3479    QualType castExprType = castExpr->getType();
3480    TypedefNameDecl *TDNDecl = nullptr;
3481    if ((castACTC == ACTC_coreFoundation &&  exprACTC == ACTC_retainable &&
3482         ObjCBridgeRelatedAttrFromType(castType, TDNDecl)) ||
3483        (exprACTC == ACTC_coreFoundation && castACTC == ACTC_retainable &&
3484         ObjCBridgeRelatedAttrFromType(castExprType, TDNDecl)))
3485      return;
3486  
3487    unsigned srcKind = 0;
3488    switch (exprACTC) {
3489    case ACTC_none:
3490    case ACTC_coreFoundation:
3491    case ACTC_voidPtr:
3492      srcKind = (castExprType->isPointerType() ? 1 : 0);
3493      break;
3494    case ACTC_retainable:
3495      srcKind = (castExprType->isBlockPointerType() ? 2 : 3);
3496      break;
3497    case ACTC_indirectRetainable:
3498      srcKind = 4;
3499      break;
3500    }
3501  
3502    // Check whether this could be fixed with a bridge cast.
3503    SourceLocation afterLParen = S.getLocForEndOfToken(castRange.getBegin());
3504    SourceLocation noteLoc = afterLParen.isValid() ? afterLParen : loc;
3505  
3506    // Bridge from an ARC type to a CF type.
3507    if (castACTC == ACTC_retainable && isAnyRetainable(exprACTC)) {
3508  
3509      S.Diag(loc, diag::err_arc_cast_requires_bridge)
3510        << unsigned(CCK == Sema::CCK_ImplicitConversion) // cast|implicit
3511        << 2 // of C pointer type
3512        << castExprType
3513        << unsigned(castType->isBlockPointerType()) // to ObjC|block type
3514        << castType
3515        << castRange
3516        << castExpr->getSourceRange();
3517      bool br = S.isKnownName("CFBridgingRelease");
3518      ACCResult CreateRule =
3519        ARCCastChecker(S.Context, exprACTC, castACTC, true).Visit(castExpr);
3520      assert(CreateRule != ACC_bottom && "This cast should already be accepted.");
3521      if (CreateRule != ACC_plusOne)
3522      {
3523        DiagnosticBuilder DiagB =
3524          (CCK != Sema::CCK_OtherCast) ? S.Diag(noteLoc, diag::note_arc_bridge)
3525                                : S.Diag(noteLoc, diag::note_arc_cstyle_bridge);
3526  
3527        addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
3528                                     castType, castExpr, realCast, "__bridge ",
3529                                     nullptr);
3530      }
3531      if (CreateRule != ACC_plusZero)
3532      {
3533        DiagnosticBuilder DiagB =
3534          (CCK == Sema::CCK_OtherCast && !br) ?
3535            S.Diag(noteLoc, diag::note_arc_cstyle_bridge_transfer) << castExprType :
3536            S.Diag(br ? castExpr->getExprLoc() : noteLoc,
3537                   diag::note_arc_bridge_transfer)
3538              << castExprType << br;
3539  
3540        addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
3541                                     castType, castExpr, realCast, "__bridge_transfer ",
3542                                     br ? "CFBridgingRelease" : nullptr);
3543      }
3544  
3545      return;
3546    }
3547  
3548    // Bridge from a CF type to an ARC type.
3549    if (exprACTC == ACTC_retainable && isAnyRetainable(castACTC)) {
3550      bool br = S.isKnownName("CFBridgingRetain");
3551      S.Diag(loc, diag::err_arc_cast_requires_bridge)
3552        << unsigned(CCK == Sema::CCK_ImplicitConversion) // cast|implicit
3553        << unsigned(castExprType->isBlockPointerType()) // of ObjC|block type
3554        << castExprType
3555        << 2 // to C pointer type
3556        << castType
3557        << castRange
3558        << castExpr->getSourceRange();
3559      ACCResult CreateRule =
3560        ARCCastChecker(S.Context, exprACTC, castACTC, true).Visit(castExpr);
3561      assert(CreateRule != ACC_bottom && "This cast should already be accepted.");
3562      if (CreateRule != ACC_plusOne)
3563      {
3564        DiagnosticBuilder DiagB =
3565        (CCK != Sema::CCK_OtherCast) ? S.Diag(noteLoc, diag::note_arc_bridge)
3566                                 : S.Diag(noteLoc, diag::note_arc_cstyle_bridge);
3567        addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
3568                                     castType, castExpr, realCast, "__bridge ",
3569                                     nullptr);
3570      }
3571      if (CreateRule != ACC_plusZero)
3572      {
3573        DiagnosticBuilder DiagB =
3574          (CCK == Sema::CCK_OtherCast && !br) ?
3575            S.Diag(noteLoc, diag::note_arc_cstyle_bridge_retained) << castType :
3576            S.Diag(br ? castExpr->getExprLoc() : noteLoc,
3577                   diag::note_arc_bridge_retained)
3578              << castType << br;
3579  
3580        addFixitForObjCARCConversion(S, DiagB, CCK, afterLParen,
3581                                     castType, castExpr, realCast, "__bridge_retained ",
3582                                     br ? "CFBridgingRetain" : nullptr);
3583      }
3584  
3585      return;
3586    }
3587  
3588    S.Diag(loc, diag::err_arc_mismatched_cast)
3589      << (CCK != Sema::CCK_ImplicitConversion)
3590      << srcKind << castExprType << castType
3591      << castRange << castExpr->getSourceRange();
3592  }
3593  
3594  template <typename TB>
CheckObjCBridgeNSCast(Sema & S,QualType castType,Expr * castExpr,bool & HadTheAttribute,bool warn)3595  static bool CheckObjCBridgeNSCast(Sema &S, QualType castType, Expr *castExpr,
3596                                    bool &HadTheAttribute, bool warn) {
3597    QualType T = castExpr->getType();
3598    HadTheAttribute = false;
3599    while (const TypedefType *TD = dyn_cast<TypedefType>(T.getTypePtr())) {
3600      TypedefNameDecl *TDNDecl = TD->getDecl();
3601      if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {
3602        if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {
3603          HadTheAttribute = true;
3604          if (Parm->isStr("id"))
3605            return true;
3606  
3607          NamedDecl *Target = nullptr;
3608          // Check for an existing type with this name.
3609          LookupResult R(S, DeclarationName(Parm), SourceLocation(),
3610                         Sema::LookupOrdinaryName);
3611          if (S.LookupName(R, S.TUScope)) {
3612            Target = R.getFoundDecl();
3613            if (Target && isa<ObjCInterfaceDecl>(Target)) {
3614              ObjCInterfaceDecl *ExprClass = cast<ObjCInterfaceDecl>(Target);
3615              if (const ObjCObjectPointerType *InterfacePointerType =
3616                    castType->getAsObjCInterfacePointerType()) {
3617                ObjCInterfaceDecl *CastClass
3618                  = InterfacePointerType->getObjectType()->getInterface();
3619                if ((CastClass == ExprClass) ||
3620                    (CastClass && CastClass->isSuperClassOf(ExprClass)))
3621                  return true;
3622                if (warn)
3623                  S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)
3624                    << T << Target->getName() << castType->getPointeeType();
3625                return false;
3626              } else if (castType->isObjCIdType() ||
3627                         (S.Context.ObjCObjectAdoptsQTypeProtocols(
3628                            castType, ExprClass)))
3629                // ok to cast to 'id'.
3630                // casting to id<p-list> is ok if bridge type adopts all of
3631                // p-list protocols.
3632                return true;
3633              else {
3634                if (warn) {
3635                  S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)
3636                    << T << Target->getName() << castType;
3637                  S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3638                  S.Diag(Target->getLocStart(), diag::note_declared_at);
3639                }
3640                return false;
3641             }
3642            }
3643          } else if (!castType->isObjCIdType()) {
3644            S.Diag(castExpr->getLocStart(), diag::err_objc_cf_bridged_not_interface)
3645              << castExpr->getType() << Parm;
3646            S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3647            if (Target)
3648              S.Diag(Target->getLocStart(), diag::note_declared_at);
3649          }
3650          return true;
3651        }
3652        return false;
3653      }
3654      T = TDNDecl->getUnderlyingType();
3655    }
3656    return true;
3657  }
3658  
3659  template <typename TB>
CheckObjCBridgeCFCast(Sema & S,QualType castType,Expr * castExpr,bool & HadTheAttribute,bool warn)3660  static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr,
3661                                    bool &HadTheAttribute, bool warn) {
3662    QualType T = castType;
3663    HadTheAttribute = false;
3664    while (const TypedefType *TD = dyn_cast<TypedefType>(T.getTypePtr())) {
3665      TypedefNameDecl *TDNDecl = TD->getDecl();
3666      if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {
3667        if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {
3668          HadTheAttribute = true;
3669          if (Parm->isStr("id"))
3670            return true;
3671  
3672          NamedDecl *Target = nullptr;
3673          // Check for an existing type with this name.
3674          LookupResult R(S, DeclarationName(Parm), SourceLocation(),
3675                         Sema::LookupOrdinaryName);
3676          if (S.LookupName(R, S.TUScope)) {
3677            Target = R.getFoundDecl();
3678            if (Target && isa<ObjCInterfaceDecl>(Target)) {
3679              ObjCInterfaceDecl *CastClass = cast<ObjCInterfaceDecl>(Target);
3680              if (const ObjCObjectPointerType *InterfacePointerType =
3681                    castExpr->getType()->getAsObjCInterfacePointerType()) {
3682                ObjCInterfaceDecl *ExprClass
3683                  = InterfacePointerType->getObjectType()->getInterface();
3684                if ((CastClass == ExprClass) ||
3685                    (ExprClass && CastClass->isSuperClassOf(ExprClass)))
3686                  return true;
3687                if (warn) {
3688                  S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge_to_cf)
3689                    << castExpr->getType()->getPointeeType() << T;
3690                  S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3691                }
3692                return false;
3693              } else if (castExpr->getType()->isObjCIdType() ||
3694                         (S.Context.QIdProtocolsAdoptObjCObjectProtocols(
3695                            castExpr->getType(), CastClass)))
3696                // ok to cast an 'id' expression to a CFtype.
3697                // ok to cast an 'id<plist>' expression to CFtype provided plist
3698                // adopts all of CFtype's ObjetiveC's class plist.
3699                return true;
3700              else {
3701                if (warn) {
3702                  S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge_to_cf)
3703                    << castExpr->getType() << castType;
3704                  S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3705                  S.Diag(Target->getLocStart(), diag::note_declared_at);
3706                }
3707                return false;
3708              }
3709            }
3710          }
3711          S.Diag(castExpr->getLocStart(), diag::err_objc_ns_bridged_invalid_cfobject)
3712          << castExpr->getType() << castType;
3713          S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3714          if (Target)
3715            S.Diag(Target->getLocStart(), diag::note_declared_at);
3716          return true;
3717        }
3718        return false;
3719      }
3720      T = TDNDecl->getUnderlyingType();
3721    }
3722    return true;
3723  }
3724  
CheckTollFreeBridgeCast(QualType castType,Expr * castExpr)3725  void Sema::CheckTollFreeBridgeCast(QualType castType, Expr *castExpr) {
3726    if (!getLangOpts().ObjC1)
3727      return;
3728    // warn in presence of __bridge casting to or from a toll free bridge cast.
3729    ARCConversionTypeClass exprACTC = classifyTypeForARCConversion(castExpr->getType());
3730    ARCConversionTypeClass castACTC = classifyTypeForARCConversion(castType);
3731    if (castACTC == ACTC_retainable && exprACTC == ACTC_coreFoundation) {
3732      bool HasObjCBridgeAttr;
3733      bool ObjCBridgeAttrWillNotWarn =
3734        CheckObjCBridgeNSCast<ObjCBridgeAttr>(*this, castType, castExpr, HasObjCBridgeAttr,
3735                                              false);
3736      if (ObjCBridgeAttrWillNotWarn && HasObjCBridgeAttr)
3737        return;
3738      bool HasObjCBridgeMutableAttr;
3739      bool ObjCBridgeMutableAttrWillNotWarn =
3740        CheckObjCBridgeNSCast<ObjCBridgeMutableAttr>(*this, castType, castExpr,
3741                                                     HasObjCBridgeMutableAttr, false);
3742      if (ObjCBridgeMutableAttrWillNotWarn && HasObjCBridgeMutableAttr)
3743        return;
3744  
3745      if (HasObjCBridgeAttr)
3746        CheckObjCBridgeNSCast<ObjCBridgeAttr>(*this, castType, castExpr, HasObjCBridgeAttr,
3747                                              true);
3748      else if (HasObjCBridgeMutableAttr)
3749        CheckObjCBridgeNSCast<ObjCBridgeMutableAttr>(*this, castType, castExpr,
3750                                                     HasObjCBridgeMutableAttr, true);
3751    }
3752    else if (castACTC == ACTC_coreFoundation && exprACTC == ACTC_retainable) {
3753      bool HasObjCBridgeAttr;
3754      bool ObjCBridgeAttrWillNotWarn =
3755        CheckObjCBridgeCFCast<ObjCBridgeAttr>(*this, castType, castExpr, HasObjCBridgeAttr,
3756                                              false);
3757      if (ObjCBridgeAttrWillNotWarn && HasObjCBridgeAttr)
3758        return;
3759      bool HasObjCBridgeMutableAttr;
3760      bool ObjCBridgeMutableAttrWillNotWarn =
3761        CheckObjCBridgeCFCast<ObjCBridgeMutableAttr>(*this, castType, castExpr,
3762                                                     HasObjCBridgeMutableAttr, false);
3763      if (ObjCBridgeMutableAttrWillNotWarn && HasObjCBridgeMutableAttr)
3764        return;
3765  
3766      if (HasObjCBridgeAttr)
3767        CheckObjCBridgeCFCast<ObjCBridgeAttr>(*this, castType, castExpr, HasObjCBridgeAttr,
3768                                              true);
3769      else if (HasObjCBridgeMutableAttr)
3770        CheckObjCBridgeCFCast<ObjCBridgeMutableAttr>(*this, castType, castExpr,
3771                                                     HasObjCBridgeMutableAttr, true);
3772    }
3773  }
3774  
CheckObjCBridgeRelatedCast(QualType castType,Expr * castExpr)3775  void Sema::CheckObjCBridgeRelatedCast(QualType castType, Expr *castExpr) {
3776    QualType SrcType = castExpr->getType();
3777    if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(castExpr)) {
3778      if (PRE->isExplicitProperty()) {
3779        if (ObjCPropertyDecl *PDecl = PRE->getExplicitProperty())
3780          SrcType = PDecl->getType();
3781      }
3782      else if (PRE->isImplicitProperty()) {
3783        if (ObjCMethodDecl *Getter = PRE->getImplicitPropertyGetter())
3784          SrcType = Getter->getReturnType();
3785  
3786      }
3787    }
3788  
3789    ARCConversionTypeClass srcExprACTC = classifyTypeForARCConversion(SrcType);
3790    ARCConversionTypeClass castExprACTC = classifyTypeForARCConversion(castType);
3791    if (srcExprACTC != ACTC_retainable || castExprACTC != ACTC_coreFoundation)
3792      return;
3793    CheckObjCBridgeRelatedConversions(castExpr->getLocStart(),
3794                                      castType, SrcType, castExpr);
3795    return;
3796  }
3797  
CheckTollFreeBridgeStaticCast(QualType castType,Expr * castExpr,CastKind & Kind)3798  bool Sema::CheckTollFreeBridgeStaticCast(QualType castType, Expr *castExpr,
3799                                           CastKind &Kind) {
3800    if (!getLangOpts().ObjC1)
3801      return false;
3802    ARCConversionTypeClass exprACTC =
3803      classifyTypeForARCConversion(castExpr->getType());
3804    ARCConversionTypeClass castACTC = classifyTypeForARCConversion(castType);
3805    if ((castACTC == ACTC_retainable && exprACTC == ACTC_coreFoundation) ||
3806        (castACTC == ACTC_coreFoundation && exprACTC == ACTC_retainable)) {
3807      CheckTollFreeBridgeCast(castType, castExpr);
3808      Kind = (castACTC == ACTC_coreFoundation) ? CK_BitCast
3809                                               : CK_CPointerToObjCPointerCast;
3810      return true;
3811    }
3812    return false;
3813  }
3814  
checkObjCBridgeRelatedComponents(SourceLocation Loc,QualType DestType,QualType SrcType,ObjCInterfaceDecl * & RelatedClass,ObjCMethodDecl * & ClassMethod,ObjCMethodDecl * & InstanceMethod,TypedefNameDecl * & TDNDecl,bool CfToNs)3815  bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc,
3816                                              QualType DestType, QualType SrcType,
3817                                              ObjCInterfaceDecl *&RelatedClass,
3818                                              ObjCMethodDecl *&ClassMethod,
3819                                              ObjCMethodDecl *&InstanceMethod,
3820                                              TypedefNameDecl *&TDNDecl,
3821                                              bool CfToNs) {
3822    QualType T = CfToNs ? SrcType : DestType;
3823    ObjCBridgeRelatedAttr *ObjCBAttr = ObjCBridgeRelatedAttrFromType(T, TDNDecl);
3824    if (!ObjCBAttr)
3825      return false;
3826  
3827    IdentifierInfo *RCId = ObjCBAttr->getRelatedClass();
3828    IdentifierInfo *CMId = ObjCBAttr->getClassMethod();
3829    IdentifierInfo *IMId = ObjCBAttr->getInstanceMethod();
3830    if (!RCId)
3831      return false;
3832    NamedDecl *Target = nullptr;
3833    // Check for an existing type with this name.
3834    LookupResult R(*this, DeclarationName(RCId), SourceLocation(),
3835                   Sema::LookupOrdinaryName);
3836    if (!LookupName(R, TUScope)) {
3837      Diag(Loc, diag::err_objc_bridged_related_invalid_class) << RCId
3838            << SrcType << DestType;
3839      Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3840      return false;
3841    }
3842    Target = R.getFoundDecl();
3843    if (Target && isa<ObjCInterfaceDecl>(Target))
3844      RelatedClass = cast<ObjCInterfaceDecl>(Target);
3845    else {
3846      Diag(Loc, diag::err_objc_bridged_related_invalid_class_name) << RCId
3847            << SrcType << DestType;
3848      Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3849      if (Target)
3850        Diag(Target->getLocStart(), diag::note_declared_at);
3851      return false;
3852    }
3853  
3854    // Check for an existing class method with the given selector name.
3855    if (CfToNs && CMId) {
3856      Selector Sel = Context.Selectors.getUnarySelector(CMId);
3857      ClassMethod = RelatedClass->lookupMethod(Sel, false);
3858      if (!ClassMethod) {
3859        Diag(Loc, diag::err_objc_bridged_related_known_method)
3860              << SrcType << DestType << Sel << false;
3861        Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3862        return false;
3863      }
3864    }
3865  
3866    // Check for an existing instance method with the given selector name.
3867    if (!CfToNs && IMId) {
3868      Selector Sel = Context.Selectors.getNullarySelector(IMId);
3869      InstanceMethod = RelatedClass->lookupMethod(Sel, true);
3870      if (!InstanceMethod) {
3871        Diag(Loc, diag::err_objc_bridged_related_known_method)
3872              << SrcType << DestType << Sel << true;
3873        Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3874        return false;
3875      }
3876    }
3877    return true;
3878  }
3879  
3880  bool
CheckObjCBridgeRelatedConversions(SourceLocation Loc,QualType DestType,QualType SrcType,Expr * & SrcExpr)3881  Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc,
3882                                          QualType DestType, QualType SrcType,
3883                                          Expr *&SrcExpr) {
3884    ARCConversionTypeClass rhsExprACTC = classifyTypeForARCConversion(SrcType);
3885    ARCConversionTypeClass lhsExprACTC = classifyTypeForARCConversion(DestType);
3886    bool CfToNs = (rhsExprACTC == ACTC_coreFoundation && lhsExprACTC == ACTC_retainable);
3887    bool NsToCf = (rhsExprACTC == ACTC_retainable && lhsExprACTC == ACTC_coreFoundation);
3888    if (!CfToNs && !NsToCf)
3889      return false;
3890  
3891    ObjCInterfaceDecl *RelatedClass;
3892    ObjCMethodDecl *ClassMethod = nullptr;
3893    ObjCMethodDecl *InstanceMethod = nullptr;
3894    TypedefNameDecl *TDNDecl = nullptr;
3895    if (!checkObjCBridgeRelatedComponents(Loc, DestType, SrcType, RelatedClass,
3896                                          ClassMethod, InstanceMethod, TDNDecl, CfToNs))
3897      return false;
3898  
3899    if (CfToNs) {
3900      // Implicit conversion from CF to ObjC object is needed.
3901      if (ClassMethod) {
3902        std::string ExpressionString = "[";
3903        ExpressionString += RelatedClass->getNameAsString();
3904        ExpressionString += " ";
3905        ExpressionString += ClassMethod->getSelector().getAsString();
3906        SourceLocation SrcExprEndLoc = getLocForEndOfToken(SrcExpr->getLocEnd());
3907        // Provide a fixit: [RelatedClass ClassMethod SrcExpr]
3908        Diag(Loc, diag::err_objc_bridged_related_known_method)
3909          << SrcType << DestType << ClassMethod->getSelector() << false
3910          << FixItHint::CreateInsertion(SrcExpr->getLocStart(), ExpressionString)
3911          << FixItHint::CreateInsertion(SrcExprEndLoc, "]");
3912        Diag(RelatedClass->getLocStart(), diag::note_declared_at);
3913        Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3914  
3915        QualType receiverType =
3916          Context.getObjCInterfaceType(RelatedClass);
3917        // Argument.
3918        Expr *args[] = { SrcExpr };
3919        ExprResult msg = BuildClassMessageImplicit(receiverType, false,
3920                                        ClassMethod->getLocation(),
3921                                        ClassMethod->getSelector(), ClassMethod,
3922                                        MultiExprArg(args, 1));
3923        SrcExpr = msg.get();
3924        return true;
3925      }
3926    }
3927    else {
3928      // Implicit conversion from ObjC type to CF object is needed.
3929      if (InstanceMethod) {
3930        std::string ExpressionString;
3931        SourceLocation SrcExprEndLoc = getLocForEndOfToken(SrcExpr->getLocEnd());
3932        if (InstanceMethod->isPropertyAccessor())
3933          if (const ObjCPropertyDecl *PDecl = InstanceMethod->findPropertyDecl()) {
3934            // fixit: ObjectExpr.propertyname when it is  aproperty accessor.
3935            ExpressionString = ".";
3936            ExpressionString += PDecl->getNameAsString();
3937            Diag(Loc, diag::err_objc_bridged_related_known_method)
3938            << SrcType << DestType << InstanceMethod->getSelector() << true
3939            << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
3940          }
3941        if (ExpressionString.empty()) {
3942          // Provide a fixit: [ObjectExpr InstanceMethod]
3943          ExpressionString = " ";
3944          ExpressionString += InstanceMethod->getSelector().getAsString();
3945          ExpressionString += "]";
3946  
3947          Diag(Loc, diag::err_objc_bridged_related_known_method)
3948          << SrcType << DestType << InstanceMethod->getSelector() << true
3949          << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[")
3950          << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
3951        }
3952        Diag(RelatedClass->getLocStart(), diag::note_declared_at);
3953        Diag(TDNDecl->getLocStart(), diag::note_declared_at);
3954  
3955        ExprResult msg =
3956          BuildInstanceMessageImplicit(SrcExpr, SrcType,
3957                                       InstanceMethod->getLocation(),
3958                                       InstanceMethod->getSelector(),
3959                                       InstanceMethod, None);
3960        SrcExpr = msg.get();
3961        return true;
3962      }
3963    }
3964    return false;
3965  }
3966  
3967  Sema::ARCConversionResult
CheckObjCARCConversion(SourceRange castRange,QualType castType,Expr * & castExpr,CheckedConversionKind CCK,bool DiagnoseCFAudited,BinaryOperatorKind Opc)3968  Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType,
3969                               Expr *&castExpr, CheckedConversionKind CCK,
3970                               bool DiagnoseCFAudited,
3971                               BinaryOperatorKind Opc) {
3972    QualType castExprType = castExpr->getType();
3973  
3974    // For the purposes of the classification, we assume reference types
3975    // will bind to temporaries.
3976    QualType effCastType = castType;
3977    if (const ReferenceType *ref = castType->getAs<ReferenceType>())
3978      effCastType = ref->getPointeeType();
3979  
3980    ARCConversionTypeClass exprACTC = classifyTypeForARCConversion(castExprType);
3981    ARCConversionTypeClass castACTC = classifyTypeForARCConversion(effCastType);
3982    if (exprACTC == castACTC) {
3983      // check for viablity and report error if casting an rvalue to a
3984      // life-time qualifier.
3985      if ((castACTC == ACTC_retainable) &&
3986          (CCK == CCK_CStyleCast || CCK == CCK_OtherCast) &&
3987          (castType != castExprType)) {
3988        const Type *DT = castType.getTypePtr();
3989        QualType QDT = castType;
3990        // We desugar some types but not others. We ignore those
3991        // that cannot happen in a cast; i.e. auto, and those which
3992        // should not be de-sugared; i.e typedef.
3993        if (const ParenType *PT = dyn_cast<ParenType>(DT))
3994          QDT = PT->desugar();
3995        else if (const TypeOfType *TP = dyn_cast<TypeOfType>(DT))
3996          QDT = TP->desugar();
3997        else if (const AttributedType *AT = dyn_cast<AttributedType>(DT))
3998          QDT = AT->desugar();
3999        if (QDT != castType &&
4000            QDT.getObjCLifetime() !=  Qualifiers::OCL_None) {
4001          SourceLocation loc =
4002            (castRange.isValid() ? castRange.getBegin()
4003                                : castExpr->getExprLoc());
4004          Diag(loc, diag::err_arc_nolifetime_behavior);
4005        }
4006      }
4007      return ACR_okay;
4008    }
4009  
4010    if (isAnyCLike(exprACTC) && isAnyCLike(castACTC)) return ACR_okay;
4011  
4012    // Allow all of these types to be cast to integer types (but not
4013    // vice-versa).
4014    if (castACTC == ACTC_none && castType->isIntegralType(Context))
4015      return ACR_okay;
4016  
4017    // Allow casts between pointers to lifetime types (e.g., __strong id*)
4018    // and pointers to void (e.g., cv void *). Casting from void* to lifetime*
4019    // must be explicit.
4020    if (exprACTC == ACTC_indirectRetainable && castACTC == ACTC_voidPtr)
4021      return ACR_okay;
4022    if (castACTC == ACTC_indirectRetainable && exprACTC == ACTC_voidPtr &&
4023        CCK != CCK_ImplicitConversion)
4024      return ACR_okay;
4025  
4026    switch (ARCCastChecker(Context, exprACTC, castACTC, false).Visit(castExpr)) {
4027    // For invalid casts, fall through.
4028    case ACC_invalid:
4029      break;
4030  
4031    // Do nothing for both bottom and +0.
4032    case ACC_bottom:
4033    case ACC_plusZero:
4034      return ACR_okay;
4035  
4036    // If the result is +1, consume it here.
4037    case ACC_plusOne:
4038      castExpr = ImplicitCastExpr::Create(Context, castExpr->getType(),
4039                                          CK_ARCConsumeObject, castExpr,
4040                                          nullptr, VK_RValue);
4041      ExprNeedsCleanups = true;
4042      return ACR_okay;
4043    }
4044  
4045    // If this is a non-implicit cast from id or block type to a
4046    // CoreFoundation type, delay complaining in case the cast is used
4047    // in an acceptable context.
4048    if (exprACTC == ACTC_retainable && isAnyRetainable(castACTC) &&
4049        CCK != CCK_ImplicitConversion)
4050      return ACR_unbridged;
4051  
4052    // Do not issue bridge cast" diagnostic when implicit casting a cstring
4053    // to 'NSString *'. Let caller issue a normal mismatched diagnostic with
4054    // suitable fix-it.
4055    if (castACTC == ACTC_retainable && exprACTC == ACTC_none &&
4056        ConversionToObjCStringLiteralCheck(castType, castExpr))
4057      return ACR_okay;
4058  
4059    // Do not issue "bridge cast" diagnostic when implicit casting
4060    // a retainable object to a CF type parameter belonging to an audited
4061    // CF API function. Let caller issue a normal type mismatched diagnostic
4062    // instead.
4063    if (!DiagnoseCFAudited || exprACTC != ACTC_retainable ||
4064        castACTC != ACTC_coreFoundation)
4065      if (!(exprACTC == ACTC_voidPtr && castACTC == ACTC_retainable &&
4066            (Opc == BO_NE || Opc == BO_EQ)))
4067        diagnoseObjCARCConversion(*this, castRange, castType, castACTC,
4068                                  castExpr, castExpr, exprACTC, CCK);
4069    return ACR_okay;
4070  }
4071  
4072  /// Given that we saw an expression with the ARCUnbridgedCastTy
4073  /// placeholder type, complain bitterly.
diagnoseARCUnbridgedCast(Expr * e)4074  void Sema::diagnoseARCUnbridgedCast(Expr *e) {
4075    // We expect the spurious ImplicitCastExpr to already have been stripped.
4076    assert(!e->hasPlaceholderType(BuiltinType::ARCUnbridgedCast));
4077    CastExpr *realCast = cast<CastExpr>(e->IgnoreParens());
4078  
4079    SourceRange castRange;
4080    QualType castType;
4081    CheckedConversionKind CCK;
4082  
4083    if (CStyleCastExpr *cast = dyn_cast<CStyleCastExpr>(realCast)) {
4084      castRange = SourceRange(cast->getLParenLoc(), cast->getRParenLoc());
4085      castType = cast->getTypeAsWritten();
4086      CCK = CCK_CStyleCast;
4087    } else if (ExplicitCastExpr *cast = dyn_cast<ExplicitCastExpr>(realCast)) {
4088      castRange = cast->getTypeInfoAsWritten()->getTypeLoc().getSourceRange();
4089      castType = cast->getTypeAsWritten();
4090      CCK = CCK_OtherCast;
4091    } else {
4092      castType = cast->getType();
4093      CCK = CCK_ImplicitConversion;
4094    }
4095  
4096    ARCConversionTypeClass castACTC =
4097      classifyTypeForARCConversion(castType.getNonReferenceType());
4098  
4099    Expr *castExpr = realCast->getSubExpr();
4100    assert(classifyTypeForARCConversion(castExpr->getType()) == ACTC_retainable);
4101  
4102    diagnoseObjCARCConversion(*this, castRange, castType, castACTC,
4103                              castExpr, realCast, ACTC_retainable, CCK);
4104  }
4105  
4106  /// stripARCUnbridgedCast - Given an expression of ARCUnbridgedCast
4107  /// type, remove the placeholder cast.
stripARCUnbridgedCast(Expr * e)4108  Expr *Sema::stripARCUnbridgedCast(Expr *e) {
4109    assert(e->hasPlaceholderType(BuiltinType::ARCUnbridgedCast));
4110  
4111    if (ParenExpr *pe = dyn_cast<ParenExpr>(e)) {
4112      Expr *sub = stripARCUnbridgedCast(pe->getSubExpr());
4113      return new (Context) ParenExpr(pe->getLParen(), pe->getRParen(), sub);
4114    } else if (UnaryOperator *uo = dyn_cast<UnaryOperator>(e)) {
4115      assert(uo->getOpcode() == UO_Extension);
4116      Expr *sub = stripARCUnbridgedCast(uo->getSubExpr());
4117      return new (Context) UnaryOperator(sub, UO_Extension, sub->getType(),
4118                                     sub->getValueKind(), sub->getObjectKind(),
4119                                         uo->getOperatorLoc());
4120    } else if (GenericSelectionExpr *gse = dyn_cast<GenericSelectionExpr>(e)) {
4121      assert(!gse->isResultDependent());
4122  
4123      unsigned n = gse->getNumAssocs();
4124      SmallVector<Expr*, 4> subExprs(n);
4125      SmallVector<TypeSourceInfo*, 4> subTypes(n);
4126      for (unsigned i = 0; i != n; ++i) {
4127        subTypes[i] = gse->getAssocTypeSourceInfo(i);
4128        Expr *sub = gse->getAssocExpr(i);
4129        if (i == gse->getResultIndex())
4130          sub = stripARCUnbridgedCast(sub);
4131        subExprs[i] = sub;
4132      }
4133  
4134      return new (Context) GenericSelectionExpr(Context, gse->getGenericLoc(),
4135                                                gse->getControllingExpr(),
4136                                                subTypes, subExprs,
4137                                                gse->getDefaultLoc(),
4138                                                gse->getRParenLoc(),
4139                                         gse->containsUnexpandedParameterPack(),
4140                                                gse->getResultIndex());
4141    } else {
4142      assert(isa<ImplicitCastExpr>(e) && "bad form of unbridged cast!");
4143      return cast<ImplicitCastExpr>(e)->getSubExpr();
4144    }
4145  }
4146  
CheckObjCARCUnavailableWeakConversion(QualType castType,QualType exprType)4147  bool Sema::CheckObjCARCUnavailableWeakConversion(QualType castType,
4148                                                   QualType exprType) {
4149    QualType canCastType =
4150      Context.getCanonicalType(castType).getUnqualifiedType();
4151    QualType canExprType =
4152      Context.getCanonicalType(exprType).getUnqualifiedType();
4153    if (isa<ObjCObjectPointerType>(canCastType) &&
4154        castType.getObjCLifetime() == Qualifiers::OCL_Weak &&
4155        canExprType->isObjCObjectPointerType()) {
4156      if (const ObjCObjectPointerType *ObjT =
4157          canExprType->getAs<ObjCObjectPointerType>())
4158        if (const ObjCInterfaceDecl *ObjI = ObjT->getInterfaceDecl())
4159          return !ObjI->isArcWeakrefUnavailable();
4160    }
4161    return true;
4162  }
4163  
4164  /// Look for an ObjCReclaimReturnedObject cast and destroy it.
maybeUndoReclaimObject(Expr * e)4165  static Expr *maybeUndoReclaimObject(Expr *e) {
4166    // For now, we just undo operands that are *immediately* reclaim
4167    // expressions, which prevents the vast majority of potential
4168    // problems here.  To catch them all, we'd need to rebuild arbitrary
4169    // value-propagating subexpressions --- we can't reliably rebuild
4170    // in-place because of expression sharing.
4171    if (ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e))
4172      if (ice->getCastKind() == CK_ARCReclaimReturnedObject)
4173        return ice->getSubExpr();
4174  
4175    return e;
4176  }
4177  
BuildObjCBridgedCast(SourceLocation LParenLoc,ObjCBridgeCastKind Kind,SourceLocation BridgeKeywordLoc,TypeSourceInfo * TSInfo,Expr * SubExpr)4178  ExprResult Sema::BuildObjCBridgedCast(SourceLocation LParenLoc,
4179                                        ObjCBridgeCastKind Kind,
4180                                        SourceLocation BridgeKeywordLoc,
4181                                        TypeSourceInfo *TSInfo,
4182                                        Expr *SubExpr) {
4183    ExprResult SubResult = UsualUnaryConversions(SubExpr);
4184    if (SubResult.isInvalid()) return ExprError();
4185    SubExpr = SubResult.get();
4186  
4187    QualType T = TSInfo->getType();
4188    QualType FromType = SubExpr->getType();
4189  
4190    CastKind CK;
4191  
4192    bool MustConsume = false;
4193    if (T->isDependentType() || SubExpr->isTypeDependent()) {
4194      // Okay: we'll build a dependent expression type.
4195      CK = CK_Dependent;
4196    } else if (T->isObjCARCBridgableType() && FromType->isCARCBridgableType()) {
4197      // Casting CF -> id
4198      CK = (T->isBlockPointerType() ? CK_AnyPointerToBlockPointerCast
4199                                    : CK_CPointerToObjCPointerCast);
4200      switch (Kind) {
4201      case OBC_Bridge:
4202        break;
4203  
4204      case OBC_BridgeRetained: {
4205        bool br = isKnownName("CFBridgingRelease");
4206        Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
4207          << 2
4208          << FromType
4209          << (T->isBlockPointerType()? 1 : 0)
4210          << T
4211          << SubExpr->getSourceRange()
4212          << Kind;
4213        Diag(BridgeKeywordLoc, diag::note_arc_bridge)
4214          << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge");
4215        Diag(BridgeKeywordLoc, diag::note_arc_bridge_transfer)
4216          << FromType << br
4217          << FixItHint::CreateReplacement(BridgeKeywordLoc,
4218                                          br ? "CFBridgingRelease "
4219                                             : "__bridge_transfer ");
4220  
4221        Kind = OBC_Bridge;
4222        break;
4223      }
4224  
4225      case OBC_BridgeTransfer:
4226        // We must consume the Objective-C object produced by the cast.
4227        MustConsume = true;
4228        break;
4229      }
4230    } else if (T->isCARCBridgableType() && FromType->isObjCARCBridgableType()) {
4231      // Okay: id -> CF
4232      CK = CK_BitCast;
4233      switch (Kind) {
4234      case OBC_Bridge:
4235        // Reclaiming a value that's going to be __bridge-casted to CF
4236        // is very dangerous, so we don't do it.
4237        SubExpr = maybeUndoReclaimObject(SubExpr);
4238        break;
4239  
4240      case OBC_BridgeRetained:
4241        // Produce the object before casting it.
4242        SubExpr = ImplicitCastExpr::Create(Context, FromType,
4243                                           CK_ARCProduceObject,
4244                                           SubExpr, nullptr, VK_RValue);
4245        break;
4246  
4247      case OBC_BridgeTransfer: {
4248        bool br = isKnownName("CFBridgingRetain");
4249        Diag(BridgeKeywordLoc, diag::err_arc_bridge_cast_wrong_kind)
4250          << (FromType->isBlockPointerType()? 1 : 0)
4251          << FromType
4252          << 2
4253          << T
4254          << SubExpr->getSourceRange()
4255          << Kind;
4256  
4257        Diag(BridgeKeywordLoc, diag::note_arc_bridge)
4258          << FixItHint::CreateReplacement(BridgeKeywordLoc, "__bridge ");
4259        Diag(BridgeKeywordLoc, diag::note_arc_bridge_retained)
4260          << T << br
4261          << FixItHint::CreateReplacement(BridgeKeywordLoc,
4262                            br ? "CFBridgingRetain " : "__bridge_retained");
4263  
4264        Kind = OBC_Bridge;
4265        break;
4266      }
4267      }
4268    } else {
4269      Diag(LParenLoc, diag::err_arc_bridge_cast_incompatible)
4270        << FromType << T << Kind
4271        << SubExpr->getSourceRange()
4272        << TSInfo->getTypeLoc().getSourceRange();
4273      return ExprError();
4274    }
4275  
4276    Expr *Result = new (Context) ObjCBridgedCastExpr(LParenLoc, Kind, CK,
4277                                                     BridgeKeywordLoc,
4278                                                     TSInfo, SubExpr);
4279  
4280    if (MustConsume) {
4281      ExprNeedsCleanups = true;
4282      Result = ImplicitCastExpr::Create(Context, T, CK_ARCConsumeObject, Result,
4283                                        nullptr, VK_RValue);
4284    }
4285  
4286    return Result;
4287  }
4288  
ActOnObjCBridgedCast(Scope * S,SourceLocation LParenLoc,ObjCBridgeCastKind Kind,SourceLocation BridgeKeywordLoc,ParsedType Type,SourceLocation RParenLoc,Expr * SubExpr)4289  ExprResult Sema::ActOnObjCBridgedCast(Scope *S,
4290                                        SourceLocation LParenLoc,
4291                                        ObjCBridgeCastKind Kind,
4292                                        SourceLocation BridgeKeywordLoc,
4293                                        ParsedType Type,
4294                                        SourceLocation RParenLoc,
4295                                        Expr *SubExpr) {
4296    TypeSourceInfo *TSInfo = nullptr;
4297    QualType T = GetTypeFromParser(Type, &TSInfo);
4298    if (Kind == OBC_Bridge)
4299      CheckTollFreeBridgeCast(T, SubExpr);
4300    if (!TSInfo)
4301      TSInfo = Context.getTrivialTypeSourceInfo(T, LParenLoc);
4302    return BuildObjCBridgedCast(LParenLoc, Kind, BridgeKeywordLoc, TSInfo,
4303                                SubExpr);
4304  }
4305