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