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