Home | History | Annotate | Download | only in Sema
      1 //===--- SemaDeclAttr.cpp - Declaration Attribute Handling ----------------===//
      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 decl-related attribute processing.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/Sema/SemaInternal.h"
     15 #include "TargetAttributesSema.h"
     16 #include "clang/AST/ASTContext.h"
     17 #include "clang/AST/CXXInheritance.h"
     18 #include "clang/AST/DeclCXX.h"
     19 #include "clang/AST/DeclObjC.h"
     20 #include "clang/AST/DeclTemplate.h"
     21 #include "clang/AST/Expr.h"
     22 #include "clang/AST/Mangle.h"
     23 #include "clang/Basic/CharInfo.h"
     24 #include "clang/Basic/SourceManager.h"
     25 #include "clang/Basic/TargetInfo.h"
     26 #include "clang/Sema/DeclSpec.h"
     27 #include "clang/Sema/DelayedDiagnostic.h"
     28 #include "clang/Sema/Lookup.h"
     29 #include "clang/Sema/Scope.h"
     30 #include "llvm/ADT/StringExtras.h"
     31 using namespace clang;
     32 using namespace sema;
     33 
     34 /// These constants match the enumerated choices of
     35 /// warn_attribute_wrong_decl_type and err_attribute_wrong_decl_type.
     36 enum AttributeDeclKind {
     37   ExpectedFunction,
     38   ExpectedUnion,
     39   ExpectedVariableOrFunction,
     40   ExpectedFunctionOrMethod,
     41   ExpectedParameter,
     42   ExpectedFunctionMethodOrBlock,
     43   ExpectedFunctionMethodOrClass,
     44   ExpectedFunctionMethodOrParameter,
     45   ExpectedClass,
     46   ExpectedVariable,
     47   ExpectedMethod,
     48   ExpectedVariableFunctionOrLabel,
     49   ExpectedFieldOrGlobalVar,
     50   ExpectedStruct,
     51   ExpectedVariableFunctionOrTag,
     52   ExpectedTLSVar,
     53   ExpectedVariableOrField,
     54   ExpectedVariableFieldOrTag,
     55   ExpectedTypeOrNamespace,
     56   ExpectedObjectiveCInterface
     57 };
     58 
     59 //===----------------------------------------------------------------------===//
     60 //  Helper functions
     61 //===----------------------------------------------------------------------===//
     62 
     63 static const FunctionType *getFunctionType(const Decl *D,
     64                                            bool blocksToo = true) {
     65   QualType Ty;
     66   if (const ValueDecl *decl = dyn_cast<ValueDecl>(D))
     67     Ty = decl->getType();
     68   else if (const FieldDecl *decl = dyn_cast<FieldDecl>(D))
     69     Ty = decl->getType();
     70   else if (const TypedefNameDecl* decl = dyn_cast<TypedefNameDecl>(D))
     71     Ty = decl->getUnderlyingType();
     72   else
     73     return 0;
     74 
     75   if (Ty->isFunctionPointerType())
     76     Ty = Ty->getAs<PointerType>()->getPointeeType();
     77   else if (blocksToo && Ty->isBlockPointerType())
     78     Ty = Ty->getAs<BlockPointerType>()->getPointeeType();
     79 
     80   return Ty->getAs<FunctionType>();
     81 }
     82 
     83 // FIXME: We should provide an abstraction around a method or function
     84 // to provide the following bits of information.
     85 
     86 /// isFunction - Return true if the given decl has function
     87 /// type (function or function-typed variable).
     88 static bool isFunction(const Decl *D) {
     89   return getFunctionType(D, false) != NULL;
     90 }
     91 
     92 /// isFunctionOrMethod - Return true if the given decl has function
     93 /// type (function or function-typed variable) or an Objective-C
     94 /// method.
     95 static bool isFunctionOrMethod(const Decl *D) {
     96   return isFunction(D) || isa<ObjCMethodDecl>(D);
     97 }
     98 
     99 /// isFunctionOrMethodOrBlock - Return true if the given decl has function
    100 /// type (function or function-typed variable) or an Objective-C
    101 /// method or a block.
    102 static bool isFunctionOrMethodOrBlock(const Decl *D) {
    103   if (isFunctionOrMethod(D))
    104     return true;
    105   // check for block is more involved.
    106   if (const VarDecl *V = dyn_cast<VarDecl>(D)) {
    107     QualType Ty = V->getType();
    108     return Ty->isBlockPointerType();
    109   }
    110   return isa<BlockDecl>(D);
    111 }
    112 
    113 /// Return true if the given decl has a declarator that should have
    114 /// been processed by Sema::GetTypeForDeclarator.
    115 static bool hasDeclarator(const Decl *D) {
    116   // In some sense, TypedefDecl really *ought* to be a DeclaratorDecl.
    117   return isa<DeclaratorDecl>(D) || isa<BlockDecl>(D) || isa<TypedefNameDecl>(D) ||
    118          isa<ObjCPropertyDecl>(D);
    119 }
    120 
    121 /// hasFunctionProto - Return true if the given decl has a argument
    122 /// information. This decl should have already passed
    123 /// isFunctionOrMethod or isFunctionOrMethodOrBlock.
    124 static bool hasFunctionProto(const Decl *D) {
    125   if (const FunctionType *FnTy = getFunctionType(D))
    126     return isa<FunctionProtoType>(FnTy);
    127   else {
    128     assert(isa<ObjCMethodDecl>(D) || isa<BlockDecl>(D));
    129     return true;
    130   }
    131 }
    132 
    133 /// getFunctionOrMethodNumArgs - Return number of function or method
    134 /// arguments. It is an error to call this on a K&R function (use
    135 /// hasFunctionProto first).
    136 static unsigned getFunctionOrMethodNumArgs(const Decl *D) {
    137   if (const FunctionType *FnTy = getFunctionType(D))
    138     return cast<FunctionProtoType>(FnTy)->getNumArgs();
    139   if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
    140     return BD->getNumParams();
    141   return cast<ObjCMethodDecl>(D)->param_size();
    142 }
    143 
    144 static QualType getFunctionOrMethodArgType(const Decl *D, unsigned Idx) {
    145   if (const FunctionType *FnTy = getFunctionType(D))
    146     return cast<FunctionProtoType>(FnTy)->getArgType(Idx);
    147   if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
    148     return BD->getParamDecl(Idx)->getType();
    149 
    150   return cast<ObjCMethodDecl>(D)->param_begin()[Idx]->getType();
    151 }
    152 
    153 static QualType getFunctionOrMethodResultType(const Decl *D) {
    154   if (const FunctionType *FnTy = getFunctionType(D))
    155     return cast<FunctionProtoType>(FnTy)->getResultType();
    156   return cast<ObjCMethodDecl>(D)->getResultType();
    157 }
    158 
    159 static bool isFunctionOrMethodVariadic(const Decl *D) {
    160   if (const FunctionType *FnTy = getFunctionType(D)) {
    161     const FunctionProtoType *proto = cast<FunctionProtoType>(FnTy);
    162     return proto->isVariadic();
    163   } else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
    164     return BD->isVariadic();
    165   else {
    166     return cast<ObjCMethodDecl>(D)->isVariadic();
    167   }
    168 }
    169 
    170 static bool isInstanceMethod(const Decl *D) {
    171   if (const CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(D))
    172     return MethodDecl->isInstance();
    173   return false;
    174 }
    175 
    176 static inline bool isNSStringType(QualType T, ASTContext &Ctx) {
    177   const ObjCObjectPointerType *PT = T->getAs<ObjCObjectPointerType>();
    178   if (!PT)
    179     return false;
    180 
    181   ObjCInterfaceDecl *Cls = PT->getObjectType()->getInterface();
    182   if (!Cls)
    183     return false;
    184 
    185   IdentifierInfo* ClsName = Cls->getIdentifier();
    186 
    187   // FIXME: Should we walk the chain of classes?
    188   return ClsName == &Ctx.Idents.get("NSString") ||
    189          ClsName == &Ctx.Idents.get("NSMutableString");
    190 }
    191 
    192 static inline bool isCFStringType(QualType T, ASTContext &Ctx) {
    193   const PointerType *PT = T->getAs<PointerType>();
    194   if (!PT)
    195     return false;
    196 
    197   const RecordType *RT = PT->getPointeeType()->getAs<RecordType>();
    198   if (!RT)
    199     return false;
    200 
    201   const RecordDecl *RD = RT->getDecl();
    202   if (RD->getTagKind() != TTK_Struct)
    203     return false;
    204 
    205   return RD->getIdentifier() == &Ctx.Idents.get("__CFString");
    206 }
    207 
    208 /// \brief Check if the attribute has exactly as many args as Num. May
    209 /// output an error.
    210 static bool checkAttributeNumArgs(Sema &S, const AttributeList &Attr,
    211                                   unsigned int Num) {
    212   if (Attr.getNumArgs() != Num) {
    213     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
    214       << Attr.getName() << Num;
    215     return false;
    216   }
    217 
    218   return true;
    219 }
    220 
    221 
    222 /// \brief Check if the attribute has at least as many args as Num. May
    223 /// output an error.
    224 static bool checkAttributeAtLeastNumArgs(Sema &S, const AttributeList &Attr,
    225                                   unsigned int Num) {
    226   if (Attr.getNumArgs() < Num) {
    227     S.Diag(Attr.getLoc(), diag::err_attribute_too_few_arguments) << Num;
    228     return false;
    229   }
    230 
    231   return true;
    232 }
    233 
    234 /// \brief Check if IdxExpr is a valid argument index for a function or
    235 /// instance method D.  May output an error.
    236 ///
    237 /// \returns true if IdxExpr is a valid index.
    238 static bool checkFunctionOrMethodArgumentIndex(Sema &S, const Decl *D,
    239                                                StringRef AttrName,
    240                                                SourceLocation AttrLoc,
    241                                                unsigned AttrArgNum,
    242                                                const Expr *IdxExpr,
    243                                                uint64_t &Idx)
    244 {
    245   assert(isFunctionOrMethod(D));
    246 
    247   // In C++ the implicit 'this' function parameter also counts.
    248   // Parameters are counted from one.
    249   bool HP = hasFunctionProto(D);
    250   bool HasImplicitThisParam = isInstanceMethod(D);
    251   bool IV = HP && isFunctionOrMethodVariadic(D);
    252   unsigned NumArgs = (HP ? getFunctionOrMethodNumArgs(D) : 0) +
    253                      HasImplicitThisParam;
    254 
    255   llvm::APSInt IdxInt;
    256   if (IdxExpr->isTypeDependent() || IdxExpr->isValueDependent() ||
    257       !IdxExpr->isIntegerConstantExpr(IdxInt, S.Context)) {
    258     std::string Name = std::string("'") + AttrName.str() + std::string("'");
    259     S.Diag(AttrLoc, diag::err_attribute_argument_n_type) << Name.c_str()
    260       << AttrArgNum << AANT_ArgumentIntegerConstant << IdxExpr->getSourceRange();
    261     return false;
    262   }
    263 
    264   Idx = IdxInt.getLimitedValue();
    265   if (Idx < 1 || (!IV && Idx > NumArgs)) {
    266     S.Diag(AttrLoc, diag::err_attribute_argument_out_of_bounds)
    267       << AttrName << AttrArgNum << IdxExpr->getSourceRange();
    268     return false;
    269   }
    270   Idx--; // Convert to zero-based.
    271   if (HasImplicitThisParam) {
    272     if (Idx == 0) {
    273       S.Diag(AttrLoc,
    274              diag::err_attribute_invalid_implicit_this_argument)
    275         << AttrName << IdxExpr->getSourceRange();
    276       return false;
    277     }
    278     --Idx;
    279   }
    280 
    281   return true;
    282 }
    283 
    284 ///
    285 /// \brief Check if passed in Decl is a field or potentially shared global var
    286 /// \return true if the Decl is a field or potentially shared global variable
    287 ///
    288 static bool mayBeSharedVariable(const Decl *D) {
    289   if (isa<FieldDecl>(D))
    290     return true;
    291   if (const VarDecl *vd = dyn_cast<VarDecl>(D))
    292     return vd->hasGlobalStorage() && !vd->getTLSKind();
    293 
    294   return false;
    295 }
    296 
    297 /// \brief Check if the passed-in expression is of type int or bool.
    298 static bool isIntOrBool(Expr *Exp) {
    299   QualType QT = Exp->getType();
    300   return QT->isBooleanType() || QT->isIntegerType();
    301 }
    302 
    303 
    304 // Check to see if the type is a smart pointer of some kind.  We assume
    305 // it's a smart pointer if it defines both operator-> and operator*.
    306 static bool threadSafetyCheckIsSmartPointer(Sema &S, const RecordType* RT) {
    307   DeclContextLookupConstResult Res1 = RT->getDecl()->lookup(
    308     S.Context.DeclarationNames.getCXXOperatorName(OO_Star));
    309   if (Res1.empty())
    310     return false;
    311 
    312   DeclContextLookupConstResult Res2 = RT->getDecl()->lookup(
    313     S.Context.DeclarationNames.getCXXOperatorName(OO_Arrow));
    314   if (Res2.empty())
    315     return false;
    316 
    317   return true;
    318 }
    319 
    320 /// \brief Check if passed in Decl is a pointer type.
    321 /// Note that this function may produce an error message.
    322 /// \return true if the Decl is a pointer type; false otherwise
    323 static bool threadSafetyCheckIsPointer(Sema &S, const Decl *D,
    324                                        const AttributeList &Attr) {
    325   if (const ValueDecl *vd = dyn_cast<ValueDecl>(D)) {
    326     QualType QT = vd->getType();
    327     if (QT->isAnyPointerType())
    328       return true;
    329 
    330     if (const RecordType *RT = QT->getAs<RecordType>()) {
    331       // If it's an incomplete type, it could be a smart pointer; skip it.
    332       // (We don't want to force template instantiation if we can avoid it,
    333       // since that would alter the order in which templates are instantiated.)
    334       if (RT->isIncompleteType())
    335         return true;
    336 
    337       if (threadSafetyCheckIsSmartPointer(S, RT))
    338         return true;
    339     }
    340 
    341     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_decl_not_pointer)
    342       << Attr.getName()->getName() << QT;
    343   } else {
    344     S.Diag(Attr.getLoc(), diag::err_attribute_can_be_applied_only_to_value_decl)
    345       << Attr.getName();
    346   }
    347   return false;
    348 }
    349 
    350 /// \brief Checks that the passed in QualType either is of RecordType or points
    351 /// to RecordType. Returns the relevant RecordType, null if it does not exit.
    352 static const RecordType *getRecordType(QualType QT) {
    353   if (const RecordType *RT = QT->getAs<RecordType>())
    354     return RT;
    355 
    356   // Now check if we point to record type.
    357   if (const PointerType *PT = QT->getAs<PointerType>())
    358     return PT->getPointeeType()->getAs<RecordType>();
    359 
    360   return 0;
    361 }
    362 
    363 
    364 static bool checkBaseClassIsLockableCallback(const CXXBaseSpecifier *Specifier,
    365                                              CXXBasePath &Path, void *Unused) {
    366   const RecordType *RT = Specifier->getType()->getAs<RecordType>();
    367   if (RT->getDecl()->getAttr<LockableAttr>())
    368     return true;
    369   return false;
    370 }
    371 
    372 
    373 /// \brief Thread Safety Analysis: Checks that the passed in RecordType
    374 /// resolves to a lockable object.
    375 static void checkForLockableRecord(Sema &S, Decl *D, const AttributeList &Attr,
    376                                    QualType Ty) {
    377   const RecordType *RT = getRecordType(Ty);
    378 
    379   // Warn if could not get record type for this argument.
    380   if (!RT) {
    381     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_argument_not_class)
    382       << Attr.getName() << Ty.getAsString();
    383     return;
    384   }
    385 
    386   // Don't check for lockable if the class hasn't been defined yet.
    387   if (RT->isIncompleteType())
    388     return;
    389 
    390   // Allow smart pointers to be used as lockable objects.
    391   // FIXME -- Check the type that the smart pointer points to.
    392   if (threadSafetyCheckIsSmartPointer(S, RT))
    393     return;
    394 
    395   // Check if the type is lockable.
    396   RecordDecl *RD = RT->getDecl();
    397   if (RD->getAttr<LockableAttr>())
    398     return;
    399 
    400   // Else check if any base classes are lockable.
    401   if (CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
    402     CXXBasePaths BPaths(false, false);
    403     if (CRD->lookupInBases(checkBaseClassIsLockableCallback, 0, BPaths))
    404       return;
    405   }
    406 
    407   S.Diag(Attr.getLoc(), diag::warn_thread_attribute_argument_not_lockable)
    408     << Attr.getName() << Ty.getAsString();
    409 }
    410 
    411 /// \brief Thread Safety Analysis: Checks that all attribute arguments, starting
    412 /// from Sidx, resolve to a lockable object.
    413 /// \param Sidx The attribute argument index to start checking with.
    414 /// \param ParamIdxOk Whether an argument can be indexing into a function
    415 /// parameter list.
    416 static void checkAttrArgsAreLockableObjs(Sema &S, Decl *D,
    417                                          const AttributeList &Attr,
    418                                          SmallVectorImpl<Expr*> &Args,
    419                                          int Sidx = 0,
    420                                          bool ParamIdxOk = false) {
    421   for(unsigned Idx = Sidx; Idx < Attr.getNumArgs(); ++Idx) {
    422     Expr *ArgExp = Attr.getArg(Idx);
    423 
    424     if (ArgExp->isTypeDependent()) {
    425       // FIXME -- need to check this again on template instantiation
    426       Args.push_back(ArgExp);
    427       continue;
    428     }
    429 
    430     if (StringLiteral *StrLit = dyn_cast<StringLiteral>(ArgExp)) {
    431       if (StrLit->getLength() == 0 ||
    432           StrLit->getString() == StringRef("*")) {
    433         // Pass empty strings to the analyzer without warnings.
    434         // Treat "*" as the universal lock.
    435         Args.push_back(ArgExp);
    436         continue;
    437       }
    438 
    439       // We allow constant strings to be used as a placeholder for expressions
    440       // that are not valid C++ syntax, but warn that they are ignored.
    441       S.Diag(Attr.getLoc(), diag::warn_thread_attribute_ignored) <<
    442         Attr.getName();
    443       Args.push_back(ArgExp);
    444       continue;
    445     }
    446 
    447     QualType ArgTy = ArgExp->getType();
    448 
    449     // A pointer to member expression of the form  &MyClass::mu is treated
    450     // specially -- we need to look at the type of the member.
    451     if (UnaryOperator *UOp = dyn_cast<UnaryOperator>(ArgExp))
    452       if (UOp->getOpcode() == UO_AddrOf)
    453         if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(UOp->getSubExpr()))
    454           if (DRE->getDecl()->isCXXInstanceMember())
    455             ArgTy = DRE->getDecl()->getType();
    456 
    457     // First see if we can just cast to record type, or point to record type.
    458     const RecordType *RT = getRecordType(ArgTy);
    459 
    460     // Now check if we index into a record type function param.
    461     if(!RT && ParamIdxOk) {
    462       FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
    463       IntegerLiteral *IL = dyn_cast<IntegerLiteral>(ArgExp);
    464       if(FD && IL) {
    465         unsigned int NumParams = FD->getNumParams();
    466         llvm::APInt ArgValue = IL->getValue();
    467         uint64_t ParamIdxFromOne = ArgValue.getZExtValue();
    468         uint64_t ParamIdxFromZero = ParamIdxFromOne - 1;
    469         if(!ArgValue.isStrictlyPositive() || ParamIdxFromOne > NumParams) {
    470           S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_range)
    471             << Attr.getName() << Idx + 1 << NumParams;
    472           continue;
    473         }
    474         ArgTy = FD->getParamDecl(ParamIdxFromZero)->getType();
    475       }
    476     }
    477 
    478     checkForLockableRecord(S, D, Attr, ArgTy);
    479 
    480     Args.push_back(ArgExp);
    481   }
    482 }
    483 
    484 //===----------------------------------------------------------------------===//
    485 // Attribute Implementations
    486 //===----------------------------------------------------------------------===//
    487 
    488 // FIXME: All this manual attribute parsing code is gross. At the
    489 // least add some helper functions to check most argument patterns (#
    490 // and types of args).
    491 
    492 enum ThreadAttributeDeclKind {
    493   ThreadExpectedFieldOrGlobalVar,
    494   ThreadExpectedFunctionOrMethod,
    495   ThreadExpectedClassOrStruct
    496 };
    497 
    498 static bool checkGuardedVarAttrCommon(Sema &S, Decl *D,
    499                                       const AttributeList &Attr) {
    500   assert(!Attr.isInvalid());
    501 
    502   if (!checkAttributeNumArgs(S, Attr, 0))
    503     return false;
    504 
    505   // D must be either a member field or global (potentially shared) variable.
    506   if (!mayBeSharedVariable(D)) {
    507     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    508       << Attr.getName() << ThreadExpectedFieldOrGlobalVar;
    509     return false;
    510   }
    511 
    512   return true;
    513 }
    514 
    515 static void handleGuardedVarAttr(Sema &S, Decl *D, const AttributeList &Attr) {
    516   if (!checkGuardedVarAttrCommon(S, D, Attr))
    517     return;
    518 
    519   D->addAttr(::new (S.Context)
    520              GuardedVarAttr(Attr.getRange(), S.Context,
    521                             Attr.getAttributeSpellingListIndex()));
    522 }
    523 
    524 static void handlePtGuardedVarAttr(Sema &S, Decl *D,
    525                                    const AttributeList &Attr) {
    526   if (!checkGuardedVarAttrCommon(S, D, Attr))
    527     return;
    528 
    529   if (!threadSafetyCheckIsPointer(S, D, Attr))
    530     return;
    531 
    532   D->addAttr(::new (S.Context)
    533              PtGuardedVarAttr(Attr.getRange(), S.Context,
    534                               Attr.getAttributeSpellingListIndex()));
    535 }
    536 
    537 static bool checkGuardedByAttrCommon(Sema &S, Decl *D,
    538                                      const AttributeList &Attr,
    539                                      Expr* &Arg) {
    540   assert(!Attr.isInvalid());
    541 
    542   if (!checkAttributeNumArgs(S, Attr, 1))
    543     return false;
    544 
    545   // D must be either a member field or global (potentially shared) variable.
    546   if (!mayBeSharedVariable(D)) {
    547     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    548       << Attr.getName() << ThreadExpectedFieldOrGlobalVar;
    549     return false;
    550   }
    551 
    552   SmallVector<Expr*, 1> Args;
    553   // check that all arguments are lockable objects
    554   checkAttrArgsAreLockableObjs(S, D, Attr, Args);
    555   unsigned Size = Args.size();
    556   if (Size != 1)
    557     return false;
    558 
    559   Arg = Args[0];
    560 
    561   return true;
    562 }
    563 
    564 static void handleGuardedByAttr(Sema &S, Decl *D, const AttributeList &Attr) {
    565   Expr *Arg = 0;
    566   if (!checkGuardedByAttrCommon(S, D, Attr, Arg))
    567     return;
    568 
    569   D->addAttr(::new (S.Context) GuardedByAttr(Attr.getRange(), S.Context, Arg));
    570 }
    571 
    572 static void handlePtGuardedByAttr(Sema &S, Decl *D,
    573                                   const AttributeList &Attr) {
    574   Expr *Arg = 0;
    575   if (!checkGuardedByAttrCommon(S, D, Attr, Arg))
    576     return;
    577 
    578   if (!threadSafetyCheckIsPointer(S, D, Attr))
    579     return;
    580 
    581   D->addAttr(::new (S.Context) PtGuardedByAttr(Attr.getRange(),
    582                                                S.Context, Arg));
    583 }
    584 
    585 static bool checkLockableAttrCommon(Sema &S, Decl *D,
    586                                     const AttributeList &Attr) {
    587   assert(!Attr.isInvalid());
    588 
    589   if (!checkAttributeNumArgs(S, Attr, 0))
    590     return false;
    591 
    592   // FIXME: Lockable structs for C code.
    593   if (!isa<RecordDecl>(D)) {
    594     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    595       << Attr.getName() << ThreadExpectedClassOrStruct;
    596     return false;
    597   }
    598 
    599   return true;
    600 }
    601 
    602 static void handleLockableAttr(Sema &S, Decl *D, const AttributeList &Attr) {
    603   if (!checkLockableAttrCommon(S, D, Attr))
    604     return;
    605 
    606   D->addAttr(::new (S.Context) LockableAttr(Attr.getRange(), S.Context));
    607 }
    608 
    609 static void handleScopedLockableAttr(Sema &S, Decl *D,
    610                              const AttributeList &Attr) {
    611   if (!checkLockableAttrCommon(S, D, Attr))
    612     return;
    613 
    614   D->addAttr(::new (S.Context)
    615              ScopedLockableAttr(Attr.getRange(), S.Context,
    616                                 Attr.getAttributeSpellingListIndex()));
    617 }
    618 
    619 static void handleNoThreadSafetyAnalysis(Sema &S, Decl *D,
    620                                          const AttributeList &Attr) {
    621   assert(!Attr.isInvalid());
    622 
    623   if (!checkAttributeNumArgs(S, Attr, 0))
    624     return;
    625 
    626   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    627     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    628       << Attr.getName() << ThreadExpectedFunctionOrMethod;
    629     return;
    630   }
    631 
    632   D->addAttr(::new (S.Context) NoThreadSafetyAnalysisAttr(Attr.getRange(),
    633                                                           S.Context));
    634 }
    635 
    636 static void handleNoSanitizeAddressAttr(Sema &S, Decl *D,
    637                                       const AttributeList &Attr) {
    638   assert(!Attr.isInvalid());
    639 
    640   if (!checkAttributeNumArgs(S, Attr, 0))
    641     return;
    642 
    643   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    644     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
    645       << Attr.getName() << ExpectedFunctionOrMethod;
    646     return;
    647   }
    648 
    649   D->addAttr(::new (S.Context)
    650              NoSanitizeAddressAttr(Attr.getRange(), S.Context,
    651                                    Attr.getAttributeSpellingListIndex()));
    652 }
    653 
    654 static void handleNoSanitizeMemory(Sema &S, Decl *D,
    655                                    const AttributeList &Attr) {
    656   assert(!Attr.isInvalid());
    657 
    658   if (!checkAttributeNumArgs(S, Attr, 0))
    659     return;
    660 
    661   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    662     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
    663       << Attr.getName() << ExpectedFunctionOrMethod;
    664     return;
    665   }
    666 
    667   D->addAttr(::new (S.Context) NoSanitizeMemoryAttr(Attr.getRange(),
    668                                                          S.Context));
    669 }
    670 
    671 static void handleNoSanitizeThread(Sema &S, Decl *D,
    672                                    const AttributeList &Attr) {
    673   assert(!Attr.isInvalid());
    674 
    675   if (!checkAttributeNumArgs(S, Attr, 0))
    676     return;
    677 
    678   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    679     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
    680       << Attr.getName() << ExpectedFunctionOrMethod;
    681     return;
    682   }
    683 
    684   D->addAttr(::new (S.Context) NoSanitizeThreadAttr(Attr.getRange(),
    685                                                     S.Context));
    686 }
    687 
    688 static bool checkAcquireOrderAttrCommon(Sema &S, Decl *D,
    689                                         const AttributeList &Attr,
    690                                         SmallVectorImpl<Expr *> &Args) {
    691   assert(!Attr.isInvalid());
    692 
    693   if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
    694     return false;
    695 
    696   // D must be either a member field or global (potentially shared) variable.
    697   ValueDecl *VD = dyn_cast<ValueDecl>(D);
    698   if (!VD || !mayBeSharedVariable(D)) {
    699     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    700       << Attr.getName() << ThreadExpectedFieldOrGlobalVar;
    701     return false;
    702   }
    703 
    704   // Check that this attribute only applies to lockable types.
    705   QualType QT = VD->getType();
    706   if (!QT->isDependentType()) {
    707     const RecordType *RT = getRecordType(QT);
    708     if (!RT || !RT->getDecl()->getAttr<LockableAttr>()) {
    709       S.Diag(Attr.getLoc(), diag::warn_thread_attribute_decl_not_lockable)
    710         << Attr.getName();
    711       return false;
    712     }
    713   }
    714 
    715   // Check that all arguments are lockable objects.
    716   checkAttrArgsAreLockableObjs(S, D, Attr, Args);
    717   if (Args.empty())
    718     return false;
    719 
    720   return true;
    721 }
    722 
    723 static void handleAcquiredAfterAttr(Sema &S, Decl *D,
    724                                     const AttributeList &Attr) {
    725   SmallVector<Expr*, 1> Args;
    726   if (!checkAcquireOrderAttrCommon(S, D, Attr, Args))
    727     return;
    728 
    729   Expr **StartArg = &Args[0];
    730   D->addAttr(::new (S.Context)
    731              AcquiredAfterAttr(Attr.getRange(), S.Context,
    732                                StartArg, Args.size(),
    733                                Attr.getAttributeSpellingListIndex()));
    734 }
    735 
    736 static void handleAcquiredBeforeAttr(Sema &S, Decl *D,
    737                                      const AttributeList &Attr) {
    738   SmallVector<Expr*, 1> Args;
    739   if (!checkAcquireOrderAttrCommon(S, D, Attr, Args))
    740     return;
    741 
    742   Expr **StartArg = &Args[0];
    743   D->addAttr(::new (S.Context)
    744              AcquiredBeforeAttr(Attr.getRange(), S.Context,
    745                                 StartArg, Args.size(),
    746                                 Attr.getAttributeSpellingListIndex()));
    747 }
    748 
    749 static bool checkLockFunAttrCommon(Sema &S, Decl *D,
    750                                    const AttributeList &Attr,
    751                                    SmallVectorImpl<Expr *> &Args) {
    752   assert(!Attr.isInvalid());
    753 
    754   // zero or more arguments ok
    755 
    756   // check that the attribute is applied to a function
    757   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    758     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    759       << Attr.getName() << ThreadExpectedFunctionOrMethod;
    760     return false;
    761   }
    762 
    763   // check that all arguments are lockable objects
    764   checkAttrArgsAreLockableObjs(S, D, Attr, Args, 0, /*ParamIdxOk=*/true);
    765 
    766   return true;
    767 }
    768 
    769 static void handleSharedLockFunctionAttr(Sema &S, Decl *D,
    770                                          const AttributeList &Attr) {
    771   SmallVector<Expr*, 1> Args;
    772   if (!checkLockFunAttrCommon(S, D, Attr, Args))
    773     return;
    774 
    775   unsigned Size = Args.size();
    776   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    777   D->addAttr(::new (S.Context)
    778              SharedLockFunctionAttr(Attr.getRange(), S.Context, StartArg, Size,
    779                                     Attr.getAttributeSpellingListIndex()));
    780 }
    781 
    782 static void handleExclusiveLockFunctionAttr(Sema &S, Decl *D,
    783                                             const AttributeList &Attr) {
    784   SmallVector<Expr*, 1> Args;
    785   if (!checkLockFunAttrCommon(S, D, Attr, Args))
    786     return;
    787 
    788   unsigned Size = Args.size();
    789   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    790   D->addAttr(::new (S.Context)
    791              ExclusiveLockFunctionAttr(Attr.getRange(), S.Context,
    792                                        StartArg, Size,
    793                                        Attr.getAttributeSpellingListIndex()));
    794 }
    795 
    796 static void handleAssertSharedLockAttr(Sema &S, Decl *D,
    797                                        const AttributeList &Attr) {
    798   SmallVector<Expr*, 1> Args;
    799   if (!checkLockFunAttrCommon(S, D, Attr, Args))
    800     return;
    801 
    802   unsigned Size = Args.size();
    803   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    804   D->addAttr(::new (S.Context)
    805              AssertSharedLockAttr(Attr.getRange(), S.Context, StartArg, Size,
    806                                   Attr.getAttributeSpellingListIndex()));
    807 }
    808 
    809 static void handleAssertExclusiveLockAttr(Sema &S, Decl *D,
    810                                           const AttributeList &Attr) {
    811   SmallVector<Expr*, 1> Args;
    812   if (!checkLockFunAttrCommon(S, D, Attr, Args))
    813     return;
    814 
    815   unsigned Size = Args.size();
    816   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    817   D->addAttr(::new (S.Context)
    818              AssertExclusiveLockAttr(Attr.getRange(), S.Context,
    819                                      StartArg, Size,
    820                                      Attr.getAttributeSpellingListIndex()));
    821 }
    822 
    823 
    824 static bool checkTryLockFunAttrCommon(Sema &S, Decl *D,
    825                                       const AttributeList &Attr,
    826                                       SmallVectorImpl<Expr *> &Args) {
    827   assert(!Attr.isInvalid());
    828 
    829   if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
    830     return false;
    831 
    832   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    833     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    834       << Attr.getName() << ThreadExpectedFunctionOrMethod;
    835     return false;
    836   }
    837 
    838   if (!isIntOrBool(Attr.getArg(0))) {
    839     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
    840       << Attr.getName() << 1 << AANT_ArgumentIntOrBool;
    841     return false;
    842   }
    843 
    844   // check that all arguments are lockable objects
    845   checkAttrArgsAreLockableObjs(S, D, Attr, Args, 1);
    846 
    847   return true;
    848 }
    849 
    850 static void handleSharedTrylockFunctionAttr(Sema &S, Decl *D,
    851                                             const AttributeList &Attr) {
    852   SmallVector<Expr*, 2> Args;
    853   if (!checkTryLockFunAttrCommon(S, D, Attr, Args))
    854     return;
    855 
    856   unsigned Size = Args.size();
    857   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    858   D->addAttr(::new (S.Context)
    859              SharedTrylockFunctionAttr(Attr.getRange(), S.Context,
    860                                        Attr.getArg(0), StartArg, Size,
    861                                        Attr.getAttributeSpellingListIndex()));
    862 }
    863 
    864 static void handleExclusiveTrylockFunctionAttr(Sema &S, Decl *D,
    865                                                const AttributeList &Attr) {
    866   SmallVector<Expr*, 2> Args;
    867   if (!checkTryLockFunAttrCommon(S, D, Attr, Args))
    868     return;
    869 
    870   unsigned Size = Args.size();
    871   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    872   D->addAttr(::new (S.Context)
    873              ExclusiveTrylockFunctionAttr(Attr.getRange(), S.Context,
    874                                           Attr.getArg(0), StartArg, Size,
    875                                           Attr.getAttributeSpellingListIndex()));
    876 }
    877 
    878 static bool checkLocksRequiredCommon(Sema &S, Decl *D,
    879                                      const AttributeList &Attr,
    880                                      SmallVectorImpl<Expr *> &Args) {
    881   assert(!Attr.isInvalid());
    882 
    883   if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
    884     return false;
    885 
    886   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    887     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    888       << Attr.getName() << ThreadExpectedFunctionOrMethod;
    889     return false;
    890   }
    891 
    892   // check that all arguments are lockable objects
    893   checkAttrArgsAreLockableObjs(S, D, Attr, Args);
    894   if (Args.empty())
    895     return false;
    896 
    897   return true;
    898 }
    899 
    900 static void handleExclusiveLocksRequiredAttr(Sema &S, Decl *D,
    901                                              const AttributeList &Attr) {
    902   SmallVector<Expr*, 1> Args;
    903   if (!checkLocksRequiredCommon(S, D, Attr, Args))
    904     return;
    905 
    906   Expr **StartArg = &Args[0];
    907   D->addAttr(::new (S.Context)
    908              ExclusiveLocksRequiredAttr(Attr.getRange(), S.Context,
    909                                         StartArg, Args.size(),
    910                                         Attr.getAttributeSpellingListIndex()));
    911 }
    912 
    913 static void handleSharedLocksRequiredAttr(Sema &S, Decl *D,
    914                                           const AttributeList &Attr) {
    915   SmallVector<Expr*, 1> Args;
    916   if (!checkLocksRequiredCommon(S, D, Attr, Args))
    917     return;
    918 
    919   Expr **StartArg = &Args[0];
    920   D->addAttr(::new (S.Context)
    921              SharedLocksRequiredAttr(Attr.getRange(), S.Context,
    922                                      StartArg, Args.size(),
    923                                      Attr.getAttributeSpellingListIndex()));
    924 }
    925 
    926 static void handleUnlockFunAttr(Sema &S, Decl *D,
    927                                 const AttributeList &Attr) {
    928   assert(!Attr.isInvalid());
    929 
    930   // zero or more arguments ok
    931 
    932   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    933     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    934       << Attr.getName() << ThreadExpectedFunctionOrMethod;
    935     return;
    936   }
    937 
    938   // check that all arguments are lockable objects
    939   SmallVector<Expr*, 1> Args;
    940   checkAttrArgsAreLockableObjs(S, D, Attr, Args, 0, /*ParamIdxOk=*/true);
    941   unsigned Size = Args.size();
    942   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    943 
    944   D->addAttr(::new (S.Context)
    945              UnlockFunctionAttr(Attr.getRange(), S.Context, StartArg, Size,
    946                                 Attr.getAttributeSpellingListIndex()));
    947 }
    948 
    949 static void handleLockReturnedAttr(Sema &S, Decl *D,
    950                                    const AttributeList &Attr) {
    951   assert(!Attr.isInvalid());
    952 
    953   if (!checkAttributeNumArgs(S, Attr, 1))
    954     return;
    955 
    956   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    957     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    958       << Attr.getName() << ThreadExpectedFunctionOrMethod;
    959     return;
    960   }
    961 
    962   // check that the argument is lockable object
    963   SmallVector<Expr*, 1> Args;
    964   checkAttrArgsAreLockableObjs(S, D, Attr, Args);
    965   unsigned Size = Args.size();
    966   if (Size == 0)
    967     return;
    968 
    969   D->addAttr(::new (S.Context)
    970              LockReturnedAttr(Attr.getRange(), S.Context, Args[0],
    971                               Attr.getAttributeSpellingListIndex()));
    972 }
    973 
    974 static void handleLocksExcludedAttr(Sema &S, Decl *D,
    975                                     const AttributeList &Attr) {
    976   assert(!Attr.isInvalid());
    977 
    978   if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
    979     return;
    980 
    981   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    982     S.Diag(Attr.getLoc(), diag::warn_thread_attribute_wrong_decl_type)
    983       << Attr.getName() << ThreadExpectedFunctionOrMethod;
    984     return;
    985   }
    986 
    987   // check that all arguments are lockable objects
    988   SmallVector<Expr*, 1> Args;
    989   checkAttrArgsAreLockableObjs(S, D, Attr, Args);
    990   unsigned Size = Args.size();
    991   if (Size == 0)
    992     return;
    993   Expr **StartArg = &Args[0];
    994 
    995   D->addAttr(::new (S.Context)
    996              LocksExcludedAttr(Attr.getRange(), S.Context, StartArg, Size,
    997                                Attr.getAttributeSpellingListIndex()));
    998 }
    999 
   1000 
   1001 static void handleExtVectorTypeAttr(Sema &S, Scope *scope, Decl *D,
   1002                                     const AttributeList &Attr) {
   1003   TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D);
   1004   if (TD == 0) {
   1005     // __attribute__((ext_vector_type(N))) can only be applied to typedefs
   1006     // and type-ids.
   1007     S.Diag(Attr.getLoc(), diag::err_typecheck_ext_vector_not_typedef);
   1008     return;
   1009   }
   1010 
   1011   // Remember this typedef decl, we will need it later for diagnostics.
   1012   S.ExtVectorDecls.push_back(TD);
   1013 }
   1014 
   1015 static void handlePackedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1016   // check the attribute arguments.
   1017   if (!checkAttributeNumArgs(S, Attr, 0))
   1018     return;
   1019 
   1020   if (TagDecl *TD = dyn_cast<TagDecl>(D))
   1021     TD->addAttr(::new (S.Context) PackedAttr(Attr.getRange(), S.Context));
   1022   else if (FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
   1023     // If the alignment is less than or equal to 8 bits, the packed attribute
   1024     // has no effect.
   1025     if (!FD->getType()->isDependentType() &&
   1026         !FD->getType()->isIncompleteType() &&
   1027         S.Context.getTypeAlign(FD->getType()) <= 8)
   1028       S.Diag(Attr.getLoc(), diag::warn_attribute_ignored_for_field_of_type)
   1029         << Attr.getName() << FD->getType();
   1030     else
   1031       FD->addAttr(::new (S.Context)
   1032                   PackedAttr(Attr.getRange(), S.Context,
   1033                              Attr.getAttributeSpellingListIndex()));
   1034   } else
   1035     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
   1036 }
   1037 
   1038 static void handleMsStructAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1039   if (RecordDecl *RD = dyn_cast<RecordDecl>(D))
   1040     RD->addAttr(::new (S.Context)
   1041                 MsStructAttr(Attr.getRange(), S.Context,
   1042                              Attr.getAttributeSpellingListIndex()));
   1043   else
   1044     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
   1045 }
   1046 
   1047 static void handleIBAction(Sema &S, Decl *D, const AttributeList &Attr) {
   1048   // check the attribute arguments.
   1049   if (!checkAttributeNumArgs(S, Attr, 0))
   1050     return;
   1051 
   1052   // The IBAction attributes only apply to instance methods.
   1053   if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
   1054     if (MD->isInstanceMethod()) {
   1055       D->addAttr(::new (S.Context)
   1056                  IBActionAttr(Attr.getRange(), S.Context,
   1057                               Attr.getAttributeSpellingListIndex()));
   1058       return;
   1059     }
   1060 
   1061   S.Diag(Attr.getLoc(), diag::warn_attribute_ibaction) << Attr.getName();
   1062 }
   1063 
   1064 static bool checkIBOutletCommon(Sema &S, Decl *D, const AttributeList &Attr) {
   1065   // The IBOutlet/IBOutletCollection attributes only apply to instance
   1066   // variables or properties of Objective-C classes.  The outlet must also
   1067   // have an object reference type.
   1068   if (const ObjCIvarDecl *VD = dyn_cast<ObjCIvarDecl>(D)) {
   1069     if (!VD->getType()->getAs<ObjCObjectPointerType>()) {
   1070       S.Diag(Attr.getLoc(), diag::warn_iboutlet_object_type)
   1071         << Attr.getName() << VD->getType() << 0;
   1072       return false;
   1073     }
   1074   }
   1075   else if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D)) {
   1076     if (!PD->getType()->getAs<ObjCObjectPointerType>()) {
   1077       S.Diag(Attr.getLoc(), diag::warn_iboutlet_object_type)
   1078         << Attr.getName() << PD->getType() << 1;
   1079       return false;
   1080     }
   1081   }
   1082   else {
   1083     S.Diag(Attr.getLoc(), diag::warn_attribute_iboutlet) << Attr.getName();
   1084     return false;
   1085   }
   1086 
   1087   return true;
   1088 }
   1089 
   1090 static void handleIBOutlet(Sema &S, Decl *D, const AttributeList &Attr) {
   1091   // check the attribute arguments.
   1092   if (!checkAttributeNumArgs(S, Attr, 0))
   1093     return;
   1094 
   1095   if (!checkIBOutletCommon(S, D, Attr))
   1096     return;
   1097 
   1098   D->addAttr(::new (S.Context)
   1099              IBOutletAttr(Attr.getRange(), S.Context,
   1100                           Attr.getAttributeSpellingListIndex()));
   1101 }
   1102 
   1103 static void handleIBOutletCollection(Sema &S, Decl *D,
   1104                                      const AttributeList &Attr) {
   1105 
   1106   // The iboutletcollection attribute can have zero or one arguments.
   1107   if (Attr.getParameterName() && Attr.getNumArgs() > 0) {
   1108     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   1109       << Attr.getName() << 1;
   1110     return;
   1111   }
   1112 
   1113   if (!checkIBOutletCommon(S, D, Attr))
   1114     return;
   1115 
   1116   IdentifierInfo *II = Attr.getParameterName();
   1117   if (!II)
   1118     II = &S.Context.Idents.get("NSObject");
   1119 
   1120   ParsedType TypeRep = S.getTypeName(*II, Attr.getLoc(),
   1121                         S.getScopeForContext(D->getDeclContext()->getParent()));
   1122   if (!TypeRep) {
   1123     S.Diag(Attr.getLoc(), diag::err_iboutletcollection_type) << II;
   1124     return;
   1125   }
   1126   QualType QT = TypeRep.get();
   1127   // Diagnose use of non-object type in iboutletcollection attribute.
   1128   // FIXME. Gnu attribute extension ignores use of builtin types in
   1129   // attributes. So, __attribute__((iboutletcollection(char))) will be
   1130   // treated as __attribute__((iboutletcollection())).
   1131   if (!QT->isObjCIdType() && !QT->isObjCObjectType()) {
   1132     S.Diag(Attr.getLoc(), diag::err_iboutletcollection_type) << II;
   1133     return;
   1134   }
   1135   D->addAttr(::new (S.Context)
   1136              IBOutletCollectionAttr(Attr.getRange(),S.Context,
   1137                                     QT, Attr.getParameterLoc(),
   1138                                     Attr.getAttributeSpellingListIndex()));
   1139 }
   1140 
   1141 static void possibleTransparentUnionPointerType(QualType &T) {
   1142   if (const RecordType *UT = T->getAsUnionType())
   1143     if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>()) {
   1144       RecordDecl *UD = UT->getDecl();
   1145       for (RecordDecl::field_iterator it = UD->field_begin(),
   1146            itend = UD->field_end(); it != itend; ++it) {
   1147         QualType QT = it->getType();
   1148         if (QT->isAnyPointerType() || QT->isBlockPointerType()) {
   1149           T = QT;
   1150           return;
   1151         }
   1152       }
   1153     }
   1154 }
   1155 
   1156 static void handleAllocSizeAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1157   if (!isFunctionOrMethod(D)) {
   1158     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1159     << Attr.getName() << ExpectedFunctionOrMethod;
   1160     return;
   1161   }
   1162 
   1163   if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
   1164     return;
   1165 
   1166   SmallVector<unsigned, 8> SizeArgs;
   1167   for (unsigned i = 0; i < Attr.getNumArgs(); ++i) {
   1168     Expr *Ex = Attr.getArg(i);
   1169     uint64_t Idx;
   1170     if (!checkFunctionOrMethodArgumentIndex(S, D, Attr.getName()->getName(),
   1171                                             Attr.getLoc(), i + 1, Ex, Idx))
   1172       return;
   1173 
   1174     // check if the function argument is of an integer type
   1175     QualType T = getFunctionOrMethodArgType(D, Idx).getNonReferenceType();
   1176     if (!T->isIntegerType()) {
   1177       S.Diag(Attr.getLoc(), diag::err_attribute_argument_type)
   1178         << Attr.getName() << AANT_ArgumentIntegerConstant
   1179         << Ex->getSourceRange();
   1180       return;
   1181     }
   1182     SizeArgs.push_back(Idx);
   1183   }
   1184 
   1185   // check if the function returns a pointer
   1186   if (!getFunctionType(D)->getResultType()->isAnyPointerType()) {
   1187     S.Diag(Attr.getLoc(), diag::warn_ns_attribute_wrong_return_type)
   1188     << Attr.getName() << 0 /*function*/<< 1 /*pointer*/ << D->getSourceRange();
   1189   }
   1190 
   1191   D->addAttr(::new (S.Context)
   1192              AllocSizeAttr(Attr.getRange(), S.Context,
   1193                            SizeArgs.data(), SizeArgs.size(),
   1194                            Attr.getAttributeSpellingListIndex()));
   1195 }
   1196 
   1197 static void handleNonNullAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1198   // GCC ignores the nonnull attribute on K&R style function prototypes, so we
   1199   // ignore it as well
   1200   if (!isFunctionOrMethod(D) || !hasFunctionProto(D)) {
   1201     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1202       << Attr.getName() << ExpectedFunction;
   1203     return;
   1204   }
   1205 
   1206   SmallVector<unsigned, 8> NonNullArgs;
   1207   for (unsigned i = 0; i < Attr.getNumArgs(); ++i) {
   1208     Expr *Ex = Attr.getArg(i);
   1209     uint64_t Idx;
   1210     if (!checkFunctionOrMethodArgumentIndex(S, D, Attr.getName()->getName(),
   1211                                             Attr.getLoc(), i + 1, Ex, Idx))
   1212       return;
   1213 
   1214     // Is the function argument a pointer type?
   1215     QualType T = getFunctionOrMethodArgType(D, Idx).getNonReferenceType();
   1216     possibleTransparentUnionPointerType(T);
   1217 
   1218     if (!T->isAnyPointerType() && !T->isBlockPointerType()) {
   1219       // FIXME: Should also highlight argument in decl.
   1220       S.Diag(Attr.getLoc(), diag::warn_nonnull_pointers_only)
   1221         << "nonnull" << Ex->getSourceRange();
   1222       continue;
   1223     }
   1224 
   1225     NonNullArgs.push_back(Idx);
   1226   }
   1227 
   1228   // If no arguments were specified to __attribute__((nonnull)) then all pointer
   1229   // arguments have a nonnull attribute.
   1230   if (NonNullArgs.empty()) {
   1231     for (unsigned i = 0, e = getFunctionOrMethodNumArgs(D); i != e; ++i) {
   1232       QualType T = getFunctionOrMethodArgType(D, i).getNonReferenceType();
   1233       possibleTransparentUnionPointerType(T);
   1234       if (T->isAnyPointerType() || T->isBlockPointerType())
   1235         NonNullArgs.push_back(i);
   1236     }
   1237 
   1238     // No pointer arguments?
   1239     if (NonNullArgs.empty()) {
   1240       // Warn the trivial case only if attribute is not coming from a
   1241       // macro instantiation.
   1242       if (Attr.getLoc().isFileID())
   1243         S.Diag(Attr.getLoc(), diag::warn_attribute_nonnull_no_pointers);
   1244       return;
   1245     }
   1246   }
   1247 
   1248   unsigned *start = &NonNullArgs[0];
   1249   unsigned size = NonNullArgs.size();
   1250   llvm::array_pod_sort(start, start + size);
   1251   D->addAttr(::new (S.Context)
   1252              NonNullAttr(Attr.getRange(), S.Context, start, size,
   1253                          Attr.getAttributeSpellingListIndex()));
   1254 }
   1255 
   1256 static void handleOwnershipAttr(Sema &S, Decl *D, const AttributeList &AL) {
   1257   // This attribute must be applied to a function declaration.
   1258   // The first argument to the attribute must be a string,
   1259   // the name of the resource, for example "malloc".
   1260   // The following arguments must be argument indexes, the arguments must be
   1261   // of integer type for Returns, otherwise of pointer type.
   1262   // The difference between Holds and Takes is that a pointer may still be used
   1263   // after being held.  free() should be __attribute((ownership_takes)), whereas
   1264   // a list append function may well be __attribute((ownership_holds)).
   1265 
   1266   if (!AL.getParameterName()) {
   1267     S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type)
   1268       << AL.getName()->getName() << 1 << AANT_ArgumentString;
   1269     return;
   1270   }
   1271   // Figure out our Kind, and check arguments while we're at it.
   1272   OwnershipAttr::OwnershipKind K;
   1273   switch (AL.getKind()) {
   1274   case AttributeList::AT_ownership_takes:
   1275     K = OwnershipAttr::Takes;
   1276     if (AL.getNumArgs() < 1) {
   1277       S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments)
   1278         << AL.getName() << 2;
   1279       return;
   1280     }
   1281     break;
   1282   case AttributeList::AT_ownership_holds:
   1283     K = OwnershipAttr::Holds;
   1284     if (AL.getNumArgs() < 1) {
   1285       S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments)
   1286         << AL.getName() << 2;
   1287       return;
   1288     }
   1289     break;
   1290   case AttributeList::AT_ownership_returns:
   1291     K = OwnershipAttr::Returns;
   1292     if (AL.getNumArgs() > 1) {
   1293       S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments)
   1294         << AL.getName() << AL.getNumArgs() + 1;
   1295       return;
   1296     }
   1297     break;
   1298   default:
   1299     // This should never happen given how we are called.
   1300     llvm_unreachable("Unknown ownership attribute");
   1301   }
   1302 
   1303   if (!isFunction(D) || !hasFunctionProto(D)) {
   1304     S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
   1305       << AL.getName() << ExpectedFunction;
   1306     return;
   1307   }
   1308 
   1309   StringRef Module = AL.getParameterName()->getName();
   1310 
   1311   // Normalize the argument, __foo__ becomes foo.
   1312   if (Module.startswith("__") && Module.endswith("__"))
   1313     Module = Module.substr(2, Module.size() - 4);
   1314 
   1315 
   1316   SmallVector<unsigned, 8> OwnershipArgs;
   1317   for (unsigned i = 0; i < AL.getNumArgs(); ++i) {
   1318     Expr *Ex = AL.getArg(i);
   1319     uint64_t Idx;
   1320     if (!checkFunctionOrMethodArgumentIndex(S, D, AL.getName()->getName(),
   1321                                             AL.getLoc(), i + 1, Ex, Idx))
   1322       return;
   1323 
   1324     switch (K) {
   1325     case OwnershipAttr::Takes:
   1326     case OwnershipAttr::Holds: {
   1327       // Is the function argument a pointer type?
   1328       QualType T = getFunctionOrMethodArgType(D, Idx);
   1329       if (!T->isAnyPointerType() && !T->isBlockPointerType()) {
   1330         // FIXME: Should also highlight argument in decl.
   1331         S.Diag(AL.getLoc(), diag::err_ownership_type)
   1332             << ((K==OwnershipAttr::Takes)?"ownership_takes":"ownership_holds")
   1333             << "pointer"
   1334             << Ex->getSourceRange();
   1335         continue;
   1336       }
   1337       break;
   1338     }
   1339     case OwnershipAttr::Returns: {
   1340       if (AL.getNumArgs() > 1) {
   1341           // Is the function argument an integer type?
   1342           Expr *IdxExpr = AL.getArg(0);
   1343           llvm::APSInt ArgNum(32);
   1344           if (IdxExpr->isTypeDependent() || IdxExpr->isValueDependent()
   1345               || !IdxExpr->isIntegerConstantExpr(ArgNum, S.Context)) {
   1346             S.Diag(AL.getLoc(), diag::err_ownership_type)
   1347                 << "ownership_returns" << "integer"
   1348                 << IdxExpr->getSourceRange();
   1349             return;
   1350           }
   1351       }
   1352       break;
   1353     }
   1354     } // switch
   1355 
   1356     // Check we don't have a conflict with another ownership attribute.
   1357     for (specific_attr_iterator<OwnershipAttr>
   1358           i = D->specific_attr_begin<OwnershipAttr>(),
   1359           e = D->specific_attr_end<OwnershipAttr>();
   1360         i != e; ++i) {
   1361       if ((*i)->getOwnKind() != K) {
   1362         for (const unsigned *I = (*i)->args_begin(), *E = (*i)->args_end();
   1363              I!=E; ++I) {
   1364           if (Idx == *I) {
   1365             S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible)
   1366                 << AL.getName()->getName() << "ownership_*";
   1367           }
   1368         }
   1369       }
   1370     }
   1371     OwnershipArgs.push_back(Idx);
   1372   }
   1373 
   1374   unsigned* start = OwnershipArgs.data();
   1375   unsigned size = OwnershipArgs.size();
   1376   llvm::array_pod_sort(start, start + size);
   1377 
   1378   if (K != OwnershipAttr::Returns && OwnershipArgs.empty()) {
   1379     S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments)
   1380       << AL.getName() << 2;
   1381     return;
   1382   }
   1383 
   1384   D->addAttr(::new (S.Context)
   1385              OwnershipAttr(AL.getLoc(), S.Context, K, Module, start, size,
   1386                            AL.getAttributeSpellingListIndex()));
   1387 }
   1388 
   1389 static void handleWeakRefAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1390   // Check the attribute arguments.
   1391   if (Attr.getNumArgs() > 1) {
   1392     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   1393       << Attr.getName() << 1;
   1394     return;
   1395   }
   1396 
   1397   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) {
   1398     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1399       << Attr.getName() << ExpectedVariableOrFunction;
   1400     return;
   1401   }
   1402 
   1403   NamedDecl *nd = cast<NamedDecl>(D);
   1404 
   1405   // gcc rejects
   1406   // class c {
   1407   //   static int a __attribute__((weakref ("v2")));
   1408   //   static int b() __attribute__((weakref ("f3")));
   1409   // };
   1410   // and ignores the attributes of
   1411   // void f(void) {
   1412   //   static int a __attribute__((weakref ("v2")));
   1413   // }
   1414   // we reject them
   1415   const DeclContext *Ctx = D->getDeclContext()->getRedeclContext();
   1416   if (!Ctx->isFileContext()) {
   1417     S.Diag(Attr.getLoc(), diag::err_attribute_weakref_not_global_context) <<
   1418         nd->getNameAsString();
   1419     return;
   1420   }
   1421 
   1422   // The GCC manual says
   1423   //
   1424   // At present, a declaration to which `weakref' is attached can only
   1425   // be `static'.
   1426   //
   1427   // It also says
   1428   //
   1429   // Without a TARGET,
   1430   // given as an argument to `weakref' or to `alias', `weakref' is
   1431   // equivalent to `weak'.
   1432   //
   1433   // gcc 4.4.1 will accept
   1434   // int a7 __attribute__((weakref));
   1435   // as
   1436   // int a7 __attribute__((weak));
   1437   // This looks like a bug in gcc. We reject that for now. We should revisit
   1438   // it if this behaviour is actually used.
   1439 
   1440   // GCC rejects
   1441   // static ((alias ("y"), weakref)).
   1442   // Should we? How to check that weakref is before or after alias?
   1443 
   1444   if (Attr.getNumArgs() == 1) {
   1445     Expr *Arg = Attr.getArg(0);
   1446     Arg = Arg->IgnoreParenCasts();
   1447     StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   1448 
   1449     if (!Str || !Str->isAscii()) {
   1450       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   1451         << Attr.getName() << 1 << AANT_ArgumentString;
   1452       return;
   1453     }
   1454     // GCC will accept anything as the argument of weakref. Should we
   1455     // check for an existing decl?
   1456     D->addAttr(::new (S.Context) AliasAttr(Attr.getRange(), S.Context,
   1457                                            Str->getString()));
   1458   }
   1459 
   1460   D->addAttr(::new (S.Context)
   1461              WeakRefAttr(Attr.getRange(), S.Context,
   1462                          Attr.getAttributeSpellingListIndex()));
   1463 }
   1464 
   1465 static void handleAliasAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1466   // check the attribute arguments.
   1467   if (!checkAttributeNumArgs(S, Attr, 1))
   1468     return;
   1469 
   1470   Expr *Arg = Attr.getArg(0);
   1471   Arg = Arg->IgnoreParenCasts();
   1472   StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   1473 
   1474   if (!Str || !Str->isAscii()) {
   1475     S.Diag(Attr.getLoc(), diag::err_attribute_argument_type)
   1476       << Attr.getName() << AANT_ArgumentString;
   1477     return;
   1478   }
   1479 
   1480   if (S.Context.getTargetInfo().getTriple().isOSDarwin()) {
   1481     S.Diag(Attr.getLoc(), diag::err_alias_not_supported_on_darwin);
   1482     return;
   1483   }
   1484 
   1485   // FIXME: check if target symbol exists in current file
   1486 
   1487   D->addAttr(::new (S.Context) AliasAttr(Attr.getRange(), S.Context,
   1488                                          Str->getString(),
   1489                                          Attr.getAttributeSpellingListIndex()));
   1490 }
   1491 
   1492 static void handleMinSizeAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1493   // Check the attribute arguments.
   1494   if (!checkAttributeNumArgs(S, Attr, 0))
   1495     return;
   1496 
   1497   if (!isa<FunctionDecl>(D) && !isa<ObjCMethodDecl>(D)) {
   1498     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1499       << Attr.getName() << ExpectedFunctionOrMethod;
   1500     return;
   1501   }
   1502 
   1503   D->addAttr(::new (S.Context)
   1504              MinSizeAttr(Attr.getRange(), S.Context,
   1505                          Attr.getAttributeSpellingListIndex()));
   1506 }
   1507 
   1508 static void handleColdAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1509   // Check the attribute arguments.
   1510   if (!checkAttributeNumArgs(S, Attr, 0))
   1511     return;
   1512 
   1513   if (!isa<FunctionDecl>(D)) {
   1514     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1515       << Attr.getName() << ExpectedFunction;
   1516     return;
   1517   }
   1518 
   1519   if (D->hasAttr<HotAttr>()) {
   1520     S.Diag(Attr.getLoc(), diag::err_attributes_are_not_compatible)
   1521       << Attr.getName() << "hot";
   1522     return;
   1523   }
   1524 
   1525   D->addAttr(::new (S.Context) ColdAttr(Attr.getRange(), S.Context,
   1526                                         Attr.getAttributeSpellingListIndex()));
   1527 }
   1528 
   1529 static void handleHotAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1530   // Check the attribute arguments.
   1531   if (!checkAttributeNumArgs(S, Attr, 0))
   1532     return;
   1533 
   1534   if (!isa<FunctionDecl>(D)) {
   1535     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1536       << Attr.getName() << ExpectedFunction;
   1537     return;
   1538   }
   1539 
   1540   if (D->hasAttr<ColdAttr>()) {
   1541     S.Diag(Attr.getLoc(), diag::err_attributes_are_not_compatible)
   1542       << Attr.getName() << "cold";
   1543     return;
   1544   }
   1545 
   1546   D->addAttr(::new (S.Context) HotAttr(Attr.getRange(), S.Context,
   1547                                        Attr.getAttributeSpellingListIndex()));
   1548 }
   1549 
   1550 static void handleNakedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1551   // Check the attribute arguments.
   1552   if (!checkAttributeNumArgs(S, Attr, 0))
   1553     return;
   1554 
   1555   if (!isa<FunctionDecl>(D)) {
   1556     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1557       << Attr.getName() << ExpectedFunction;
   1558     return;
   1559   }
   1560 
   1561   D->addAttr(::new (S.Context)
   1562              NakedAttr(Attr.getRange(), S.Context,
   1563                        Attr.getAttributeSpellingListIndex()));
   1564 }
   1565 
   1566 static void handleAlwaysInlineAttr(Sema &S, Decl *D,
   1567                                    const AttributeList &Attr) {
   1568   // Check the attribute arguments.
   1569   if (Attr.hasParameterOrArguments()) {
   1570     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   1571       << Attr.getName() << 0;
   1572     return;
   1573   }
   1574 
   1575   if (!isa<FunctionDecl>(D)) {
   1576     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1577       << Attr.getName() << ExpectedFunction;
   1578     return;
   1579   }
   1580 
   1581   D->addAttr(::new (S.Context)
   1582              AlwaysInlineAttr(Attr.getRange(), S.Context,
   1583                               Attr.getAttributeSpellingListIndex()));
   1584 }
   1585 
   1586 static void handleTLSModelAttr(Sema &S, Decl *D,
   1587                                const AttributeList &Attr) {
   1588   // Check the attribute arguments.
   1589   if (!checkAttributeNumArgs(S, Attr, 1))
   1590     return;
   1591 
   1592   Expr *Arg = Attr.getArg(0);
   1593   Arg = Arg->IgnoreParenCasts();
   1594   StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   1595 
   1596   // Check that it is a string.
   1597   if (!Str) {
   1598     S.Diag(Attr.getLoc(), diag::err_attribute_argument_type)
   1599       << Attr.getName() << AANT_ArgumentString;
   1600     return;
   1601   }
   1602 
   1603   if (!isa<VarDecl>(D) || !cast<VarDecl>(D)->getTLSKind()) {
   1604     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1605       << Attr.getName() << ExpectedTLSVar;
   1606     return;
   1607   }
   1608 
   1609   // Check that the value.
   1610   StringRef Model = Str->getString();
   1611   if (Model != "global-dynamic" && Model != "local-dynamic"
   1612       && Model != "initial-exec" && Model != "local-exec") {
   1613     S.Diag(Attr.getLoc(), diag::err_attr_tlsmodel_arg);
   1614     return;
   1615   }
   1616 
   1617   D->addAttr(::new (S.Context)
   1618              TLSModelAttr(Attr.getRange(), S.Context, Model,
   1619                           Attr.getAttributeSpellingListIndex()));
   1620 }
   1621 
   1622 static void handleMallocAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1623   // Check the attribute arguments.
   1624   if (Attr.hasParameterOrArguments()) {
   1625     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   1626       << Attr.getName() << 0;
   1627     return;
   1628   }
   1629 
   1630   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
   1631     QualType RetTy = FD->getResultType();
   1632     if (RetTy->isAnyPointerType() || RetTy->isBlockPointerType()) {
   1633       D->addAttr(::new (S.Context)
   1634                  MallocAttr(Attr.getRange(), S.Context,
   1635                             Attr.getAttributeSpellingListIndex()));
   1636       return;
   1637     }
   1638   }
   1639 
   1640   S.Diag(Attr.getLoc(), diag::warn_attribute_malloc_pointer_only);
   1641 }
   1642 
   1643 static void handleMayAliasAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1644   // check the attribute arguments.
   1645   if (!checkAttributeNumArgs(S, Attr, 0))
   1646     return;
   1647 
   1648   D->addAttr(::new (S.Context)
   1649              MayAliasAttr(Attr.getRange(), S.Context,
   1650                           Attr.getAttributeSpellingListIndex()));
   1651 }
   1652 
   1653 static void handleNoCommonAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1654   assert(!Attr.isInvalid());
   1655   if (isa<VarDecl>(D))
   1656     D->addAttr(::new (S.Context)
   1657                NoCommonAttr(Attr.getRange(), S.Context,
   1658                             Attr.getAttributeSpellingListIndex()));
   1659   else
   1660     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1661       << Attr.getName() << ExpectedVariable;
   1662 }
   1663 
   1664 static void handleCommonAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1665   assert(!Attr.isInvalid());
   1666 
   1667   if (S.LangOpts.CPlusPlus) {
   1668     S.Diag(Attr.getLoc(), diag::err_common_not_supported_cplusplus);
   1669     return;
   1670   }
   1671 
   1672   if (isa<VarDecl>(D))
   1673     D->addAttr(::new (S.Context)
   1674                CommonAttr(Attr.getRange(), S.Context,
   1675                           Attr.getAttributeSpellingListIndex()));
   1676   else
   1677     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1678       << Attr.getName() << ExpectedVariable;
   1679 }
   1680 
   1681 static void handleNoReturnAttr(Sema &S, Decl *D, const AttributeList &attr) {
   1682   if (hasDeclarator(D)) return;
   1683 
   1684   if (S.CheckNoReturnAttr(attr)) return;
   1685 
   1686   if (!isa<ObjCMethodDecl>(D)) {
   1687     S.Diag(attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1688       << attr.getName() << ExpectedFunctionOrMethod;
   1689     return;
   1690   }
   1691 
   1692   D->addAttr(::new (S.Context)
   1693              NoReturnAttr(attr.getRange(), S.Context,
   1694                           attr.getAttributeSpellingListIndex()));
   1695 }
   1696 
   1697 bool Sema::CheckNoReturnAttr(const AttributeList &attr) {
   1698   if (attr.hasParameterOrArguments()) {
   1699     Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   1700       << attr.getName() << 0;
   1701     attr.setInvalid();
   1702     return true;
   1703   }
   1704 
   1705   return false;
   1706 }
   1707 
   1708 static void handleAnalyzerNoReturnAttr(Sema &S, Decl *D,
   1709                                        const AttributeList &Attr) {
   1710 
   1711   // The checking path for 'noreturn' and 'analyzer_noreturn' are different
   1712   // because 'analyzer_noreturn' does not impact the type.
   1713 
   1714   if(!checkAttributeNumArgs(S, Attr, 0))
   1715       return;
   1716 
   1717   if (!isFunctionOrMethod(D) && !isa<BlockDecl>(D)) {
   1718     ValueDecl *VD = dyn_cast<ValueDecl>(D);
   1719     if (VD == 0 || (!VD->getType()->isBlockPointerType()
   1720                     && !VD->getType()->isFunctionPointerType())) {
   1721       S.Diag(Attr.getLoc(),
   1722              Attr.isCXX11Attribute() ? diag::err_attribute_wrong_decl_type
   1723              : diag::warn_attribute_wrong_decl_type)
   1724         << Attr.getName() << ExpectedFunctionMethodOrBlock;
   1725       return;
   1726     }
   1727   }
   1728 
   1729   D->addAttr(::new (S.Context)
   1730              AnalyzerNoReturnAttr(Attr.getRange(), S.Context,
   1731                                   Attr.getAttributeSpellingListIndex()));
   1732 }
   1733 
   1734 static void handleCXX11NoReturnAttr(Sema &S, Decl *D,
   1735                                     const AttributeList &Attr) {
   1736   // C++11 [dcl.attr.noreturn]p1:
   1737   //   The attribute may be applied to the declarator-id in a function
   1738   //   declaration.
   1739   FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
   1740   if (!FD) {
   1741     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1742       << Attr.getName() << ExpectedFunctionOrMethod;
   1743     return;
   1744   }
   1745 
   1746   D->addAttr(::new (S.Context)
   1747              CXX11NoReturnAttr(Attr.getRange(), S.Context,
   1748                                Attr.getAttributeSpellingListIndex()));
   1749 }
   1750 
   1751 // PS3 PPU-specific.
   1752 static void handleVecReturnAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1753 /*
   1754   Returning a Vector Class in Registers
   1755 
   1756   According to the PPU ABI specifications, a class with a single member of
   1757   vector type is returned in memory when used as the return value of a function.
   1758   This results in inefficient code when implementing vector classes. To return
   1759   the value in a single vector register, add the vecreturn attribute to the
   1760   class definition. This attribute is also applicable to struct types.
   1761 
   1762   Example:
   1763 
   1764   struct Vector
   1765   {
   1766     __vector float xyzw;
   1767   } __attribute__((vecreturn));
   1768 
   1769   Vector Add(Vector lhs, Vector rhs)
   1770   {
   1771     Vector result;
   1772     result.xyzw = vec_add(lhs.xyzw, rhs.xyzw);
   1773     return result; // This will be returned in a register
   1774   }
   1775 */
   1776   if (!isa<RecordDecl>(D)) {
   1777     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1778       << Attr.getName() << ExpectedClass;
   1779     return;
   1780   }
   1781 
   1782   if (D->getAttr<VecReturnAttr>()) {
   1783     S.Diag(Attr.getLoc(), diag::err_repeat_attribute) << "vecreturn";
   1784     return;
   1785   }
   1786 
   1787   RecordDecl *record = cast<RecordDecl>(D);
   1788   int count = 0;
   1789 
   1790   if (!isa<CXXRecordDecl>(record)) {
   1791     S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_vector_member);
   1792     return;
   1793   }
   1794 
   1795   if (!cast<CXXRecordDecl>(record)->isPOD()) {
   1796     S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_pod_record);
   1797     return;
   1798   }
   1799 
   1800   for (RecordDecl::field_iterator iter = record->field_begin();
   1801        iter != record->field_end(); iter++) {
   1802     if ((count == 1) || !iter->getType()->isVectorType()) {
   1803       S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_vector_member);
   1804       return;
   1805     }
   1806     count++;
   1807   }
   1808 
   1809   D->addAttr(::new (S.Context)
   1810              VecReturnAttr(Attr.getRange(), S.Context,
   1811                            Attr.getAttributeSpellingListIndex()));
   1812 }
   1813 
   1814 static void handleDependencyAttr(Sema &S, Scope *Scope, Decl *D,
   1815                                  const AttributeList &Attr) {
   1816   if (isa<ParmVarDecl>(D)) {
   1817     // [[carries_dependency]] can only be applied to a parameter if it is a
   1818     // parameter of a function declaration or lambda.
   1819     if (!(Scope->getFlags() & clang::Scope::FunctionDeclarationScope)) {
   1820       S.Diag(Attr.getLoc(),
   1821              diag::err_carries_dependency_param_not_function_decl);
   1822       return;
   1823     }
   1824   } else if (!isa<FunctionDecl>(D)) {
   1825     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1826       << Attr.getName() << ExpectedFunctionMethodOrParameter;
   1827     return;
   1828   }
   1829 
   1830   D->addAttr(::new (S.Context) CarriesDependencyAttr(
   1831                                    Attr.getRange(), S.Context,
   1832                                    Attr.getAttributeSpellingListIndex()));
   1833 }
   1834 
   1835 static void handleUnusedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1836   // check the attribute arguments.
   1837   if (Attr.hasParameterOrArguments()) {
   1838     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   1839       << Attr.getName() << 0;
   1840     return;
   1841   }
   1842 
   1843   if (!isa<VarDecl>(D) && !isa<ObjCIvarDecl>(D) && !isFunctionOrMethod(D) &&
   1844       !isa<TypeDecl>(D) && !isa<LabelDecl>(D) && !isa<FieldDecl>(D)) {
   1845     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1846       << Attr.getName() << ExpectedVariableFunctionOrLabel;
   1847     return;
   1848   }
   1849 
   1850   D->addAttr(::new (S.Context)
   1851              UnusedAttr(Attr.getRange(), S.Context,
   1852                         Attr.getAttributeSpellingListIndex()));
   1853 }
   1854 
   1855 static void handleReturnsTwiceAttr(Sema &S, Decl *D,
   1856                                    const AttributeList &Attr) {
   1857   // check the attribute arguments.
   1858   if (Attr.hasParameterOrArguments()) {
   1859     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   1860       << Attr.getName() << 0;
   1861     return;
   1862   }
   1863 
   1864   if (!isa<FunctionDecl>(D)) {
   1865     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1866       << Attr.getName() << ExpectedFunction;
   1867     return;
   1868   }
   1869 
   1870   D->addAttr(::new (S.Context)
   1871              ReturnsTwiceAttr(Attr.getRange(), S.Context,
   1872                               Attr.getAttributeSpellingListIndex()));
   1873 }
   1874 
   1875 static void handleUsedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1876   // check the attribute arguments.
   1877   if (Attr.hasParameterOrArguments()) {
   1878     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   1879       << Attr.getName() << 0;
   1880     return;
   1881   }
   1882 
   1883   if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
   1884     if (VD->hasLocalStorage() || VD->hasExternalStorage()) {
   1885       S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "used";
   1886       return;
   1887     }
   1888   } else if (!isFunctionOrMethod(D)) {
   1889     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1890       << Attr.getName() << ExpectedVariableOrFunction;
   1891     return;
   1892   }
   1893 
   1894   D->addAttr(::new (S.Context)
   1895              UsedAttr(Attr.getRange(), S.Context,
   1896                       Attr.getAttributeSpellingListIndex()));
   1897 }
   1898 
   1899 static void handleConstructorAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1900   // check the attribute arguments.
   1901   if (Attr.getNumArgs() > 1) {
   1902     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
   1903     return;
   1904   }
   1905 
   1906   int priority = 65535; // FIXME: Do not hardcode such constants.
   1907   if (Attr.getNumArgs() > 0) {
   1908     Expr *E = Attr.getArg(0);
   1909     llvm::APSInt Idx(32);
   1910     if (E->isTypeDependent() || E->isValueDependent() ||
   1911         !E->isIntegerConstantExpr(Idx, S.Context)) {
   1912       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   1913         << Attr.getName() << 1 << AANT_ArgumentIntegerConstant
   1914         << E->getSourceRange();
   1915       return;
   1916     }
   1917     priority = Idx.getZExtValue();
   1918   }
   1919 
   1920   if (!isa<FunctionDecl>(D)) {
   1921     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1922       << Attr.getName() << ExpectedFunction;
   1923     return;
   1924   }
   1925 
   1926   D->addAttr(::new (S.Context)
   1927              ConstructorAttr(Attr.getRange(), S.Context, priority,
   1928                              Attr.getAttributeSpellingListIndex()));
   1929 }
   1930 
   1931 static void handleDestructorAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1932   // check the attribute arguments.
   1933   if (Attr.getNumArgs() > 1) {
   1934     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
   1935     return;
   1936   }
   1937 
   1938   int priority = 65535; // FIXME: Do not hardcode such constants.
   1939   if (Attr.getNumArgs() > 0) {
   1940     Expr *E = Attr.getArg(0);
   1941     llvm::APSInt Idx(32);
   1942     if (E->isTypeDependent() || E->isValueDependent() ||
   1943         !E->isIntegerConstantExpr(Idx, S.Context)) {
   1944       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   1945         << Attr.getName() << 1 << AANT_ArgumentIntegerConstant
   1946         << E->getSourceRange();
   1947       return;
   1948     }
   1949     priority = Idx.getZExtValue();
   1950   }
   1951 
   1952   if (!isa<FunctionDecl>(D)) {
   1953     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1954       << Attr.getName() << ExpectedFunction;
   1955     return;
   1956   }
   1957 
   1958   D->addAttr(::new (S.Context)
   1959              DestructorAttr(Attr.getRange(), S.Context, priority,
   1960                             Attr.getAttributeSpellingListIndex()));
   1961 }
   1962 
   1963 template <typename AttrTy>
   1964 static void handleAttrWithMessage(Sema &S, Decl *D,
   1965                                   const AttributeList &Attr) {
   1966   unsigned NumArgs = Attr.getNumArgs();
   1967   if (NumArgs > 1) {
   1968     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
   1969     return;
   1970   }
   1971 
   1972   // Handle the case where the attribute has a text message.
   1973   StringRef Str;
   1974   if (NumArgs == 1) {
   1975     StringLiteral *SE = dyn_cast<StringLiteral>(Attr.getArg(0));
   1976     if (!SE) {
   1977       S.Diag(Attr.getArg(0)->getLocStart(), diag::err_attribute_argument_type)
   1978         << Attr.getName() << AANT_ArgumentString;
   1979       return;
   1980     }
   1981     Str = SE->getString();
   1982   }
   1983 
   1984   D->addAttr(::new (S.Context) AttrTy(Attr.getRange(), S.Context, Str,
   1985                                       Attr.getAttributeSpellingListIndex()));
   1986 }
   1987 
   1988 static void handleArcWeakrefUnavailableAttr(Sema &S, Decl *D,
   1989                                             const AttributeList &Attr) {
   1990   if (!checkAttributeNumArgs(S, Attr, 0))
   1991     return;
   1992 
   1993   D->addAttr(::new (S.Context)
   1994              ArcWeakrefUnavailableAttr(Attr.getRange(), S.Context,
   1995                                        Attr.getAttributeSpellingListIndex()));
   1996 }
   1997 
   1998 static void handleObjCRootClassAttr(Sema &S, Decl *D,
   1999                                     const AttributeList &Attr) {
   2000   if (!isa<ObjCInterfaceDecl>(D)) {
   2001     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   2002       << Attr.getName() << ExpectedObjectiveCInterface;
   2003     return;
   2004   }
   2005 
   2006   if (!checkAttributeNumArgs(S, Attr, 0))
   2007     return;
   2008 
   2009   D->addAttr(::new (S.Context)
   2010              ObjCRootClassAttr(Attr.getRange(), S.Context,
   2011                                Attr.getAttributeSpellingListIndex()));
   2012 }
   2013 
   2014 static void handleObjCRequiresPropertyDefsAttr(Sema &S, Decl *D,
   2015                                                const AttributeList &Attr) {
   2016   if (!isa<ObjCInterfaceDecl>(D)) {
   2017     S.Diag(Attr.getLoc(), diag::err_suppress_autosynthesis);
   2018     return;
   2019   }
   2020 
   2021   if (!checkAttributeNumArgs(S, Attr, 0))
   2022     return;
   2023 
   2024   D->addAttr(::new (S.Context)
   2025              ObjCRequiresPropertyDefsAttr(Attr.getRange(), S.Context,
   2026                                           Attr.getAttributeSpellingListIndex()));
   2027 }
   2028 
   2029 static bool checkAvailabilityAttr(Sema &S, SourceRange Range,
   2030                                   IdentifierInfo *Platform,
   2031                                   VersionTuple Introduced,
   2032                                   VersionTuple Deprecated,
   2033                                   VersionTuple Obsoleted) {
   2034   StringRef PlatformName
   2035     = AvailabilityAttr::getPrettyPlatformName(Platform->getName());
   2036   if (PlatformName.empty())
   2037     PlatformName = Platform->getName();
   2038 
   2039   // Ensure that Introduced <= Deprecated <= Obsoleted (although not all
   2040   // of these steps are needed).
   2041   if (!Introduced.empty() && !Deprecated.empty() &&
   2042       !(Introduced <= Deprecated)) {
   2043     S.Diag(Range.getBegin(), diag::warn_availability_version_ordering)
   2044       << 1 << PlatformName << Deprecated.getAsString()
   2045       << 0 << Introduced.getAsString();
   2046     return true;
   2047   }
   2048 
   2049   if (!Introduced.empty() && !Obsoleted.empty() &&
   2050       !(Introduced <= Obsoleted)) {
   2051     S.Diag(Range.getBegin(), diag::warn_availability_version_ordering)
   2052       << 2 << PlatformName << Obsoleted.getAsString()
   2053       << 0 << Introduced.getAsString();
   2054     return true;
   2055   }
   2056 
   2057   if (!Deprecated.empty() && !Obsoleted.empty() &&
   2058       !(Deprecated <= Obsoleted)) {
   2059     S.Diag(Range.getBegin(), diag::warn_availability_version_ordering)
   2060       << 2 << PlatformName << Obsoleted.getAsString()
   2061       << 1 << Deprecated.getAsString();
   2062     return true;
   2063   }
   2064 
   2065   return false;
   2066 }
   2067 
   2068 /// \brief Check whether the two versions match.
   2069 ///
   2070 /// If either version tuple is empty, then they are assumed to match. If
   2071 /// \p BeforeIsOkay is true, then \p X can be less than or equal to \p Y.
   2072 static bool versionsMatch(const VersionTuple &X, const VersionTuple &Y,
   2073                           bool BeforeIsOkay) {
   2074   if (X.empty() || Y.empty())
   2075     return true;
   2076 
   2077   if (X == Y)
   2078     return true;
   2079 
   2080   if (BeforeIsOkay && X < Y)
   2081     return true;
   2082 
   2083   return false;
   2084 }
   2085 
   2086 AvailabilityAttr *Sema::mergeAvailabilityAttr(NamedDecl *D, SourceRange Range,
   2087                                               IdentifierInfo *Platform,
   2088                                               VersionTuple Introduced,
   2089                                               VersionTuple Deprecated,
   2090                                               VersionTuple Obsoleted,
   2091                                               bool IsUnavailable,
   2092                                               StringRef Message,
   2093                                               bool Override,
   2094                                               unsigned AttrSpellingListIndex) {
   2095   VersionTuple MergedIntroduced = Introduced;
   2096   VersionTuple MergedDeprecated = Deprecated;
   2097   VersionTuple MergedObsoleted = Obsoleted;
   2098   bool FoundAny = false;
   2099 
   2100   if (D->hasAttrs()) {
   2101     AttrVec &Attrs = D->getAttrs();
   2102     for (unsigned i = 0, e = Attrs.size(); i != e;) {
   2103       const AvailabilityAttr *OldAA = dyn_cast<AvailabilityAttr>(Attrs[i]);
   2104       if (!OldAA) {
   2105         ++i;
   2106         continue;
   2107       }
   2108 
   2109       IdentifierInfo *OldPlatform = OldAA->getPlatform();
   2110       if (OldPlatform != Platform) {
   2111         ++i;
   2112         continue;
   2113       }
   2114 
   2115       FoundAny = true;
   2116       VersionTuple OldIntroduced = OldAA->getIntroduced();
   2117       VersionTuple OldDeprecated = OldAA->getDeprecated();
   2118       VersionTuple OldObsoleted = OldAA->getObsoleted();
   2119       bool OldIsUnavailable = OldAA->getUnavailable();
   2120 
   2121       if (!versionsMatch(OldIntroduced, Introduced, Override) ||
   2122           !versionsMatch(Deprecated, OldDeprecated, Override) ||
   2123           !versionsMatch(Obsoleted, OldObsoleted, Override) ||
   2124           !(OldIsUnavailable == IsUnavailable ||
   2125             (Override && !OldIsUnavailable && IsUnavailable))) {
   2126         if (Override) {
   2127           int Which = -1;
   2128           VersionTuple FirstVersion;
   2129           VersionTuple SecondVersion;
   2130           if (!versionsMatch(OldIntroduced, Introduced, Override)) {
   2131             Which = 0;
   2132             FirstVersion = OldIntroduced;
   2133             SecondVersion = Introduced;
   2134           } else if (!versionsMatch(Deprecated, OldDeprecated, Override)) {
   2135             Which = 1;
   2136             FirstVersion = Deprecated;
   2137             SecondVersion = OldDeprecated;
   2138           } else if (!versionsMatch(Obsoleted, OldObsoleted, Override)) {
   2139             Which = 2;
   2140             FirstVersion = Obsoleted;
   2141             SecondVersion = OldObsoleted;
   2142           }
   2143 
   2144           if (Which == -1) {
   2145             Diag(OldAA->getLocation(),
   2146                  diag::warn_mismatched_availability_override_unavail)
   2147               << AvailabilityAttr::getPrettyPlatformName(Platform->getName());
   2148           } else {
   2149             Diag(OldAA->getLocation(),
   2150                  diag::warn_mismatched_availability_override)
   2151               << Which
   2152               << AvailabilityAttr::getPrettyPlatformName(Platform->getName())
   2153               << FirstVersion.getAsString() << SecondVersion.getAsString();
   2154           }
   2155           Diag(Range.getBegin(), diag::note_overridden_method);
   2156         } else {
   2157           Diag(OldAA->getLocation(), diag::warn_mismatched_availability);
   2158           Diag(Range.getBegin(), diag::note_previous_attribute);
   2159         }
   2160 
   2161         Attrs.erase(Attrs.begin() + i);
   2162         --e;
   2163         continue;
   2164       }
   2165 
   2166       VersionTuple MergedIntroduced2 = MergedIntroduced;
   2167       VersionTuple MergedDeprecated2 = MergedDeprecated;
   2168       VersionTuple MergedObsoleted2 = MergedObsoleted;
   2169 
   2170       if (MergedIntroduced2.empty())
   2171         MergedIntroduced2 = OldIntroduced;
   2172       if (MergedDeprecated2.empty())
   2173         MergedDeprecated2 = OldDeprecated;
   2174       if (MergedObsoleted2.empty())
   2175         MergedObsoleted2 = OldObsoleted;
   2176 
   2177       if (checkAvailabilityAttr(*this, OldAA->getRange(), Platform,
   2178                                 MergedIntroduced2, MergedDeprecated2,
   2179                                 MergedObsoleted2)) {
   2180         Attrs.erase(Attrs.begin() + i);
   2181         --e;
   2182         continue;
   2183       }
   2184 
   2185       MergedIntroduced = MergedIntroduced2;
   2186       MergedDeprecated = MergedDeprecated2;
   2187       MergedObsoleted = MergedObsoleted2;
   2188       ++i;
   2189     }
   2190   }
   2191 
   2192   if (FoundAny &&
   2193       MergedIntroduced == Introduced &&
   2194       MergedDeprecated == Deprecated &&
   2195       MergedObsoleted == Obsoleted)
   2196     return NULL;
   2197 
   2198   // Only create a new attribute if !Override, but we want to do
   2199   // the checking.
   2200   if (!checkAvailabilityAttr(*this, Range, Platform, MergedIntroduced,
   2201                              MergedDeprecated, MergedObsoleted) &&
   2202       !Override) {
   2203     return ::new (Context) AvailabilityAttr(Range, Context, Platform,
   2204                                             Introduced, Deprecated,
   2205                                             Obsoleted, IsUnavailable, Message,
   2206                                             AttrSpellingListIndex);
   2207   }
   2208   return NULL;
   2209 }
   2210 
   2211 static void handleAvailabilityAttr(Sema &S, Decl *D,
   2212                                    const AttributeList &Attr) {
   2213   IdentifierInfo *Platform = Attr.getParameterName();
   2214   SourceLocation PlatformLoc = Attr.getParameterLoc();
   2215   unsigned Index = Attr.getAttributeSpellingListIndex();
   2216 
   2217   if (AvailabilityAttr::getPrettyPlatformName(Platform->getName()).empty())
   2218     S.Diag(PlatformLoc, diag::warn_availability_unknown_platform)
   2219       << Platform;
   2220 
   2221   NamedDecl *ND = dyn_cast<NamedDecl>(D);
   2222   if (!ND) {
   2223     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
   2224     return;
   2225   }
   2226 
   2227   AvailabilityChange Introduced = Attr.getAvailabilityIntroduced();
   2228   AvailabilityChange Deprecated = Attr.getAvailabilityDeprecated();
   2229   AvailabilityChange Obsoleted = Attr.getAvailabilityObsoleted();
   2230   bool IsUnavailable = Attr.getUnavailableLoc().isValid();
   2231   StringRef Str;
   2232   const StringLiteral *SE =
   2233     dyn_cast_or_null<const StringLiteral>(Attr.getMessageExpr());
   2234   if (SE)
   2235     Str = SE->getString();
   2236 
   2237   AvailabilityAttr *NewAttr = S.mergeAvailabilityAttr(ND, Attr.getRange(),
   2238                                                       Platform,
   2239                                                       Introduced.Version,
   2240                                                       Deprecated.Version,
   2241                                                       Obsoleted.Version,
   2242                                                       IsUnavailable, Str,
   2243                                                       /*Override=*/false,
   2244                                                       Index);
   2245   if (NewAttr)
   2246     D->addAttr(NewAttr);
   2247 }
   2248 
   2249 template <class T>
   2250 static T *mergeVisibilityAttr(Sema &S, Decl *D, SourceRange range,
   2251                               typename T::VisibilityType value,
   2252                               unsigned attrSpellingListIndex) {
   2253   T *existingAttr = D->getAttr<T>();
   2254   if (existingAttr) {
   2255     typename T::VisibilityType existingValue = existingAttr->getVisibility();
   2256     if (existingValue == value)
   2257       return NULL;
   2258     S.Diag(existingAttr->getLocation(), diag::err_mismatched_visibility);
   2259     S.Diag(range.getBegin(), diag::note_previous_attribute);
   2260     D->dropAttr<T>();
   2261   }
   2262   return ::new (S.Context) T(range, S.Context, value, attrSpellingListIndex);
   2263 }
   2264 
   2265 VisibilityAttr *Sema::mergeVisibilityAttr(Decl *D, SourceRange Range,
   2266                                           VisibilityAttr::VisibilityType Vis,
   2267                                           unsigned AttrSpellingListIndex) {
   2268   return ::mergeVisibilityAttr<VisibilityAttr>(*this, D, Range, Vis,
   2269                                                AttrSpellingListIndex);
   2270 }
   2271 
   2272 TypeVisibilityAttr *Sema::mergeTypeVisibilityAttr(Decl *D, SourceRange Range,
   2273                                       TypeVisibilityAttr::VisibilityType Vis,
   2274                                       unsigned AttrSpellingListIndex) {
   2275   return ::mergeVisibilityAttr<TypeVisibilityAttr>(*this, D, Range, Vis,
   2276                                                    AttrSpellingListIndex);
   2277 }
   2278 
   2279 static void handleVisibilityAttr(Sema &S, Decl *D, const AttributeList &Attr,
   2280                                  bool isTypeVisibility) {
   2281   // Visibility attributes don't mean anything on a typedef.
   2282   if (isa<TypedefNameDecl>(D)) {
   2283     S.Diag(Attr.getRange().getBegin(), diag::warn_attribute_ignored)
   2284       << Attr.getName();
   2285     return;
   2286   }
   2287 
   2288   // 'type_visibility' can only go on a type or namespace.
   2289   if (isTypeVisibility &&
   2290       !(isa<TagDecl>(D) ||
   2291         isa<ObjCInterfaceDecl>(D) ||
   2292         isa<NamespaceDecl>(D))) {
   2293     S.Diag(Attr.getRange().getBegin(), diag::err_attribute_wrong_decl_type)
   2294       << Attr.getName() << ExpectedTypeOrNamespace;
   2295     return;
   2296   }
   2297 
   2298   // check the attribute arguments.
   2299   if (!checkAttributeNumArgs(S, Attr, 1))
   2300     return;
   2301 
   2302   Expr *Arg = Attr.getArg(0);
   2303   Arg = Arg->IgnoreParenCasts();
   2304   StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   2305 
   2306   if (!Str || !Str->isAscii()) {
   2307     S.Diag(Attr.getLoc(), diag::err_attribute_argument_type)
   2308       << Attr.getName() << AANT_ArgumentString;
   2309     return;
   2310   }
   2311 
   2312   StringRef TypeStr = Str->getString();
   2313   VisibilityAttr::VisibilityType type;
   2314 
   2315   if (TypeStr == "default")
   2316     type = VisibilityAttr::Default;
   2317   else if (TypeStr == "hidden")
   2318     type = VisibilityAttr::Hidden;
   2319   else if (TypeStr == "internal")
   2320     type = VisibilityAttr::Hidden; // FIXME
   2321   else if (TypeStr == "protected") {
   2322     // Complain about attempts to use protected visibility on targets
   2323     // (like Darwin) that don't support it.
   2324     if (!S.Context.getTargetInfo().hasProtectedVisibility()) {
   2325       S.Diag(Attr.getLoc(), diag::warn_attribute_protected_visibility);
   2326       type = VisibilityAttr::Default;
   2327     } else {
   2328       type = VisibilityAttr::Protected;
   2329     }
   2330   } else {
   2331     S.Diag(Attr.getLoc(), diag::warn_attribute_unknown_visibility) << TypeStr;
   2332     return;
   2333   }
   2334 
   2335   unsigned Index = Attr.getAttributeSpellingListIndex();
   2336   clang::Attr *newAttr;
   2337   if (isTypeVisibility) {
   2338     newAttr = S.mergeTypeVisibilityAttr(D, Attr.getRange(),
   2339                                     (TypeVisibilityAttr::VisibilityType) type,
   2340                                         Index);
   2341   } else {
   2342     newAttr = S.mergeVisibilityAttr(D, Attr.getRange(), type, Index);
   2343   }
   2344   if (newAttr)
   2345     D->addAttr(newAttr);
   2346 }
   2347 
   2348 static void handleObjCMethodFamilyAttr(Sema &S, Decl *decl,
   2349                                        const AttributeList &Attr) {
   2350   ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(decl);
   2351   if (!method) {
   2352     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   2353       << ExpectedMethod;
   2354     return;
   2355   }
   2356 
   2357   if (Attr.getNumArgs() != 0 || !Attr.getParameterName()) {
   2358     if (!Attr.getParameterName() && Attr.getNumArgs() == 1) {
   2359       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   2360         << Attr.getName() << 1 << AANT_ArgumentString;
   2361     } else {
   2362       S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   2363         << Attr.getName() << 0;
   2364     }
   2365     Attr.setInvalid();
   2366     return;
   2367   }
   2368 
   2369   StringRef param = Attr.getParameterName()->getName();
   2370   ObjCMethodFamilyAttr::FamilyKind family;
   2371   if (param == "none")
   2372     family = ObjCMethodFamilyAttr::OMF_None;
   2373   else if (param == "alloc")
   2374     family = ObjCMethodFamilyAttr::OMF_alloc;
   2375   else if (param == "copy")
   2376     family = ObjCMethodFamilyAttr::OMF_copy;
   2377   else if (param == "init")
   2378     family = ObjCMethodFamilyAttr::OMF_init;
   2379   else if (param == "mutableCopy")
   2380     family = ObjCMethodFamilyAttr::OMF_mutableCopy;
   2381   else if (param == "new")
   2382     family = ObjCMethodFamilyAttr::OMF_new;
   2383   else {
   2384     // Just warn and ignore it.  This is future-proof against new
   2385     // families being used in system headers.
   2386     S.Diag(Attr.getParameterLoc(), diag::warn_unknown_method_family);
   2387     return;
   2388   }
   2389 
   2390   if (family == ObjCMethodFamilyAttr::OMF_init &&
   2391       !method->getResultType()->isObjCObjectPointerType()) {
   2392     S.Diag(method->getLocation(), diag::err_init_method_bad_return_type)
   2393       << method->getResultType();
   2394     // Ignore the attribute.
   2395     return;
   2396   }
   2397 
   2398   method->addAttr(new (S.Context) ObjCMethodFamilyAttr(Attr.getRange(),
   2399                                                        S.Context, family));
   2400 }
   2401 
   2402 static void handleObjCExceptionAttr(Sema &S, Decl *D,
   2403                                     const AttributeList &Attr) {
   2404   if (!checkAttributeNumArgs(S, Attr, 0))
   2405     return;
   2406 
   2407   ObjCInterfaceDecl *OCI = dyn_cast<ObjCInterfaceDecl>(D);
   2408   if (OCI == 0) {
   2409     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   2410       << Attr.getName() << ExpectedObjectiveCInterface;
   2411     return;
   2412   }
   2413 
   2414   D->addAttr(::new (S.Context)
   2415              ObjCExceptionAttr(Attr.getRange(), S.Context,
   2416                                Attr.getAttributeSpellingListIndex()));
   2417 }
   2418 
   2419 static void handleObjCNSObject(Sema &S, Decl *D, const AttributeList &Attr) {
   2420   if (!checkAttributeNumArgs(S, Attr, 0))
   2421     return;
   2422   if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D)) {
   2423     QualType T = TD->getUnderlyingType();
   2424     if (!T->isCARCBridgableType()) {
   2425       S.Diag(TD->getLocation(), diag::err_nsobject_attribute);
   2426       return;
   2427     }
   2428   }
   2429   else if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D)) {
   2430     QualType T = PD->getType();
   2431     if (!T->isCARCBridgableType()) {
   2432       S.Diag(PD->getLocation(), diag::err_nsobject_attribute);
   2433       return;
   2434     }
   2435   }
   2436   else {
   2437     // It is okay to include this attribute on properties, e.g.:
   2438     //
   2439     //  @property (retain, nonatomic) struct Bork *Q __attribute__((NSObject));
   2440     //
   2441     // In this case it follows tradition and suppresses an error in the above
   2442     // case.
   2443     S.Diag(D->getLocation(), diag::warn_nsobject_attribute);
   2444   }
   2445   D->addAttr(::new (S.Context)
   2446              ObjCNSObjectAttr(Attr.getRange(), S.Context,
   2447                               Attr.getAttributeSpellingListIndex()));
   2448 }
   2449 
   2450 static void
   2451 handleOverloadableAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2452   if (!checkAttributeNumArgs(S, Attr, 0))
   2453     return;
   2454 
   2455   if (!isa<FunctionDecl>(D)) {
   2456     S.Diag(Attr.getLoc(), diag::err_attribute_overloadable_not_function);
   2457     return;
   2458   }
   2459 
   2460   D->addAttr(::new (S.Context)
   2461              OverloadableAttr(Attr.getRange(), S.Context,
   2462                               Attr.getAttributeSpellingListIndex()));
   2463 }
   2464 
   2465 static void handleBlocksAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2466   if (!Attr.getParameterName()) {
   2467     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   2468       << Attr.getName() << 1 << AANT_ArgumentString;
   2469     return;
   2470   }
   2471 
   2472   if (Attr.getNumArgs() != 0) {
   2473     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   2474       << Attr.getName() << 1;
   2475     return;
   2476   }
   2477 
   2478   BlocksAttr::BlockType type;
   2479   if (Attr.getParameterName()->isStr("byref"))
   2480     type = BlocksAttr::ByRef;
   2481   else {
   2482     S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
   2483       << "blocks" << Attr.getParameterName();
   2484     return;
   2485   }
   2486 
   2487   D->addAttr(::new (S.Context)
   2488              BlocksAttr(Attr.getRange(), S.Context, type,
   2489                         Attr.getAttributeSpellingListIndex()));
   2490 }
   2491 
   2492 static void handleSentinelAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2493   // check the attribute arguments.
   2494   if (Attr.getNumArgs() > 2) {
   2495     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 2;
   2496     return;
   2497   }
   2498 
   2499   unsigned sentinel = 0;
   2500   if (Attr.getNumArgs() > 0) {
   2501     Expr *E = Attr.getArg(0);
   2502     llvm::APSInt Idx(32);
   2503     if (E->isTypeDependent() || E->isValueDependent() ||
   2504         !E->isIntegerConstantExpr(Idx, S.Context)) {
   2505       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   2506         << Attr.getName() << 1 << AANT_ArgumentIntegerConstant
   2507         << E->getSourceRange();
   2508       return;
   2509     }
   2510 
   2511     if (Idx.isSigned() && Idx.isNegative()) {
   2512       S.Diag(Attr.getLoc(), diag::err_attribute_sentinel_less_than_zero)
   2513         << E->getSourceRange();
   2514       return;
   2515     }
   2516 
   2517     sentinel = Idx.getZExtValue();
   2518   }
   2519 
   2520   unsigned nullPos = 0;
   2521   if (Attr.getNumArgs() > 1) {
   2522     Expr *E = Attr.getArg(1);
   2523     llvm::APSInt Idx(32);
   2524     if (E->isTypeDependent() || E->isValueDependent() ||
   2525         !E->isIntegerConstantExpr(Idx, S.Context)) {
   2526       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   2527         << Attr.getName() << 2 << AANT_ArgumentIntegerConstant
   2528         << E->getSourceRange();
   2529       return;
   2530     }
   2531     nullPos = Idx.getZExtValue();
   2532 
   2533     if ((Idx.isSigned() && Idx.isNegative()) || nullPos > 1) {
   2534       // FIXME: This error message could be improved, it would be nice
   2535       // to say what the bounds actually are.
   2536       S.Diag(Attr.getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
   2537         << E->getSourceRange();
   2538       return;
   2539     }
   2540   }
   2541 
   2542   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
   2543     const FunctionType *FT = FD->getType()->castAs<FunctionType>();
   2544     if (isa<FunctionNoProtoType>(FT)) {
   2545       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_named_arguments);
   2546       return;
   2547     }
   2548 
   2549     if (!cast<FunctionProtoType>(FT)->isVariadic()) {
   2550       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
   2551       return;
   2552     }
   2553   } else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
   2554     if (!MD->isVariadic()) {
   2555       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
   2556       return;
   2557     }
   2558   } else if (BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
   2559     if (!BD->isVariadic()) {
   2560       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 1;
   2561       return;
   2562     }
   2563   } else if (const VarDecl *V = dyn_cast<VarDecl>(D)) {
   2564     QualType Ty = V->getType();
   2565     if (Ty->isBlockPointerType() || Ty->isFunctionPointerType()) {
   2566       const FunctionType *FT = Ty->isFunctionPointerType() ? getFunctionType(D)
   2567        : Ty->getAs<BlockPointerType>()->getPointeeType()->getAs<FunctionType>();
   2568       if (!cast<FunctionProtoType>(FT)->isVariadic()) {
   2569         int m = Ty->isFunctionPointerType() ? 0 : 1;
   2570         S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
   2571         return;
   2572       }
   2573     } else {
   2574       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2575         << Attr.getName() << ExpectedFunctionMethodOrBlock;
   2576       return;
   2577     }
   2578   } else {
   2579     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2580       << Attr.getName() << ExpectedFunctionMethodOrBlock;
   2581     return;
   2582   }
   2583   D->addAttr(::new (S.Context)
   2584              SentinelAttr(Attr.getRange(), S.Context, sentinel, nullPos,
   2585                           Attr.getAttributeSpellingListIndex()));
   2586 }
   2587 
   2588 static void handleWarnUnusedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2589   // Check the attribute arguments.
   2590   if (!checkAttributeNumArgs(S, Attr, 0))
   2591     return;
   2592 
   2593   if (RecordDecl *RD = dyn_cast<RecordDecl>(D))
   2594     RD->addAttr(::new (S.Context) WarnUnusedAttr(Attr.getRange(), S.Context));
   2595   else
   2596     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
   2597 }
   2598 
   2599 static void handleWarnUnusedResult(Sema &S, Decl *D, const AttributeList &Attr) {
   2600   // check the attribute arguments.
   2601   if (!checkAttributeNumArgs(S, Attr, 0))
   2602     return;
   2603 
   2604   if (!isFunction(D) && !isa<ObjCMethodDecl>(D) && !isa<CXXRecordDecl>(D)) {
   2605     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2606       << Attr.getName() << ExpectedFunctionMethodOrClass;
   2607     return;
   2608   }
   2609 
   2610   if (isFunction(D) && getFunctionType(D)->getResultType()->isVoidType()) {
   2611     S.Diag(Attr.getLoc(), diag::warn_attribute_void_function_method)
   2612       << Attr.getName() << 0;
   2613     return;
   2614   }
   2615   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
   2616     if (MD->getResultType()->isVoidType()) {
   2617       S.Diag(Attr.getLoc(), diag::warn_attribute_void_function_method)
   2618       << Attr.getName() << 1;
   2619       return;
   2620     }
   2621 
   2622   D->addAttr(::new (S.Context)
   2623              WarnUnusedResultAttr(Attr.getRange(), S.Context,
   2624                                   Attr.getAttributeSpellingListIndex()));
   2625 }
   2626 
   2627 static void handleWeakAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2628   // check the attribute arguments.
   2629   if (Attr.hasParameterOrArguments()) {
   2630     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   2631       << Attr.getName() << 0;
   2632     return;
   2633   }
   2634 
   2635   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) {
   2636     if (isa<CXXRecordDecl>(D)) {
   2637       D->addAttr(::new (S.Context) WeakAttr(Attr.getRange(), S.Context));
   2638       return;
   2639     }
   2640     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2641       << Attr.getName() << ExpectedVariableOrFunction;
   2642     return;
   2643   }
   2644 
   2645   NamedDecl *nd = cast<NamedDecl>(D);
   2646 
   2647   nd->addAttr(::new (S.Context)
   2648               WeakAttr(Attr.getRange(), S.Context,
   2649                        Attr.getAttributeSpellingListIndex()));
   2650 }
   2651 
   2652 static void handleWeakImportAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2653   // check the attribute arguments.
   2654   if (!checkAttributeNumArgs(S, Attr, 0))
   2655     return;
   2656 
   2657 
   2658   // weak_import only applies to variable & function declarations.
   2659   bool isDef = false;
   2660   if (!D->canBeWeakImported(isDef)) {
   2661     if (isDef)
   2662       S.Diag(Attr.getLoc(), diag::warn_attribute_invalid_on_definition)
   2663         << "weak_import";
   2664     else if (isa<ObjCPropertyDecl>(D) || isa<ObjCMethodDecl>(D) ||
   2665              (S.Context.getTargetInfo().getTriple().isOSDarwin() &&
   2666               (isa<ObjCInterfaceDecl>(D) || isa<EnumDecl>(D)))) {
   2667       // Nothing to warn about here.
   2668     } else
   2669       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2670         << Attr.getName() << ExpectedVariableOrFunction;
   2671 
   2672     return;
   2673   }
   2674 
   2675   D->addAttr(::new (S.Context)
   2676              WeakImportAttr(Attr.getRange(), S.Context,
   2677                             Attr.getAttributeSpellingListIndex()));
   2678 }
   2679 
   2680 // Handles reqd_work_group_size and work_group_size_hint.
   2681 static void handleWorkGroupSize(Sema &S, Decl *D,
   2682                                 const AttributeList &Attr) {
   2683   assert(Attr.getKind() == AttributeList::AT_ReqdWorkGroupSize
   2684       || Attr.getKind() == AttributeList::AT_WorkGroupSizeHint);
   2685 
   2686   // Attribute has 3 arguments.
   2687   if (!checkAttributeNumArgs(S, Attr, 3)) return;
   2688 
   2689   unsigned WGSize[3];
   2690   for (unsigned i = 0; i < 3; ++i) {
   2691     Expr *E = Attr.getArg(i);
   2692     llvm::APSInt ArgNum(32);
   2693     if (E->isTypeDependent() || E->isValueDependent() ||
   2694         !E->isIntegerConstantExpr(ArgNum, S.Context)) {
   2695       S.Diag(Attr.getLoc(), diag::err_attribute_argument_type)
   2696         << Attr.getName() << AANT_ArgumentIntegerConstant
   2697         << E->getSourceRange();
   2698       return;
   2699     }
   2700     WGSize[i] = (unsigned) ArgNum.getZExtValue();
   2701   }
   2702 
   2703   if (Attr.getKind() == AttributeList::AT_ReqdWorkGroupSize
   2704     && D->hasAttr<ReqdWorkGroupSizeAttr>()) {
   2705       ReqdWorkGroupSizeAttr *A = D->getAttr<ReqdWorkGroupSizeAttr>();
   2706       if (!(A->getXDim() == WGSize[0] &&
   2707             A->getYDim() == WGSize[1] &&
   2708             A->getZDim() == WGSize[2])) {
   2709         S.Diag(Attr.getLoc(), diag::warn_duplicate_attribute) <<
   2710           Attr.getName();
   2711       }
   2712   }
   2713 
   2714   if (Attr.getKind() == AttributeList::AT_WorkGroupSizeHint
   2715     && D->hasAttr<WorkGroupSizeHintAttr>()) {
   2716       WorkGroupSizeHintAttr *A = D->getAttr<WorkGroupSizeHintAttr>();
   2717       if (!(A->getXDim() == WGSize[0] &&
   2718             A->getYDim() == WGSize[1] &&
   2719             A->getZDim() == WGSize[2])) {
   2720         S.Diag(Attr.getLoc(), diag::warn_duplicate_attribute) <<
   2721           Attr.getName();
   2722       }
   2723   }
   2724 
   2725   if (Attr.getKind() == AttributeList::AT_ReqdWorkGroupSize)
   2726     D->addAttr(::new (S.Context)
   2727                  ReqdWorkGroupSizeAttr(Attr.getRange(), S.Context,
   2728                                        WGSize[0], WGSize[1], WGSize[2],
   2729                                        Attr.getAttributeSpellingListIndex()));
   2730   else
   2731     D->addAttr(::new (S.Context)
   2732                  WorkGroupSizeHintAttr(Attr.getRange(), S.Context,
   2733                                        WGSize[0], WGSize[1], WGSize[2],
   2734                                        Attr.getAttributeSpellingListIndex()));
   2735 }
   2736 
   2737 static void handleVecTypeHint(Sema &S, Decl *D, const AttributeList &Attr) {
   2738   assert(Attr.getKind() == AttributeList::AT_VecTypeHint);
   2739 
   2740   // Attribute has 1 argument.
   2741   if (!checkAttributeNumArgs(S, Attr, 1))
   2742     return;
   2743 
   2744   QualType ParmType = S.GetTypeFromParser(Attr.getTypeArg());
   2745 
   2746   if (!ParmType->isExtVectorType() && !ParmType->isFloatingType() &&
   2747       (ParmType->isBooleanType() ||
   2748        !ParmType->isIntegralType(S.getASTContext()))) {
   2749     S.Diag(Attr.getLoc(), diag::err_attribute_argument_vec_type_hint)
   2750         << ParmType;
   2751     return;
   2752   }
   2753 
   2754   if (Attr.getKind() == AttributeList::AT_VecTypeHint &&
   2755       D->hasAttr<VecTypeHintAttr>()) {
   2756     VecTypeHintAttr *A = D->getAttr<VecTypeHintAttr>();
   2757     if (A->getTypeHint() != ParmType) {
   2758       S.Diag(Attr.getLoc(), diag::warn_duplicate_attribute) << Attr.getName();
   2759       return;
   2760     }
   2761   }
   2762 
   2763   D->addAttr(::new (S.Context) VecTypeHintAttr(Attr.getLoc(), S.Context,
   2764                                                ParmType, Attr.getLoc()));
   2765 }
   2766 
   2767 static void handleEndianAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2768   if (!dyn_cast<VarDecl>(D))
   2769     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) << "endian"
   2770                                                                 << 9;
   2771   StringRef EndianType = Attr.getParameterName()->getName();
   2772   if (EndianType != "host" && EndianType != "device")
   2773     S.Diag(Attr.getLoc(), diag::warn_attribute_unknown_endian) << EndianType;
   2774 }
   2775 
   2776 SectionAttr *Sema::mergeSectionAttr(Decl *D, SourceRange Range,
   2777                                     StringRef Name,
   2778                                     unsigned AttrSpellingListIndex) {
   2779   if (SectionAttr *ExistingAttr = D->getAttr<SectionAttr>()) {
   2780     if (ExistingAttr->getName() == Name)
   2781       return NULL;
   2782     Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section);
   2783     Diag(Range.getBegin(), diag::note_previous_attribute);
   2784     return NULL;
   2785   }
   2786   return ::new (Context) SectionAttr(Range, Context, Name,
   2787                                      AttrSpellingListIndex);
   2788 }
   2789 
   2790 static void handleSectionAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2791   // Attribute has no arguments.
   2792   if (!checkAttributeNumArgs(S, Attr, 1))
   2793     return;
   2794 
   2795   // Make sure that there is a string literal as the sections's single
   2796   // argument.
   2797   Expr *ArgExpr = Attr.getArg(0);
   2798   StringLiteral *SE = dyn_cast<StringLiteral>(ArgExpr);
   2799   if (!SE) {
   2800     S.Diag(ArgExpr->getLocStart(), diag::err_attribute_argument_type)
   2801       << Attr.getName() << AANT_ArgumentString;
   2802     return;
   2803   }
   2804 
   2805   // If the target wants to validate the section specifier, make it happen.
   2806   std::string Error = S.Context.getTargetInfo().isValidSectionSpecifier(SE->getString());
   2807   if (!Error.empty()) {
   2808     S.Diag(SE->getLocStart(), diag::err_attribute_section_invalid_for_target)
   2809     << Error;
   2810     return;
   2811   }
   2812 
   2813   // This attribute cannot be applied to local variables.
   2814   if (isa<VarDecl>(D) && cast<VarDecl>(D)->hasLocalStorage()) {
   2815     S.Diag(SE->getLocStart(), diag::err_attribute_section_local_variable);
   2816     return;
   2817   }
   2818 
   2819   unsigned Index = Attr.getAttributeSpellingListIndex();
   2820   SectionAttr *NewAttr = S.mergeSectionAttr(D, Attr.getRange(),
   2821                                             SE->getString(), Index);
   2822   if (NewAttr)
   2823     D->addAttr(NewAttr);
   2824 }
   2825 
   2826 
   2827 static void handleNothrowAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2828   // check the attribute arguments.
   2829   if (Attr.hasParameterOrArguments()) {
   2830     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   2831       << Attr.getName() << 0;
   2832     return;
   2833   }
   2834 
   2835   if (NoThrowAttr *Existing = D->getAttr<NoThrowAttr>()) {
   2836     if (Existing->getLocation().isInvalid())
   2837       Existing->setRange(Attr.getRange());
   2838   } else {
   2839     D->addAttr(::new (S.Context)
   2840                NoThrowAttr(Attr.getRange(), S.Context,
   2841                            Attr.getAttributeSpellingListIndex()));
   2842   }
   2843 }
   2844 
   2845 static void handleConstAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2846   // check the attribute arguments.
   2847   if (Attr.hasParameterOrArguments()) {
   2848     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   2849       << Attr.getName() << 0;
   2850     return;
   2851   }
   2852 
   2853   if (ConstAttr *Existing = D->getAttr<ConstAttr>()) {
   2854    if (Existing->getLocation().isInvalid())
   2855      Existing->setRange(Attr.getRange());
   2856   } else {
   2857     D->addAttr(::new (S.Context)
   2858                ConstAttr(Attr.getRange(), S.Context,
   2859                          Attr.getAttributeSpellingListIndex() ));
   2860   }
   2861 }
   2862 
   2863 static void handlePureAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2864   // check the attribute arguments.
   2865   if (!checkAttributeNumArgs(S, Attr, 0))
   2866     return;
   2867 
   2868   D->addAttr(::new (S.Context)
   2869              PureAttr(Attr.getRange(), S.Context,
   2870                       Attr.getAttributeSpellingListIndex()));
   2871 }
   2872 
   2873 static void handleCleanupAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2874   if (!Attr.getParameterName()) {
   2875     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   2876       << Attr.getName() << 1;
   2877     return;
   2878   }
   2879 
   2880   if (Attr.getNumArgs() != 0) {
   2881     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   2882       << Attr.getName() << 1;
   2883     return;
   2884   }
   2885 
   2886   VarDecl *VD = dyn_cast<VarDecl>(D);
   2887 
   2888   if (!VD || !VD->hasLocalStorage()) {
   2889     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "cleanup";
   2890     return;
   2891   }
   2892 
   2893   // Look up the function
   2894   // FIXME: Lookup probably isn't looking in the right place
   2895   NamedDecl *CleanupDecl
   2896     = S.LookupSingleName(S.TUScope, Attr.getParameterName(),
   2897                          Attr.getParameterLoc(), Sema::LookupOrdinaryName);
   2898   if (!CleanupDecl) {
   2899     S.Diag(Attr.getParameterLoc(), diag::err_attribute_cleanup_arg_not_found) <<
   2900       Attr.getParameterName();
   2901     return;
   2902   }
   2903 
   2904   FunctionDecl *FD = dyn_cast<FunctionDecl>(CleanupDecl);
   2905   if (!FD) {
   2906     S.Diag(Attr.getParameterLoc(),
   2907            diag::err_attribute_cleanup_arg_not_function)
   2908       << Attr.getParameterName();
   2909     return;
   2910   }
   2911 
   2912   if (FD->getNumParams() != 1) {
   2913     S.Diag(Attr.getParameterLoc(),
   2914            diag::err_attribute_cleanup_func_must_take_one_arg)
   2915       << Attr.getParameterName();
   2916     return;
   2917   }
   2918 
   2919   // We're currently more strict than GCC about what function types we accept.
   2920   // If this ever proves to be a problem it should be easy to fix.
   2921   QualType Ty = S.Context.getPointerType(VD->getType());
   2922   QualType ParamTy = FD->getParamDecl(0)->getType();
   2923   if (S.CheckAssignmentConstraints(FD->getParamDecl(0)->getLocation(),
   2924                                    ParamTy, Ty) != Sema::Compatible) {
   2925     S.Diag(Attr.getParameterLoc(),
   2926            diag::err_attribute_cleanup_func_arg_incompatible_type) <<
   2927       Attr.getParameterName() << ParamTy << Ty;
   2928     return;
   2929   }
   2930 
   2931   D->addAttr(::new (S.Context)
   2932              CleanupAttr(Attr.getRange(), S.Context, FD,
   2933                          Attr.getAttributeSpellingListIndex()));
   2934   S.MarkFunctionReferenced(Attr.getParameterLoc(), FD);
   2935   S.DiagnoseUseOfDecl(FD, Attr.getParameterLoc());
   2936 }
   2937 
   2938 /// Handle __attribute__((format_arg((idx)))) attribute based on
   2939 /// http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
   2940 static void handleFormatArgAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2941   if (!checkAttributeNumArgs(S, Attr, 1))
   2942     return;
   2943 
   2944   if (!isFunctionOrMethod(D) || !hasFunctionProto(D)) {
   2945     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2946       << Attr.getName() << ExpectedFunction;
   2947     return;
   2948   }
   2949 
   2950   Expr *IdxExpr = Attr.getArg(0);
   2951   uint64_t ArgIdx;
   2952   if (!checkFunctionOrMethodArgumentIndex(S, D, Attr.getName()->getName(),
   2953                                           Attr.getLoc(), 1, IdxExpr, ArgIdx))
   2954     return;
   2955 
   2956   // make sure the format string is really a string
   2957   QualType Ty = getFunctionOrMethodArgType(D, ArgIdx);
   2958 
   2959   bool not_nsstring_type = !isNSStringType(Ty, S.Context);
   2960   if (not_nsstring_type &&
   2961       !isCFStringType(Ty, S.Context) &&
   2962       (!Ty->isPointerType() ||
   2963        !Ty->getAs<PointerType>()->getPointeeType()->isCharType())) {
   2964     // FIXME: Should highlight the actual expression that has the wrong type.
   2965     S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
   2966     << (not_nsstring_type ? "a string type" : "an NSString")
   2967        << IdxExpr->getSourceRange();
   2968     return;
   2969   }
   2970   Ty = getFunctionOrMethodResultType(D);
   2971   if (!isNSStringType(Ty, S.Context) &&
   2972       !isCFStringType(Ty, S.Context) &&
   2973       (!Ty->isPointerType() ||
   2974        !Ty->getAs<PointerType>()->getPointeeType()->isCharType())) {
   2975     // FIXME: Should highlight the actual expression that has the wrong type.
   2976     S.Diag(Attr.getLoc(), diag::err_format_attribute_result_not)
   2977     << (not_nsstring_type ? "string type" : "NSString")
   2978        << IdxExpr->getSourceRange();
   2979     return;
   2980   }
   2981 
   2982   // We cannot use the ArgIdx returned from checkFunctionOrMethodArgumentIndex
   2983   // because that has corrected for the implicit this parameter, and is zero-
   2984   // based.  The attribute expects what the user wrote explicitly.
   2985   llvm::APSInt Val;
   2986   IdxExpr->EvaluateAsInt(Val, S.Context);
   2987 
   2988   D->addAttr(::new (S.Context)
   2989              FormatArgAttr(Attr.getRange(), S.Context, Val.getZExtValue(),
   2990                            Attr.getAttributeSpellingListIndex()));
   2991 }
   2992 
   2993 enum FormatAttrKind {
   2994   CFStringFormat,
   2995   NSStringFormat,
   2996   StrftimeFormat,
   2997   SupportedFormat,
   2998   IgnoredFormat,
   2999   InvalidFormat
   3000 };
   3001 
   3002 /// getFormatAttrKind - Map from format attribute names to supported format
   3003 /// types.
   3004 static FormatAttrKind getFormatAttrKind(StringRef Format) {
   3005   return llvm::StringSwitch<FormatAttrKind>(Format)
   3006     // Check for formats that get handled specially.
   3007     .Case("NSString", NSStringFormat)
   3008     .Case("CFString", CFStringFormat)
   3009     .Case("strftime", StrftimeFormat)
   3010 
   3011     // Otherwise, check for supported formats.
   3012     .Cases("scanf", "printf", "printf0", "strfmon", SupportedFormat)
   3013     .Cases("cmn_err", "vcmn_err", "zcmn_err", SupportedFormat)
   3014     .Case("kprintf", SupportedFormat) // OpenBSD.
   3015 
   3016     .Cases("gcc_diag", "gcc_cdiag", "gcc_cxxdiag", "gcc_tdiag", IgnoredFormat)
   3017     .Default(InvalidFormat);
   3018 }
   3019 
   3020 /// Handle __attribute__((init_priority(priority))) attributes based on
   3021 /// http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
   3022 static void handleInitPriorityAttr(Sema &S, Decl *D,
   3023                                    const AttributeList &Attr) {
   3024   if (!S.getLangOpts().CPlusPlus) {
   3025     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
   3026     return;
   3027   }
   3028 
   3029   if (!isa<VarDecl>(D) || S.getCurFunctionOrMethodDecl()) {
   3030     S.Diag(Attr.getLoc(), diag::err_init_priority_object_attr);
   3031     Attr.setInvalid();
   3032     return;
   3033   }
   3034   QualType T = dyn_cast<VarDecl>(D)->getType();
   3035   if (S.Context.getAsArrayType(T))
   3036     T = S.Context.getBaseElementType(T);
   3037   if (!T->getAs<RecordType>()) {
   3038     S.Diag(Attr.getLoc(), diag::err_init_priority_object_attr);
   3039     Attr.setInvalid();
   3040     return;
   3041   }
   3042 
   3043   if (!checkAttributeNumArgs(S, Attr, 1)) {
   3044     Attr.setInvalid();
   3045     return;
   3046   }
   3047   Expr *priorityExpr = Attr.getArg(0);
   3048 
   3049   llvm::APSInt priority(32);
   3050   if (priorityExpr->isTypeDependent() || priorityExpr->isValueDependent() ||
   3051       !priorityExpr->isIntegerConstantExpr(priority, S.Context)) {
   3052     S.Diag(Attr.getLoc(), diag::err_attribute_argument_type)
   3053       << Attr.getName() << AANT_ArgumentIntegerConstant
   3054       << priorityExpr->getSourceRange();
   3055     Attr.setInvalid();
   3056     return;
   3057   }
   3058   unsigned prioritynum = priority.getZExtValue();
   3059   if (prioritynum < 101 || prioritynum > 65535) {
   3060     S.Diag(Attr.getLoc(), diag::err_attribute_argument_outof_range)
   3061     <<  priorityExpr->getSourceRange();
   3062     Attr.setInvalid();
   3063     return;
   3064   }
   3065   D->addAttr(::new (S.Context)
   3066              InitPriorityAttr(Attr.getRange(), S.Context, prioritynum,
   3067                               Attr.getAttributeSpellingListIndex()));
   3068 }
   3069 
   3070 FormatAttr *Sema::mergeFormatAttr(Decl *D, SourceRange Range, StringRef Format,
   3071                                   int FormatIdx, int FirstArg,
   3072                                   unsigned AttrSpellingListIndex) {
   3073   // Check whether we already have an equivalent format attribute.
   3074   for (specific_attr_iterator<FormatAttr>
   3075          i = D->specific_attr_begin<FormatAttr>(),
   3076          e = D->specific_attr_end<FormatAttr>();
   3077        i != e ; ++i) {
   3078     FormatAttr *f = *i;
   3079     if (f->getType() == Format &&
   3080         f->getFormatIdx() == FormatIdx &&
   3081         f->getFirstArg() == FirstArg) {
   3082       // If we don't have a valid location for this attribute, adopt the
   3083       // location.
   3084       if (f->getLocation().isInvalid())
   3085         f->setRange(Range);
   3086       return NULL;
   3087     }
   3088   }
   3089 
   3090   return ::new (Context) FormatAttr(Range, Context, Format, FormatIdx, FirstArg,
   3091                                     AttrSpellingListIndex);
   3092 }
   3093 
   3094 /// Handle __attribute__((format(type,idx,firstarg))) attributes based on
   3095 /// http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
   3096 static void handleFormatAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3097 
   3098   if (!Attr.getParameterName()) {
   3099     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   3100       << Attr.getName() << 1 << AANT_ArgumentString;
   3101     return;
   3102   }
   3103 
   3104   if (Attr.getNumArgs() != 2) {
   3105     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   3106       << Attr.getName() << 3;
   3107     return;
   3108   }
   3109 
   3110   if (!isFunctionOrMethodOrBlock(D) || !hasFunctionProto(D)) {
   3111     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3112       << Attr.getName() << ExpectedFunction;
   3113     return;
   3114   }
   3115 
   3116   // In C++ the implicit 'this' function parameter also counts, and they are
   3117   // counted from one.
   3118   bool HasImplicitThisParam = isInstanceMethod(D);
   3119   unsigned NumArgs  = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
   3120   unsigned FirstIdx = 1;
   3121 
   3122   StringRef Format = Attr.getParameterName()->getName();
   3123 
   3124   // Normalize the argument, __foo__ becomes foo.
   3125   if (Format.startswith("__") && Format.endswith("__"))
   3126     Format = Format.substr(2, Format.size() - 4);
   3127 
   3128   // Check for supported formats.
   3129   FormatAttrKind Kind = getFormatAttrKind(Format);
   3130 
   3131   if (Kind == IgnoredFormat)
   3132     return;
   3133 
   3134   if (Kind == InvalidFormat) {
   3135     S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
   3136       << "format" << Attr.getParameterName()->getName();
   3137     return;
   3138   }
   3139 
   3140   // checks for the 2nd argument
   3141   Expr *IdxExpr = Attr.getArg(0);
   3142   llvm::APSInt Idx(32);
   3143   if (IdxExpr->isTypeDependent() || IdxExpr->isValueDependent() ||
   3144       !IdxExpr->isIntegerConstantExpr(Idx, S.Context)) {
   3145     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   3146       << Attr.getName() << 2 << AANT_ArgumentIntegerConstant
   3147       << IdxExpr->getSourceRange();
   3148     return;
   3149   }
   3150 
   3151   if (Idx.getZExtValue() < FirstIdx || Idx.getZExtValue() > NumArgs) {
   3152     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
   3153       << "format" << 2 << IdxExpr->getSourceRange();
   3154     return;
   3155   }
   3156 
   3157   // FIXME: Do we need to bounds check?
   3158   unsigned ArgIdx = Idx.getZExtValue() - 1;
   3159 
   3160   if (HasImplicitThisParam) {
   3161     if (ArgIdx == 0) {
   3162       S.Diag(Attr.getLoc(),
   3163              diag::err_format_attribute_implicit_this_format_string)
   3164         << IdxExpr->getSourceRange();
   3165       return;
   3166     }
   3167     ArgIdx--;
   3168   }
   3169 
   3170   // make sure the format string is really a string
   3171   QualType Ty = getFunctionOrMethodArgType(D, ArgIdx);
   3172 
   3173   if (Kind == CFStringFormat) {
   3174     if (!isCFStringType(Ty, S.Context)) {
   3175       S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
   3176         << "a CFString" << IdxExpr->getSourceRange();
   3177       return;
   3178     }
   3179   } else if (Kind == NSStringFormat) {
   3180     // FIXME: do we need to check if the type is NSString*?  What are the
   3181     // semantics?
   3182     if (!isNSStringType(Ty, S.Context)) {
   3183       // FIXME: Should highlight the actual expression that has the wrong type.
   3184       S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
   3185         << "an NSString" << IdxExpr->getSourceRange();
   3186       return;
   3187     }
   3188   } else if (!Ty->isPointerType() ||
   3189              !Ty->getAs<PointerType>()->getPointeeType()->isCharType()) {
   3190     // FIXME: Should highlight the actual expression that has the wrong type.
   3191     S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
   3192       << "a string type" << IdxExpr->getSourceRange();
   3193     return;
   3194   }
   3195 
   3196   // check the 3rd argument
   3197   Expr *FirstArgExpr = Attr.getArg(1);
   3198   llvm::APSInt FirstArg(32);
   3199   if (FirstArgExpr->isTypeDependent() || FirstArgExpr->isValueDependent() ||
   3200       !FirstArgExpr->isIntegerConstantExpr(FirstArg, S.Context)) {
   3201     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   3202       << Attr.getName() << 3 << AANT_ArgumentIntegerConstant
   3203       << FirstArgExpr->getSourceRange();
   3204     return;
   3205   }
   3206 
   3207   // check if the function is variadic if the 3rd argument non-zero
   3208   if (FirstArg != 0) {
   3209     if (isFunctionOrMethodVariadic(D)) {
   3210       ++NumArgs; // +1 for ...
   3211     } else {
   3212       S.Diag(D->getLocation(), diag::err_format_attribute_requires_variadic);
   3213       return;
   3214     }
   3215   }
   3216 
   3217   // strftime requires FirstArg to be 0 because it doesn't read from any
   3218   // variable the input is just the current time + the format string.
   3219   if (Kind == StrftimeFormat) {
   3220     if (FirstArg != 0) {
   3221       S.Diag(Attr.getLoc(), diag::err_format_strftime_third_parameter)
   3222         << FirstArgExpr->getSourceRange();
   3223       return;
   3224     }
   3225   // if 0 it disables parameter checking (to use with e.g. va_list)
   3226   } else if (FirstArg != 0 && FirstArg != NumArgs) {
   3227     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
   3228       << "format" << 3 << FirstArgExpr->getSourceRange();
   3229     return;
   3230   }
   3231 
   3232   FormatAttr *NewAttr = S.mergeFormatAttr(D, Attr.getRange(), Format,
   3233                                           Idx.getZExtValue(),
   3234                                           FirstArg.getZExtValue(),
   3235                                           Attr.getAttributeSpellingListIndex());
   3236   if (NewAttr)
   3237     D->addAttr(NewAttr);
   3238 }
   3239 
   3240 static void handleTransparentUnionAttr(Sema &S, Decl *D,
   3241                                        const AttributeList &Attr) {
   3242   // check the attribute arguments.
   3243   if (!checkAttributeNumArgs(S, Attr, 0))
   3244     return;
   3245 
   3246 
   3247   // Try to find the underlying union declaration.
   3248   RecordDecl *RD = 0;
   3249   TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D);
   3250   if (TD && TD->getUnderlyingType()->isUnionType())
   3251     RD = TD->getUnderlyingType()->getAsUnionType()->getDecl();
   3252   else
   3253     RD = dyn_cast<RecordDecl>(D);
   3254 
   3255   if (!RD || !RD->isUnion()) {
   3256     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3257       << Attr.getName() << ExpectedUnion;
   3258     return;
   3259   }
   3260 
   3261   if (!RD->isCompleteDefinition()) {
   3262     S.Diag(Attr.getLoc(),
   3263         diag::warn_transparent_union_attribute_not_definition);
   3264     return;
   3265   }
   3266 
   3267   RecordDecl::field_iterator Field = RD->field_begin(),
   3268                           FieldEnd = RD->field_end();
   3269   if (Field == FieldEnd) {
   3270     S.Diag(Attr.getLoc(), diag::warn_transparent_union_attribute_zero_fields);
   3271     return;
   3272   }
   3273 
   3274   FieldDecl *FirstField = *Field;
   3275   QualType FirstType = FirstField->getType();
   3276   if (FirstType->hasFloatingRepresentation() || FirstType->isVectorType()) {
   3277     S.Diag(FirstField->getLocation(),
   3278            diag::warn_transparent_union_attribute_floating)
   3279       << FirstType->isVectorType() << FirstType;
   3280     return;
   3281   }
   3282 
   3283   uint64_t FirstSize = S.Context.getTypeSize(FirstType);
   3284   uint64_t FirstAlign = S.Context.getTypeAlign(FirstType);
   3285   for (; Field != FieldEnd; ++Field) {
   3286     QualType FieldType = Field->getType();
   3287     if (S.Context.getTypeSize(FieldType) != FirstSize ||
   3288         S.Context.getTypeAlign(FieldType) != FirstAlign) {
   3289       // Warn if we drop the attribute.
   3290       bool isSize = S.Context.getTypeSize(FieldType) != FirstSize;
   3291       unsigned FieldBits = isSize? S.Context.getTypeSize(FieldType)
   3292                                  : S.Context.getTypeAlign(FieldType);
   3293       S.Diag(Field->getLocation(),
   3294           diag::warn_transparent_union_attribute_field_size_align)
   3295         << isSize << Field->getDeclName() << FieldBits;
   3296       unsigned FirstBits = isSize? FirstSize : FirstAlign;
   3297       S.Diag(FirstField->getLocation(),
   3298              diag::note_transparent_union_first_field_size_align)
   3299         << isSize << FirstBits;
   3300       return;
   3301     }
   3302   }
   3303 
   3304   RD->addAttr(::new (S.Context)
   3305               TransparentUnionAttr(Attr.getRange(), S.Context,
   3306                                    Attr.getAttributeSpellingListIndex()));
   3307 }
   3308 
   3309 static void handleAnnotateAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3310   // check the attribute arguments.
   3311   if (!checkAttributeNumArgs(S, Attr, 1))
   3312     return;
   3313 
   3314   Expr *ArgExpr = Attr.getArg(0);
   3315   StringLiteral *SE = dyn_cast<StringLiteral>(ArgExpr);
   3316 
   3317   // Make sure that there is a string literal as the annotation's single
   3318   // argument.
   3319   if (!SE) {
   3320     S.Diag(ArgExpr->getLocStart(), diag::err_attribute_argument_type)
   3321       << Attr.getName() << AANT_ArgumentString;
   3322     return;
   3323   }
   3324 
   3325   // Don't duplicate annotations that are already set.
   3326   for (specific_attr_iterator<AnnotateAttr>
   3327        i = D->specific_attr_begin<AnnotateAttr>(),
   3328        e = D->specific_attr_end<AnnotateAttr>(); i != e; ++i) {
   3329       if ((*i)->getAnnotation() == SE->getString())
   3330           return;
   3331   }
   3332 
   3333   D->addAttr(::new (S.Context)
   3334              AnnotateAttr(Attr.getRange(), S.Context, SE->getString(),
   3335                           Attr.getAttributeSpellingListIndex()));
   3336 }
   3337 
   3338 static void handleAlignedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3339   // check the attribute arguments.
   3340   if (Attr.getNumArgs() > 1) {
   3341     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   3342       << Attr.getName() << 1;
   3343     return;
   3344   }
   3345 
   3346   if (Attr.getNumArgs() == 0) {
   3347     D->addAttr(::new (S.Context) AlignedAttr(Attr.getRange(), S.Context,
   3348                true, 0, Attr.getAttributeSpellingListIndex()));
   3349     return;
   3350   }
   3351 
   3352   Expr *E = Attr.getArg(0);
   3353   if (Attr.isPackExpansion() && !E->containsUnexpandedParameterPack()) {
   3354     S.Diag(Attr.getEllipsisLoc(),
   3355            diag::err_pack_expansion_without_parameter_packs);
   3356     return;
   3357   }
   3358 
   3359   if (!Attr.isPackExpansion() && S.DiagnoseUnexpandedParameterPack(E))
   3360     return;
   3361 
   3362   S.AddAlignedAttr(Attr.getRange(), D, E, Attr.getAttributeSpellingListIndex(),
   3363                    Attr.isPackExpansion());
   3364 }
   3365 
   3366 void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, Expr *E,
   3367                           unsigned SpellingListIndex, bool IsPackExpansion) {
   3368   AlignedAttr TmpAttr(AttrRange, Context, true, E, SpellingListIndex);
   3369   SourceLocation AttrLoc = AttrRange.getBegin();
   3370 
   3371   // C++11 alignas(...) and C11 _Alignas(...) have additional requirements.
   3372   if (TmpAttr.isAlignas()) {
   3373     // C++11 [dcl.align]p1:
   3374     //   An alignment-specifier may be applied to a variable or to a class
   3375     //   data member, but it shall not be applied to a bit-field, a function
   3376     //   parameter, the formal parameter of a catch clause, or a variable
   3377     //   declared with the register storage class specifier. An
   3378     //   alignment-specifier may also be applied to the declaration of a class
   3379     //   or enumeration type.
   3380     // C11 6.7.5/2:
   3381     //   An alignment attribute shall not be specified in a declaration of
   3382     //   a typedef, or a bit-field, or a function, or a parameter, or an
   3383     //   object declared with the register storage-class specifier.
   3384     int DiagKind = -1;
   3385     if (isa<ParmVarDecl>(D)) {
   3386       DiagKind = 0;
   3387     } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
   3388       if (VD->getStorageClass() == SC_Register)
   3389         DiagKind = 1;
   3390       if (VD->isExceptionVariable())
   3391         DiagKind = 2;
   3392     } else if (FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
   3393       if (FD->isBitField())
   3394         DiagKind = 3;
   3395     } else if (!isa<TagDecl>(D)) {
   3396       Diag(AttrLoc, diag::err_attribute_wrong_decl_type)
   3397         << (TmpAttr.isC11() ? "'_Alignas'" : "'alignas'")
   3398         << (TmpAttr.isC11() ? ExpectedVariableOrField
   3399                             : ExpectedVariableFieldOrTag);
   3400       return;
   3401     }
   3402     if (DiagKind != -1) {
   3403       Diag(AttrLoc, diag::err_alignas_attribute_wrong_decl_type)
   3404         << TmpAttr.isC11() << DiagKind;
   3405       return;
   3406     }
   3407   }
   3408 
   3409   if (E->isTypeDependent() || E->isValueDependent()) {
   3410     // Save dependent expressions in the AST to be instantiated.
   3411     AlignedAttr *AA = ::new (Context) AlignedAttr(TmpAttr);
   3412     AA->setPackExpansion(IsPackExpansion);
   3413     D->addAttr(AA);
   3414     return;
   3415   }
   3416 
   3417   // FIXME: Cache the number on the Attr object?
   3418   llvm::APSInt Alignment(32);
   3419   ExprResult ICE
   3420     = VerifyIntegerConstantExpression(E, &Alignment,
   3421         diag::err_aligned_attribute_argument_not_int,
   3422         /*AllowFold*/ false);
   3423   if (ICE.isInvalid())
   3424     return;
   3425 
   3426   // C++11 [dcl.align]p2:
   3427   //   -- if the constant expression evaluates to zero, the alignment
   3428   //      specifier shall have no effect
   3429   // C11 6.7.5p6:
   3430   //   An alignment specification of zero has no effect.
   3431   if (!(TmpAttr.isAlignas() && !Alignment) &&
   3432       !llvm::isPowerOf2_64(Alignment.getZExtValue())) {
   3433     Diag(AttrLoc, diag::err_attribute_aligned_not_power_of_two)
   3434       << E->getSourceRange();
   3435     return;
   3436   }
   3437 
   3438   if (TmpAttr.isDeclspec()) {
   3439     // We've already verified it's a power of 2, now let's make sure it's
   3440     // 8192 or less.
   3441     if (Alignment.getZExtValue() > 8192) {
   3442       Diag(AttrLoc, diag::err_attribute_aligned_greater_than_8192)
   3443         << E->getSourceRange();
   3444       return;
   3445     }
   3446   }
   3447 
   3448   AlignedAttr *AA = ::new (Context) AlignedAttr(AttrRange, Context, true,
   3449                                                 ICE.take(), SpellingListIndex);
   3450   AA->setPackExpansion(IsPackExpansion);
   3451   D->addAttr(AA);
   3452 }
   3453 
   3454 void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, TypeSourceInfo *TS,
   3455                           unsigned SpellingListIndex, bool IsPackExpansion) {
   3456   // FIXME: Cache the number on the Attr object if non-dependent?
   3457   // FIXME: Perform checking of type validity
   3458   AlignedAttr *AA = ::new (Context) AlignedAttr(AttrRange, Context, false, TS,
   3459                                                 SpellingListIndex);
   3460   AA->setPackExpansion(IsPackExpansion);
   3461   D->addAttr(AA);
   3462 }
   3463 
   3464 void Sema::CheckAlignasUnderalignment(Decl *D) {
   3465   assert(D->hasAttrs() && "no attributes on decl");
   3466 
   3467   QualType Ty;
   3468   if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
   3469     Ty = VD->getType();
   3470   else
   3471     Ty = Context.getTagDeclType(cast<TagDecl>(D));
   3472   if (Ty->isDependentType() || Ty->isIncompleteType())
   3473     return;
   3474 
   3475   // C++11 [dcl.align]p5, C11 6.7.5/4:
   3476   //   The combined effect of all alignment attributes in a declaration shall
   3477   //   not specify an alignment that is less strict than the alignment that
   3478   //   would otherwise be required for the entity being declared.
   3479   AlignedAttr *AlignasAttr = 0;
   3480   unsigned Align = 0;
   3481   for (specific_attr_iterator<AlignedAttr>
   3482          I = D->specific_attr_begin<AlignedAttr>(),
   3483          E = D->specific_attr_end<AlignedAttr>(); I != E; ++I) {
   3484     if (I->isAlignmentDependent())
   3485       return;
   3486     if (I->isAlignas())
   3487       AlignasAttr = *I;
   3488     Align = std::max(Align, I->getAlignment(Context));
   3489   }
   3490 
   3491   if (AlignasAttr && Align) {
   3492     CharUnits RequestedAlign = Context.toCharUnitsFromBits(Align);
   3493     CharUnits NaturalAlign = Context.getTypeAlignInChars(Ty);
   3494     if (NaturalAlign > RequestedAlign)
   3495       Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
   3496         << Ty << (unsigned)NaturalAlign.getQuantity();
   3497   }
   3498 }
   3499 
   3500 /// handleModeAttr - This attribute modifies the width of a decl with primitive
   3501 /// type.
   3502 ///
   3503 /// Despite what would be logical, the mode attribute is a decl attribute, not a
   3504 /// type attribute: 'int ** __attribute((mode(HI))) *G;' tries to make 'G' be
   3505 /// HImode, not an intermediate pointer.
   3506 static void handleModeAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3507   // This attribute isn't documented, but glibc uses it.  It changes
   3508   // the width of an int or unsigned int to the specified size.
   3509 
   3510   // Check that there aren't any arguments
   3511   if (!checkAttributeNumArgs(S, Attr, 0))
   3512     return;
   3513 
   3514 
   3515   IdentifierInfo *Name = Attr.getParameterName();
   3516   if (!Name) {
   3517     S.Diag(Attr.getLoc(), diag::err_attribute_argument_type) << Attr.getName()
   3518       << AANT_ArgumentIdentifier;
   3519     return;
   3520   }
   3521 
   3522   StringRef Str = Attr.getParameterName()->getName();
   3523 
   3524   // Normalize the attribute name, __foo__ becomes foo.
   3525   if (Str.startswith("__") && Str.endswith("__"))
   3526     Str = Str.substr(2, Str.size() - 4);
   3527 
   3528   unsigned DestWidth = 0;
   3529   bool IntegerMode = true;
   3530   bool ComplexMode = false;
   3531   switch (Str.size()) {
   3532   case 2:
   3533     switch (Str[0]) {
   3534     case 'Q': DestWidth = 8; break;
   3535     case 'H': DestWidth = 16; break;
   3536     case 'S': DestWidth = 32; break;
   3537     case 'D': DestWidth = 64; break;
   3538     case 'X': DestWidth = 96; break;
   3539     case 'T': DestWidth = 128; break;
   3540     }
   3541     if (Str[1] == 'F') {
   3542       IntegerMode = false;
   3543     } else if (Str[1] == 'C') {
   3544       IntegerMode = false;
   3545       ComplexMode = true;
   3546     } else if (Str[1] != 'I') {
   3547       DestWidth = 0;
   3548     }
   3549     break;
   3550   case 4:
   3551     // FIXME: glibc uses 'word' to define register_t; this is narrower than a
   3552     // pointer on PIC16 and other embedded platforms.
   3553     if (Str == "word")
   3554       DestWidth = S.Context.getTargetInfo().getPointerWidth(0);
   3555     else if (Str == "byte")
   3556       DestWidth = S.Context.getTargetInfo().getCharWidth();
   3557     break;
   3558   case 7:
   3559     if (Str == "pointer")
   3560       DestWidth = S.Context.getTargetInfo().getPointerWidth(0);
   3561     break;
   3562   case 11:
   3563     if (Str == "unwind_word")
   3564       DestWidth = S.Context.getTargetInfo().getUnwindWordWidth();
   3565     break;
   3566   }
   3567 
   3568   QualType OldTy;
   3569   if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D))
   3570     OldTy = TD->getUnderlyingType();
   3571   else if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
   3572     OldTy = VD->getType();
   3573   else {
   3574     S.Diag(D->getLocation(), diag::err_attr_wrong_decl)
   3575       << "mode" << Attr.getRange();
   3576     return;
   3577   }
   3578 
   3579   if (!OldTy->getAs<BuiltinType>() && !OldTy->isComplexType())
   3580     S.Diag(Attr.getLoc(), diag::err_mode_not_primitive);
   3581   else if (IntegerMode) {
   3582     if (!OldTy->isIntegralOrEnumerationType())
   3583       S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
   3584   } else if (ComplexMode) {
   3585     if (!OldTy->isComplexType())
   3586       S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
   3587   } else {
   3588     if (!OldTy->isFloatingType())
   3589       S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
   3590   }
   3591 
   3592   // FIXME: Sync this with InitializePredefinedMacros; we need to match int8_t
   3593   // and friends, at least with glibc.
   3594   // FIXME: Make sure 32/64-bit integers don't get defined to types of the wrong
   3595   // width on unusual platforms.
   3596   // FIXME: Make sure floating-point mappings are accurate
   3597   // FIXME: Support XF and TF types
   3598   QualType NewTy;
   3599   switch (DestWidth) {
   3600   case 0:
   3601     S.Diag(Attr.getLoc(), diag::err_unknown_machine_mode) << Name;
   3602     return;
   3603   default:
   3604     S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
   3605     return;
   3606   case 8:
   3607     if (!IntegerMode) {
   3608       S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
   3609       return;
   3610     }
   3611     if (OldTy->isSignedIntegerType())
   3612       NewTy = S.Context.SignedCharTy;
   3613     else
   3614       NewTy = S.Context.UnsignedCharTy;
   3615     break;
   3616   case 16:
   3617     if (!IntegerMode) {
   3618       S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
   3619       return;
   3620     }
   3621     if (OldTy->isSignedIntegerType())
   3622       NewTy = S.Context.ShortTy;
   3623     else
   3624       NewTy = S.Context.UnsignedShortTy;
   3625     break;
   3626   case 32:
   3627     if (!IntegerMode)
   3628       NewTy = S.Context.FloatTy;
   3629     else if (OldTy->isSignedIntegerType())
   3630       NewTy = S.Context.IntTy;
   3631     else
   3632       NewTy = S.Context.UnsignedIntTy;
   3633     break;
   3634   case 64:
   3635     if (!IntegerMode)
   3636       NewTy = S.Context.DoubleTy;
   3637     else if (OldTy->isSignedIntegerType())
   3638       if (S.Context.getTargetInfo().getLongWidth() == 64)
   3639         NewTy = S.Context.LongTy;
   3640       else
   3641         NewTy = S.Context.LongLongTy;
   3642     else
   3643       if (S.Context.getTargetInfo().getLongWidth() == 64)
   3644         NewTy = S.Context.UnsignedLongTy;
   3645       else
   3646         NewTy = S.Context.UnsignedLongLongTy;
   3647     break;
   3648   case 96:
   3649     NewTy = S.Context.LongDoubleTy;
   3650     break;
   3651   case 128:
   3652     if (!IntegerMode && &S.Context.getTargetInfo().getLongDoubleFormat() !=
   3653         &llvm::APFloat::PPCDoubleDouble) {
   3654       S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
   3655       return;
   3656     }
   3657     if (IntegerMode) {
   3658       if (OldTy->isSignedIntegerType())
   3659         NewTy = S.Context.Int128Ty;
   3660       else
   3661         NewTy = S.Context.UnsignedInt128Ty;
   3662     } else
   3663       NewTy = S.Context.LongDoubleTy;
   3664     break;
   3665   }
   3666 
   3667   if (ComplexMode) {
   3668     NewTy = S.Context.getComplexType(NewTy);
   3669   }
   3670 
   3671   // Install the new type.
   3672   if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D))
   3673     TD->setModedTypeSourceInfo(TD->getTypeSourceInfo(), NewTy);
   3674   else
   3675     cast<ValueDecl>(D)->setType(NewTy);
   3676 
   3677   D->addAttr(::new (S.Context)
   3678              ModeAttr(Attr.getRange(), S.Context, Name,
   3679                       Attr.getAttributeSpellingListIndex()));
   3680 }
   3681 
   3682 static void handleNoDebugAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3683   // check the attribute arguments.
   3684   if (!checkAttributeNumArgs(S, Attr, 0))
   3685     return;
   3686 
   3687   if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
   3688     if (!VD->hasGlobalStorage())
   3689       S.Diag(Attr.getLoc(),
   3690              diag::warn_attribute_requires_functions_or_static_globals)
   3691         << Attr.getName();
   3692   } else if (!isFunctionOrMethod(D)) {
   3693     S.Diag(Attr.getLoc(),
   3694            diag::warn_attribute_requires_functions_or_static_globals)
   3695       << Attr.getName();
   3696     return;
   3697   }
   3698 
   3699   D->addAttr(::new (S.Context)
   3700              NoDebugAttr(Attr.getRange(), S.Context,
   3701                          Attr.getAttributeSpellingListIndex()));
   3702 }
   3703 
   3704 static void handleNoInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3705   // check the attribute arguments.
   3706   if (!checkAttributeNumArgs(S, Attr, 0))
   3707     return;
   3708 
   3709 
   3710   if (!isa<FunctionDecl>(D)) {
   3711     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3712       << Attr.getName() << ExpectedFunction;
   3713     return;
   3714   }
   3715 
   3716   D->addAttr(::new (S.Context)
   3717              NoInlineAttr(Attr.getRange(), S.Context,
   3718              Attr.getAttributeSpellingListIndex()));
   3719 }
   3720 
   3721 static void handleNoInstrumentFunctionAttr(Sema &S, Decl *D,
   3722                                            const AttributeList &Attr) {
   3723   // check the attribute arguments.
   3724   if (!checkAttributeNumArgs(S, Attr, 0))
   3725     return;
   3726 
   3727 
   3728   if (!isa<FunctionDecl>(D)) {
   3729     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3730       << Attr.getName() << ExpectedFunction;
   3731     return;
   3732   }
   3733 
   3734   D->addAttr(::new (S.Context)
   3735              NoInstrumentFunctionAttr(Attr.getRange(), S.Context,
   3736                                       Attr.getAttributeSpellingListIndex()));
   3737 }
   3738 
   3739 static void handleKernelAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3740   if (S.LangOpts.Renderscript) {
   3741     D->addAttr(::new (S.Context) KernelAttr(Attr.getRange(), S.Context));
   3742   } else {
   3743     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "kernel";
   3744   }
   3745 }
   3746 
   3747 static void handleConstantAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3748   if (S.LangOpts.CUDA) {
   3749     // check the attribute arguments.
   3750     if (Attr.hasParameterOrArguments()) {
   3751       S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   3752         << Attr.getName() << 0;
   3753       return;
   3754     }
   3755 
   3756     if (!isa<VarDecl>(D)) {
   3757       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3758         << Attr.getName() << ExpectedVariable;
   3759       return;
   3760     }
   3761 
   3762     D->addAttr(::new (S.Context)
   3763                CUDAConstantAttr(Attr.getRange(), S.Context,
   3764                                 Attr.getAttributeSpellingListIndex()));
   3765   } else {
   3766     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "constant";
   3767   }
   3768 }
   3769 
   3770 static void handleDeviceAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3771   if (S.LangOpts.CUDA) {
   3772     // check the attribute arguments.
   3773     if (Attr.getNumArgs() != 0) {
   3774       S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   3775         << Attr.getName() << 0;
   3776       return;
   3777     }
   3778 
   3779     if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D)) {
   3780       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3781         << Attr.getName() << ExpectedVariableOrFunction;
   3782       return;
   3783     }
   3784 
   3785     D->addAttr(::new (S.Context)
   3786                CUDADeviceAttr(Attr.getRange(), S.Context,
   3787                               Attr.getAttributeSpellingListIndex()));
   3788   } else {
   3789     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "device";
   3790   }
   3791 }
   3792 
   3793 static void handleGlobalAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3794   if (S.LangOpts.CUDA) {
   3795     // check the attribute arguments.
   3796     if (!checkAttributeNumArgs(S, Attr, 0))
   3797       return;
   3798 
   3799     if (!isa<FunctionDecl>(D)) {
   3800       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3801         << Attr.getName() << ExpectedFunction;
   3802       return;
   3803     }
   3804 
   3805     FunctionDecl *FD = cast<FunctionDecl>(D);
   3806     if (!FD->getResultType()->isVoidType()) {
   3807       TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc().IgnoreParens();
   3808       if (FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>()) {
   3809         S.Diag(FD->getTypeSpecStartLoc(), diag::err_kern_type_not_void_return)
   3810           << FD->getType()
   3811           << FixItHint::CreateReplacement(FTL.getResultLoc().getSourceRange(),
   3812                                           "void");
   3813       } else {
   3814         S.Diag(FD->getTypeSpecStartLoc(), diag::err_kern_type_not_void_return)
   3815           << FD->getType();
   3816       }
   3817       return;
   3818     }
   3819 
   3820     D->addAttr(::new (S.Context)
   3821                CUDAGlobalAttr(Attr.getRange(), S.Context,
   3822                               Attr.getAttributeSpellingListIndex()));
   3823   } else {
   3824     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "global";
   3825   }
   3826 }
   3827 
   3828 static void handleHostAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3829   if (S.LangOpts.CUDA) {
   3830     // check the attribute arguments.
   3831     if (!checkAttributeNumArgs(S, Attr, 0))
   3832       return;
   3833 
   3834 
   3835     if (!isa<FunctionDecl>(D)) {
   3836       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3837         << Attr.getName() << ExpectedFunction;
   3838       return;
   3839     }
   3840 
   3841     D->addAttr(::new (S.Context)
   3842                CUDAHostAttr(Attr.getRange(), S.Context,
   3843                             Attr.getAttributeSpellingListIndex()));
   3844   } else {
   3845     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "host";
   3846   }
   3847 }
   3848 
   3849 static void handleSharedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3850   if (S.LangOpts.CUDA) {
   3851     // check the attribute arguments.
   3852     if (!checkAttributeNumArgs(S, Attr, 0))
   3853       return;
   3854 
   3855     if (!isa<VarDecl>(D)) {
   3856       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3857         << Attr.getName() << ExpectedVariable;
   3858       return;
   3859     }
   3860 
   3861     D->addAttr(::new (S.Context)
   3862                CUDASharedAttr(Attr.getRange(), S.Context,
   3863                               Attr.getAttributeSpellingListIndex()));
   3864   } else {
   3865     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "shared";
   3866   }
   3867 }
   3868 
   3869 static void handleGNUInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3870   // check the attribute arguments.
   3871   if (!checkAttributeNumArgs(S, Attr, 0))
   3872     return;
   3873 
   3874   FunctionDecl *Fn = dyn_cast<FunctionDecl>(D);
   3875   if (Fn == 0) {
   3876     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3877       << Attr.getName() << ExpectedFunction;
   3878     return;
   3879   }
   3880 
   3881   if (!Fn->isInlineSpecified()) {
   3882     S.Diag(Attr.getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
   3883     return;
   3884   }
   3885 
   3886   D->addAttr(::new (S.Context)
   3887              GNUInlineAttr(Attr.getRange(), S.Context,
   3888                            Attr.getAttributeSpellingListIndex()));
   3889 }
   3890 
   3891 static void handleCallConvAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3892   if (hasDeclarator(D)) return;
   3893 
   3894   const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
   3895   // Diagnostic is emitted elsewhere: here we store the (valid) Attr
   3896   // in the Decl node for syntactic reasoning, e.g., pretty-printing.
   3897   CallingConv CC;
   3898   if (S.CheckCallingConvAttr(Attr, CC, FD))
   3899     return;
   3900 
   3901   if (!isa<ObjCMethodDecl>(D)) {
   3902     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3903       << Attr.getName() << ExpectedFunctionOrMethod;
   3904     return;
   3905   }
   3906 
   3907   switch (Attr.getKind()) {
   3908   case AttributeList::AT_FastCall:
   3909     D->addAttr(::new (S.Context)
   3910                FastCallAttr(Attr.getRange(), S.Context,
   3911                             Attr.getAttributeSpellingListIndex()));
   3912     return;
   3913   case AttributeList::AT_StdCall:
   3914     D->addAttr(::new (S.Context)
   3915                StdCallAttr(Attr.getRange(), S.Context,
   3916                            Attr.getAttributeSpellingListIndex()));
   3917     return;
   3918   case AttributeList::AT_ThisCall:
   3919     D->addAttr(::new (S.Context)
   3920                ThisCallAttr(Attr.getRange(), S.Context,
   3921                             Attr.getAttributeSpellingListIndex()));
   3922     return;
   3923   case AttributeList::AT_CDecl:
   3924     D->addAttr(::new (S.Context)
   3925                CDeclAttr(Attr.getRange(), S.Context,
   3926                          Attr.getAttributeSpellingListIndex()));
   3927     return;
   3928   case AttributeList::AT_Pascal:
   3929     D->addAttr(::new (S.Context)
   3930                PascalAttr(Attr.getRange(), S.Context,
   3931                           Attr.getAttributeSpellingListIndex()));
   3932     return;
   3933   case AttributeList::AT_Pcs: {
   3934     PcsAttr::PCSType PCS;
   3935     switch (CC) {
   3936     case CC_AAPCS:
   3937       PCS = PcsAttr::AAPCS;
   3938       break;
   3939     case CC_AAPCS_VFP:
   3940       PCS = PcsAttr::AAPCS_VFP;
   3941       break;
   3942     default:
   3943       llvm_unreachable("unexpected calling convention in pcs attribute");
   3944     }
   3945 
   3946     D->addAttr(::new (S.Context)
   3947                PcsAttr(Attr.getRange(), S.Context, PCS,
   3948                        Attr.getAttributeSpellingListIndex()));
   3949     return;
   3950   }
   3951   case AttributeList::AT_PnaclCall:
   3952     D->addAttr(::new (S.Context)
   3953                PnaclCallAttr(Attr.getRange(), S.Context,
   3954                              Attr.getAttributeSpellingListIndex()));
   3955     return;
   3956   case AttributeList::AT_IntelOclBicc:
   3957     D->addAttr(::new (S.Context)
   3958                IntelOclBiccAttr(Attr.getRange(), S.Context,
   3959                                 Attr.getAttributeSpellingListIndex()));
   3960     return;
   3961 
   3962   default:
   3963     llvm_unreachable("unexpected attribute kind");
   3964   }
   3965 }
   3966 
   3967 static void handleOpenCLKernelAttr(Sema &S, Decl *D, const AttributeList &Attr){
   3968   assert(!Attr.isInvalid());
   3969   D->addAttr(::new (S.Context) OpenCLKernelAttr(Attr.getRange(), S.Context));
   3970 }
   3971 
   3972 static void handleOpenCLImageAccessAttr(Sema &S, Decl *D, const AttributeList &Attr){
   3973   assert(!Attr.isInvalid());
   3974 
   3975   Expr *E = Attr.getArg(0);
   3976   llvm::APSInt ArgNum(32);
   3977   if (E->isTypeDependent() || E->isValueDependent() ||
   3978       !E->isIntegerConstantExpr(ArgNum, S.Context)) {
   3979     S.Diag(Attr.getLoc(), diag::err_attribute_argument_type)
   3980       << Attr.getName() << AANT_ArgumentIntegerConstant
   3981       << E->getSourceRange();
   3982     return;
   3983   }
   3984 
   3985   D->addAttr(::new (S.Context) OpenCLImageAccessAttr(
   3986     Attr.getRange(), S.Context, ArgNum.getZExtValue()));
   3987 }
   3988 
   3989 bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC,
   3990                                 const FunctionDecl *FD) {
   3991   if (attr.isInvalid())
   3992     return true;
   3993 
   3994   unsigned ReqArgs = attr.getKind() == AttributeList::AT_Pcs ? 1 : 0;
   3995   if (attr.getNumArgs() != ReqArgs || attr.getParameterName()) {
   3996     Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   3997       << attr.getName() << ReqArgs;
   3998     attr.setInvalid();
   3999     return true;
   4000   }
   4001 
   4002   // TODO: diagnose uses of these conventions on the wrong target. Or, better
   4003   // move to TargetAttributesSema one day.
   4004   switch (attr.getKind()) {
   4005   case AttributeList::AT_CDecl: CC = CC_C; break;
   4006   case AttributeList::AT_FastCall: CC = CC_X86FastCall; break;
   4007   case AttributeList::AT_StdCall: CC = CC_X86StdCall; break;
   4008   case AttributeList::AT_ThisCall: CC = CC_X86ThisCall; break;
   4009   case AttributeList::AT_Pascal: CC = CC_X86Pascal; break;
   4010   case AttributeList::AT_Pcs: {
   4011     Expr *Arg = attr.getArg(0);
   4012     StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   4013     if (!Str || !Str->isAscii()) {
   4014       Diag(attr.getLoc(), diag::err_attribute_argument_type) << attr.getName()
   4015         << AANT_ArgumentString;
   4016       attr.setInvalid();
   4017       return true;
   4018     }
   4019 
   4020     StringRef StrRef = Str->getString();
   4021     if (StrRef == "aapcs") {
   4022       CC = CC_AAPCS;
   4023       break;
   4024     } else if (StrRef == "aapcs-vfp") {
   4025       CC = CC_AAPCS_VFP;
   4026       break;
   4027     }
   4028 
   4029     attr.setInvalid();
   4030     Diag(attr.getLoc(), diag::err_invalid_pcs);
   4031     return true;
   4032   }
   4033   case AttributeList::AT_PnaclCall: CC = CC_PnaclCall; break;
   4034   case AttributeList::AT_IntelOclBicc: CC = CC_IntelOclBicc; break;
   4035   default: llvm_unreachable("unexpected attribute kind");
   4036   }
   4037 
   4038   const TargetInfo &TI = Context.getTargetInfo();
   4039   TargetInfo::CallingConvCheckResult A = TI.checkCallingConvention(CC);
   4040   if (A == TargetInfo::CCCR_Warning) {
   4041     Diag(attr.getLoc(), diag::warn_cconv_ignored) << attr.getName();
   4042 
   4043     TargetInfo::CallingConvMethodType MT = TargetInfo::CCMT_Unknown;
   4044     if (FD)
   4045       MT = FD->isCXXInstanceMember() ? TargetInfo::CCMT_Member :
   4046                                     TargetInfo::CCMT_NonMember;
   4047     CC = TI.getDefaultCallingConv(MT);
   4048   }
   4049 
   4050   return false;
   4051 }
   4052 
   4053 static void handleRegparmAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   4054   if (hasDeclarator(D)) return;
   4055 
   4056   unsigned numParams;
   4057   if (S.CheckRegparmAttr(Attr, numParams))
   4058     return;
   4059 
   4060   if (!isa<ObjCMethodDecl>(D)) {
   4061     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   4062       << Attr.getName() << ExpectedFunctionOrMethod;
   4063     return;
   4064   }
   4065 
   4066   D->addAttr(::new (S.Context)
   4067              RegparmAttr(Attr.getRange(), S.Context, numParams,
   4068                          Attr.getAttributeSpellingListIndex()));
   4069 }
   4070 
   4071 /// Checks a regparm attribute, returning true if it is ill-formed and
   4072 /// otherwise setting numParams to the appropriate value.
   4073 bool Sema::CheckRegparmAttr(const AttributeList &Attr, unsigned &numParams) {
   4074   if (Attr.isInvalid())
   4075     return true;
   4076 
   4077   if (!checkAttributeNumArgs(*this, Attr, 1)) {
   4078     Attr.setInvalid();
   4079     return true;
   4080   }
   4081 
   4082   Expr *NumParamsExpr = Attr.getArg(0);
   4083   llvm::APSInt NumParams(32);
   4084   if (NumParamsExpr->isTypeDependent() || NumParamsExpr->isValueDependent() ||
   4085       !NumParamsExpr->isIntegerConstantExpr(NumParams, Context)) {
   4086     Diag(Attr.getLoc(), diag::err_attribute_argument_type)
   4087       << Attr.getName() << AANT_ArgumentIntegerConstant
   4088       << NumParamsExpr->getSourceRange();
   4089     Attr.setInvalid();
   4090     return true;
   4091   }
   4092 
   4093   if (Context.getTargetInfo().getRegParmMax() == 0) {
   4094     Diag(Attr.getLoc(), diag::err_attribute_regparm_wrong_platform)
   4095       << NumParamsExpr->getSourceRange();
   4096     Attr.setInvalid();
   4097     return true;
   4098   }
   4099 
   4100   numParams = NumParams.getZExtValue();
   4101   if (numParams > Context.getTargetInfo().getRegParmMax()) {
   4102     Diag(Attr.getLoc(), diag::err_attribute_regparm_invalid_number)
   4103       << Context.getTargetInfo().getRegParmMax() << NumParamsExpr->getSourceRange();
   4104     Attr.setInvalid();
   4105     return true;
   4106   }
   4107 
   4108   return false;
   4109 }
   4110 
   4111 static void handleLaunchBoundsAttr(Sema &S, Decl *D, const AttributeList &Attr){
   4112   if (S.LangOpts.CUDA) {
   4113     // check the attribute arguments.
   4114     if (Attr.getNumArgs() != 1 && Attr.getNumArgs() != 2) {
   4115       // FIXME: 0 is not okay.
   4116       S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 2;
   4117       return;
   4118     }
   4119 
   4120     if (!isFunctionOrMethod(D)) {
   4121       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   4122         << Attr.getName() << ExpectedFunctionOrMethod;
   4123       return;
   4124     }
   4125 
   4126     Expr *MaxThreadsExpr = Attr.getArg(0);
   4127     llvm::APSInt MaxThreads(32);
   4128     if (MaxThreadsExpr->isTypeDependent() ||
   4129         MaxThreadsExpr->isValueDependent() ||
   4130         !MaxThreadsExpr->isIntegerConstantExpr(MaxThreads, S.Context)) {
   4131       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   4132         << Attr.getName() << 1 << AANT_ArgumentIntegerConstant
   4133         << MaxThreadsExpr->getSourceRange();
   4134       return;
   4135     }
   4136 
   4137     llvm::APSInt MinBlocks(32);
   4138     if (Attr.getNumArgs() > 1) {
   4139       Expr *MinBlocksExpr = Attr.getArg(1);
   4140       if (MinBlocksExpr->isTypeDependent() ||
   4141           MinBlocksExpr->isValueDependent() ||
   4142           !MinBlocksExpr->isIntegerConstantExpr(MinBlocks, S.Context)) {
   4143         S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   4144           << Attr.getName() << 2 << AANT_ArgumentIntegerConstant
   4145           << MinBlocksExpr->getSourceRange();
   4146         return;
   4147       }
   4148     }
   4149 
   4150     D->addAttr(::new (S.Context)
   4151                CUDALaunchBoundsAttr(Attr.getRange(), S.Context,
   4152                                     MaxThreads.getZExtValue(),
   4153                                     MinBlocks.getZExtValue(),
   4154                                     Attr.getAttributeSpellingListIndex()));
   4155   } else {
   4156     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "launch_bounds";
   4157   }
   4158 }
   4159 
   4160 static void handleArgumentWithTypeTagAttr(Sema &S, Decl *D,
   4161                                           const AttributeList &Attr) {
   4162   StringRef AttrName = Attr.getName()->getName();
   4163   if (!Attr.getParameterName()) {
   4164     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   4165       << Attr.getName() << /* arg num = */ 1 << AANT_ArgumentIdentifier;
   4166     return;
   4167   }
   4168 
   4169   if (Attr.getNumArgs() != 2) {
   4170     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
   4171       << Attr.getName() << /* required args = */ 3;
   4172     return;
   4173   }
   4174 
   4175   IdentifierInfo *ArgumentKind = Attr.getParameterName();
   4176 
   4177   if (!isFunctionOrMethod(D) || !hasFunctionProto(D)) {
   4178     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   4179       << Attr.getName() << ExpectedFunctionOrMethod;
   4180     return;
   4181   }
   4182 
   4183   uint64_t ArgumentIdx;
   4184   if (!checkFunctionOrMethodArgumentIndex(S, D, AttrName,
   4185                                           Attr.getLoc(), 2,
   4186                                           Attr.getArg(0), ArgumentIdx))
   4187     return;
   4188 
   4189   uint64_t TypeTagIdx;
   4190   if (!checkFunctionOrMethodArgumentIndex(S, D, AttrName,
   4191                                           Attr.getLoc(), 3,
   4192                                           Attr.getArg(1), TypeTagIdx))
   4193     return;
   4194 
   4195   bool IsPointer = (AttrName == "pointer_with_type_tag");
   4196   if (IsPointer) {
   4197     // Ensure that buffer has a pointer type.
   4198     QualType BufferTy = getFunctionOrMethodArgType(D, ArgumentIdx);
   4199     if (!BufferTy->isPointerType()) {
   4200       S.Diag(Attr.getLoc(), diag::err_attribute_pointers_only)
   4201         << Attr.getName();
   4202     }
   4203   }
   4204 
   4205   D->addAttr(::new (S.Context)
   4206              ArgumentWithTypeTagAttr(Attr.getRange(), S.Context, ArgumentKind,
   4207                                      ArgumentIdx, TypeTagIdx, IsPointer,
   4208                                      Attr.getAttributeSpellingListIndex()));
   4209 }
   4210 
   4211 static void handleTypeTagForDatatypeAttr(Sema &S, Decl *D,
   4212                                          const AttributeList &Attr) {
   4213   IdentifierInfo *PointerKind = Attr.getParameterName();
   4214   if (!PointerKind) {
   4215     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_type)
   4216       << Attr.getName() << 1 << AANT_ArgumentIdentifier;
   4217     return;
   4218   }
   4219 
   4220   QualType MatchingCType = S.GetTypeFromParser(Attr.getMatchingCType(), NULL);
   4221 
   4222   D->addAttr(::new (S.Context)
   4223              TypeTagForDatatypeAttr(Attr.getRange(), S.Context, PointerKind,
   4224                                     MatchingCType,
   4225                                     Attr.getLayoutCompatible(),
   4226                                     Attr.getMustBeNull(),
   4227                                     Attr.getAttributeSpellingListIndex()));
   4228 }
   4229 
   4230 //===----------------------------------------------------------------------===//
   4231 // Checker-specific attribute handlers.
   4232 //===----------------------------------------------------------------------===//
   4233 
   4234 static bool isValidSubjectOfNSAttribute(Sema &S, QualType type) {
   4235   return type->isDependentType() ||
   4236          type->isObjCObjectPointerType() ||
   4237          S.Context.isObjCNSObjectType(type);
   4238 }
   4239 static bool isValidSubjectOfCFAttribute(Sema &S, QualType type) {
   4240   return type->isDependentType() ||
   4241          type->isPointerType() ||
   4242          isValidSubjectOfNSAttribute(S, type);
   4243 }
   4244 
   4245 static void handleNSConsumedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   4246   ParmVarDecl *param = dyn_cast<ParmVarDecl>(D);
   4247   if (!param) {
   4248     S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
   4249       << Attr.getRange() << Attr.getName() << ExpectedParameter;
   4250     return;
   4251   }
   4252 
   4253   bool typeOK, cf;
   4254   if (Attr.getKind() == AttributeList::AT_NSConsumed) {
   4255     typeOK = isValidSubjectOfNSAttribute(S, param->getType());
   4256     cf = false;
   4257   } else {
   4258     typeOK = isValidSubjectOfCFAttribute(S, param->getType());
   4259     cf = true;
   4260   }
   4261 
   4262   if (!typeOK) {
   4263     S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_parameter_type)
   4264       << Attr.getRange() << Attr.getName() << cf;
   4265     return;
   4266   }
   4267 
   4268   if (cf)
   4269     param->addAttr(::new (S.Context)
   4270                    CFConsumedAttr(Attr.getRange(), S.Context,
   4271                                   Attr.getAttributeSpellingListIndex()));
   4272   else
   4273     param->addAttr(::new (S.Context)
   4274                    NSConsumedAttr(Attr.getRange(), S.Context,
   4275                                   Attr.getAttributeSpellingListIndex()));
   4276 }
   4277 
   4278 static void handleNSConsumesSelfAttr(Sema &S, Decl *D,
   4279                                      const AttributeList &Attr) {
   4280   if (!isa<ObjCMethodDecl>(D)) {
   4281     S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
   4282       << Attr.getRange() << Attr.getName() << ExpectedMethod;
   4283     return;
   4284   }
   4285 
   4286   D->addAttr(::new (S.Context)
   4287              NSConsumesSelfAttr(Attr.getRange(), S.Context,
   4288                                 Attr.getAttributeSpellingListIndex()));
   4289 }
   4290 
   4291 static void handleNSReturnsRetainedAttr(Sema &S, Decl *D,
   4292                                         const AttributeList &Attr) {
   4293 
   4294   QualType returnType;
   4295 
   4296   if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
   4297     returnType = MD->getResultType();
   4298   else if (S.getLangOpts().ObjCAutoRefCount && hasDeclarator(D) &&
   4299            (Attr.getKind() == AttributeList::AT_NSReturnsRetained))
   4300     return; // ignore: was handled as a type attribute
   4301   else if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
   4302     returnType = PD->getType();
   4303   else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
   4304     returnType = FD->getResultType();
   4305   else {
   4306     S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
   4307         << Attr.getRange() << Attr.getName()
   4308         << ExpectedFunctionOrMethod;
   4309     return;
   4310   }
   4311 
   4312   bool typeOK;
   4313   bool cf;
   4314   switch (Attr.getKind()) {
   4315   default: llvm_unreachable("invalid ownership attribute");
   4316   case AttributeList::AT_NSReturnsAutoreleased:
   4317   case AttributeList::AT_NSReturnsRetained:
   4318   case AttributeList::AT_NSReturnsNotRetained:
   4319     typeOK = isValidSubjectOfNSAttribute(S, returnType);
   4320     cf = false;
   4321     break;
   4322 
   4323   case AttributeList::AT_CFReturnsRetained:
   4324   case AttributeList::AT_CFReturnsNotRetained:
   4325     typeOK = isValidSubjectOfCFAttribute(S, returnType);
   4326     cf = true;
   4327     break;
   4328   }
   4329 
   4330   if (!typeOK) {
   4331     S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
   4332       << Attr.getRange() << Attr.getName() << isa<ObjCMethodDecl>(D) << cf;
   4333     return;
   4334   }
   4335 
   4336   switch (Attr.getKind()) {
   4337     default:
   4338       llvm_unreachable("invalid ownership attribute");
   4339     case AttributeList::AT_NSReturnsAutoreleased:
   4340       D->addAttr(::new (S.Context)
   4341                  NSReturnsAutoreleasedAttr(Attr.getRange(), S.Context,
   4342                                            Attr.getAttributeSpellingListIndex()));
   4343       return;
   4344     case AttributeList::AT_CFReturnsNotRetained:
   4345       D->addAttr(::new (S.Context)
   4346                  CFReturnsNotRetainedAttr(Attr.getRange(), S.Context,
   4347                                           Attr.getAttributeSpellingListIndex()));
   4348       return;
   4349     case AttributeList::AT_NSReturnsNotRetained:
   4350       D->addAttr(::new (S.Context)
   4351                  NSReturnsNotRetainedAttr(Attr.getRange(), S.Context,
   4352                                           Attr.getAttributeSpellingListIndex()));
   4353       return;
   4354     case AttributeList::AT_CFReturnsRetained:
   4355       D->addAttr(::new (S.Context)
   4356                  CFReturnsRetainedAttr(Attr.getRange(), S.Context,
   4357                                        Attr.getAttributeSpellingListIndex()));
   4358       return;
   4359     case AttributeList::AT_NSReturnsRetained:
   4360       D->addAttr(::new (S.Context)
   4361                  NSReturnsRetainedAttr(Attr.getRange(), S.Context,
   4362                                        Attr.getAttributeSpellingListIndex()));
   4363       return;
   4364   };
   4365 }
   4366 
   4367 static void handleObjCReturnsInnerPointerAttr(Sema &S, Decl *D,
   4368                                               const AttributeList &attr) {
   4369   SourceLocation loc = attr.getLoc();
   4370 
   4371   ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(D);
   4372 
   4373   if (!method) {
   4374     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   4375       << SourceRange(loc, loc) << attr.getName() << ExpectedMethod;
   4376     return;
   4377   }
   4378 
   4379   // Check that the method returns a normal pointer.
   4380   QualType resultType = method->getResultType();
   4381 
   4382   if (!resultType->isReferenceType() &&
   4383       (!resultType->isPointerType() || resultType->isObjCRetainableType())) {
   4384     S.Diag(method->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
   4385       << SourceRange(loc)
   4386       << attr.getName() << /*method*/ 1 << /*non-retainable pointer*/ 2;
   4387 
   4388     // Drop the attribute.
   4389     return;
   4390   }
   4391 
   4392   method->addAttr(::new (S.Context)
   4393                   ObjCReturnsInnerPointerAttr(attr.getRange(), S.Context,
   4394                                               attr.getAttributeSpellingListIndex()));
   4395 }
   4396 
   4397 static void handleObjCRequiresSuperAttr(Sema &S, Decl *D,
   4398                                         const AttributeList &attr) {
   4399   SourceLocation loc = attr.getLoc();
   4400   ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(D);
   4401 
   4402   if (!method) {
   4403    S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   4404    << SourceRange(loc, loc) << attr.getName() << ExpectedMethod;
   4405     return;
   4406   }
   4407   DeclContext *DC = method->getDeclContext();
   4408   if (const ObjCProtocolDecl *PDecl = dyn_cast_or_null<ObjCProtocolDecl>(DC)) {
   4409     S.Diag(D->getLocStart(), diag::warn_objc_requires_super_protocol)
   4410     << attr.getName() << 0;
   4411     S.Diag(PDecl->getLocation(), diag::note_protocol_decl);
   4412     return;
   4413   }
   4414   if (method->getMethodFamily() == OMF_dealloc) {
   4415     S.Diag(D->getLocStart(), diag::warn_objc_requires_super_protocol)
   4416     << attr.getName() << 1;
   4417     return;
   4418   }
   4419 
   4420   method->addAttr(::new (S.Context)
   4421                   ObjCRequiresSuperAttr(attr.getRange(), S.Context,
   4422                                         attr.getAttributeSpellingListIndex()));
   4423 }
   4424 
   4425 /// Handle cf_audited_transfer and cf_unknown_transfer.
   4426 static void handleCFTransferAttr(Sema &S, Decl *D, const AttributeList &A) {
   4427   if (!isa<FunctionDecl>(D)) {
   4428     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   4429       << A.getRange() << A.getName() << ExpectedFunction;
   4430     return;
   4431   }
   4432 
   4433   bool IsAudited = (A.getKind() == AttributeList::AT_CFAuditedTransfer);
   4434 
   4435   // Check whether there's a conflicting attribute already present.
   4436   Attr *Existing;
   4437   if (IsAudited) {
   4438     Existing = D->getAttr<CFUnknownTransferAttr>();
   4439   } else {
   4440     Existing = D->getAttr<CFAuditedTransferAttr>();
   4441   }
   4442   if (Existing) {
   4443     S.Diag(D->getLocStart(), diag::err_attributes_are_not_compatible)
   4444       << A.getName()
   4445       << (IsAudited ? "cf_unknown_transfer" : "cf_audited_transfer")
   4446       << A.getRange() << Existing->getRange();
   4447     return;
   4448   }
   4449 
   4450   // All clear;  add the attribute.
   4451   if (IsAudited) {
   4452     D->addAttr(::new (S.Context)
   4453                CFAuditedTransferAttr(A.getRange(), S.Context,
   4454                                      A.getAttributeSpellingListIndex()));
   4455   } else {
   4456     D->addAttr(::new (S.Context)
   4457                CFUnknownTransferAttr(A.getRange(), S.Context,
   4458                                      A.getAttributeSpellingListIndex()));
   4459   }
   4460 }
   4461 
   4462 static void handleNSBridgedAttr(Sema &S, Scope *Sc, Decl *D,
   4463                                 const AttributeList &Attr) {
   4464   RecordDecl *RD = dyn_cast<RecordDecl>(D);
   4465   if (!RD || RD->isUnion()) {
   4466     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   4467       << Attr.getRange() << Attr.getName() << ExpectedStruct;
   4468   }
   4469 
   4470   IdentifierInfo *ParmName = Attr.getParameterName();
   4471 
   4472   // In Objective-C, verify that the type names an Objective-C type.
   4473   // We don't want to check this outside of ObjC because people sometimes
   4474   // do crazy C declarations of Objective-C types.
   4475   if (ParmName && S.getLangOpts().ObjC1) {
   4476     // Check for an existing type with this name.
   4477     LookupResult R(S, DeclarationName(ParmName), Attr.getParameterLoc(),
   4478                    Sema::LookupOrdinaryName);
   4479     if (S.LookupName(R, Sc)) {
   4480       NamedDecl *Target = R.getFoundDecl();
   4481       if (Target && !isa<ObjCInterfaceDecl>(Target)) {
   4482         S.Diag(D->getLocStart(), diag::err_ns_bridged_not_interface);
   4483         S.Diag(Target->getLocStart(), diag::note_declared_at);
   4484       }
   4485     }
   4486   }
   4487 
   4488   D->addAttr(::new (S.Context)
   4489              NSBridgedAttr(Attr.getRange(), S.Context, ParmName,
   4490                            Attr.getAttributeSpellingListIndex()));
   4491 }
   4492 
   4493 static void handleObjCOwnershipAttr(Sema &S, Decl *D,
   4494                                     const AttributeList &Attr) {
   4495   if (hasDeclarator(D)) return;
   4496 
   4497   S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   4498     << Attr.getRange() << Attr.getName() << ExpectedVariable;
   4499 }
   4500 
   4501 static void handleObjCPreciseLifetimeAttr(Sema &S, Decl *D,
   4502                                           const AttributeList &Attr) {
   4503   if (!isa<VarDecl>(D) && !isa<FieldDecl>(D)) {
   4504     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   4505       << Attr.getRange() << Attr.getName() << ExpectedVariable;
   4506     return;
   4507   }
   4508 
   4509   ValueDecl *vd = cast<ValueDecl>(D);
   4510   QualType type = vd->getType();
   4511 
   4512   if (!type->isDependentType() &&
   4513       !type->isObjCLifetimeType()) {
   4514     S.Diag(Attr.getLoc(), diag::err_objc_precise_lifetime_bad_type)
   4515       << type;
   4516     return;
   4517   }
   4518 
   4519   Qualifiers::ObjCLifetime lifetime = type.getObjCLifetime();
   4520 
   4521   // If we have no lifetime yet, check the lifetime we're presumably
   4522   // going to infer.
   4523   if (lifetime == Qualifiers::OCL_None && !type->isDependentType())
   4524     lifetime = type->getObjCARCImplicitLifetime();
   4525 
   4526   switch (lifetime) {
   4527   case Qualifiers::OCL_None:
   4528     assert(type->isDependentType() &&
   4529            "didn't infer lifetime for non-dependent type?");
   4530     break;
   4531 
   4532   case Qualifiers::OCL_Weak:   // meaningful
   4533   case Qualifiers::OCL_Strong: // meaningful
   4534     break;
   4535 
   4536   case Qualifiers::OCL_ExplicitNone:
   4537   case Qualifiers::OCL_Autoreleasing:
   4538     S.Diag(Attr.getLoc(), diag::warn_objc_precise_lifetime_meaningless)
   4539       << (lifetime == Qualifiers::OCL_Autoreleasing);
   4540     break;
   4541   }
   4542 
   4543   D->addAttr(::new (S.Context)
   4544              ObjCPreciseLifetimeAttr(Attr.getRange(), S.Context,
   4545                                      Attr.getAttributeSpellingListIndex()));
   4546 }
   4547 
   4548 //===----------------------------------------------------------------------===//
   4549 // Microsoft specific attribute handlers.
   4550 //===----------------------------------------------------------------------===//
   4551 
   4552 // Check if MS extensions or some other language extensions are enabled.  If
   4553 // not, issue a diagnostic that the given attribute is unused.
   4554 static bool checkMicrosoftExt(Sema &S, const AttributeList &Attr,
   4555                               bool OtherExtension = false) {
   4556   if (S.LangOpts.MicrosoftExt || OtherExtension)
   4557     return true;
   4558   S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
   4559   return false;
   4560 }
   4561 
   4562 static void handleUuidAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   4563   if (!checkMicrosoftExt(S, Attr, S.LangOpts.Borland))
   4564     return;
   4565 
   4566   // check the attribute arguments.
   4567   if (!checkAttributeNumArgs(S, Attr, 1))
   4568     return;
   4569 
   4570   Expr *Arg = Attr.getArg(0);
   4571   StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   4572   if (!Str || !Str->isAscii()) {
   4573     S.Diag(Attr.getLoc(), diag::err_attribute_argument_type)
   4574       << Attr.getName() << AANT_ArgumentString;
   4575     return;
   4576   }
   4577 
   4578   StringRef StrRef = Str->getString();
   4579 
   4580   bool IsCurly = StrRef.size() > 1 && StrRef.front() == '{' &&
   4581                  StrRef.back() == '}';
   4582 
   4583   // Validate GUID length.
   4584   if (IsCurly && StrRef.size() != 38) {
   4585     S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
   4586     return;
   4587   }
   4588   if (!IsCurly && StrRef.size() != 36) {
   4589     S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
   4590     return;
   4591   }
   4592 
   4593   // GUID format is "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" or
   4594   // "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
   4595   StringRef::iterator I = StrRef.begin();
   4596   if (IsCurly) // Skip the optional '{'
   4597      ++I;
   4598 
   4599   for (int i = 0; i < 36; ++i) {
   4600     if (i == 8 || i == 13 || i == 18 || i == 23) {
   4601       if (*I != '-') {
   4602         S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
   4603         return;
   4604       }
   4605     } else if (!isHexDigit(*I)) {
   4606       S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
   4607       return;
   4608     }
   4609     I++;
   4610   }
   4611 
   4612   D->addAttr(::new (S.Context)
   4613              UuidAttr(Attr.getRange(), S.Context, Str->getString(),
   4614                       Attr.getAttributeSpellingListIndex()));
   4615 }
   4616 
   4617 static void handleInheritanceAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   4618   if (!checkMicrosoftExt(S, Attr))
   4619     return;
   4620 
   4621   AttributeList::Kind Kind = Attr.getKind();
   4622   if (Kind == AttributeList::AT_SingleInheritance)
   4623     D->addAttr(
   4624         ::new (S.Context)
   4625                SingleInheritanceAttr(Attr.getRange(), S.Context,
   4626                                      Attr.getAttributeSpellingListIndex()));
   4627   else if (Kind == AttributeList::AT_MultipleInheritance)
   4628     D->addAttr(
   4629         ::new (S.Context)
   4630                MultipleInheritanceAttr(Attr.getRange(), S.Context,
   4631                                        Attr.getAttributeSpellingListIndex()));
   4632   else if (Kind == AttributeList::AT_VirtualInheritance)
   4633     D->addAttr(
   4634         ::new (S.Context)
   4635                VirtualInheritanceAttr(Attr.getRange(), S.Context,
   4636                                       Attr.getAttributeSpellingListIndex()));
   4637 }
   4638 
   4639 static void handlePortabilityAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   4640   if (!checkMicrosoftExt(S, Attr))
   4641     return;
   4642 
   4643   AttributeList::Kind Kind = Attr.getKind();
   4644     if (Kind == AttributeList::AT_Win64)
   4645     D->addAttr(
   4646         ::new (S.Context) Win64Attr(Attr.getRange(), S.Context,
   4647                                     Attr.getAttributeSpellingListIndex()));
   4648 }
   4649 
   4650 static void handleForceInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   4651   if (!checkMicrosoftExt(S, Attr))
   4652     return;
   4653   D->addAttr(::new (S.Context)
   4654              ForceInlineAttr(Attr.getRange(), S.Context,
   4655                              Attr.getAttributeSpellingListIndex()));
   4656 }
   4657 
   4658 static void handleSelectAnyAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   4659   if (!checkMicrosoftExt(S, Attr))
   4660     return;
   4661   // Check linkage after possibly merging declaratinos.  See
   4662   // checkAttributesAfterMerging().
   4663   D->addAttr(::new (S.Context)
   4664              SelectAnyAttr(Attr.getRange(), S.Context,
   4665                            Attr.getAttributeSpellingListIndex()));
   4666 }
   4667 
   4668 //===----------------------------------------------------------------------===//
   4669 // Top Level Sema Entry Points
   4670 //===----------------------------------------------------------------------===//
   4671 
   4672 static void ProcessNonInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
   4673                                           const AttributeList &Attr) {
   4674   switch (Attr.getKind()) {
   4675   case AttributeList::AT_CUDADevice:  handleDeviceAttr      (S, D, Attr); break;
   4676   case AttributeList::AT_CUDAHost:    handleHostAttr        (S, D, Attr); break;
   4677   case AttributeList::AT_Overloadable:handleOverloadableAttr(S, D, Attr); break;
   4678   case AttributeList::AT_Kernel:      handleKernelAttr      (S, D, Attr); break;
   4679   default:
   4680     break;
   4681   }
   4682 }
   4683 
   4684 static void ProcessInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
   4685                                        const AttributeList &Attr) {
   4686   switch (Attr.getKind()) {
   4687   case AttributeList::AT_IBAction:    handleIBAction(S, D, Attr); break;
   4688   case AttributeList::AT_IBOutlet:    handleIBOutlet(S, D, Attr); break;
   4689   case AttributeList::AT_IBOutletCollection:
   4690     handleIBOutletCollection(S, D, Attr); break;
   4691   case AttributeList::AT_AddressSpace:
   4692   case AttributeList::AT_ObjCGC:
   4693   case AttributeList::AT_VectorSize:
   4694   case AttributeList::AT_NeonVectorType:
   4695   case AttributeList::AT_NeonPolyVectorType:
   4696   case AttributeList::AT_Ptr32:
   4697   case AttributeList::AT_Ptr64:
   4698   case AttributeList::AT_SPtr:
   4699   case AttributeList::AT_UPtr:
   4700     // Ignore these, these are type attributes, handled by
   4701     // ProcessTypeAttributes.
   4702     break;
   4703   case AttributeList::AT_CUDADevice:
   4704   case AttributeList::AT_CUDAHost:
   4705   case AttributeList::AT_Overloadable:
   4706   case AttributeList::AT_Kernel:
   4707     // Ignore, this is a non-inheritable attribute, handled
   4708     // by ProcessNonInheritableDeclAttr.
   4709     break;
   4710   case AttributeList::AT_Alias:       handleAliasAttr       (S, D, Attr); break;
   4711   case AttributeList::AT_Aligned:     handleAlignedAttr     (S, D, Attr); break;
   4712   case AttributeList::AT_AllocSize:   handleAllocSizeAttr   (S, D, Attr); break;
   4713   case AttributeList::AT_AlwaysInline:
   4714     handleAlwaysInlineAttr  (S, D, Attr); break;
   4715   case AttributeList::AT_AnalyzerNoReturn:
   4716     handleAnalyzerNoReturnAttr  (S, D, Attr); break;
   4717   case AttributeList::AT_TLSModel:    handleTLSModelAttr    (S, D, Attr); break;
   4718   case AttributeList::AT_Annotate:    handleAnnotateAttr    (S, D, Attr); break;
   4719   case AttributeList::AT_Availability:handleAvailabilityAttr(S, D, Attr); break;
   4720   case AttributeList::AT_CarriesDependency:
   4721     handleDependencyAttr(S, scope, D, Attr);
   4722     break;
   4723   case AttributeList::AT_Common:      handleCommonAttr      (S, D, Attr); break;
   4724   case AttributeList::AT_CUDAConstant:handleConstantAttr    (S, D, Attr); break;
   4725   case AttributeList::AT_Constructor: handleConstructorAttr (S, D, Attr); break;
   4726   case AttributeList::AT_CXX11NoReturn:
   4727     handleCXX11NoReturnAttr(S, D, Attr);
   4728     break;
   4729   case AttributeList::AT_Deprecated:
   4730     handleAttrWithMessage<DeprecatedAttr>(S, D, Attr);
   4731     break;
   4732   case AttributeList::AT_Destructor:  handleDestructorAttr  (S, D, Attr); break;
   4733   case AttributeList::AT_ExtVectorType:
   4734     handleExtVectorTypeAttr(S, scope, D, Attr);
   4735     break;
   4736   case AttributeList::AT_MinSize:
   4737     handleMinSizeAttr(S, D, Attr);
   4738     break;
   4739   case AttributeList::AT_Format:      handleFormatAttr      (S, D, Attr); break;
   4740   case AttributeList::AT_FormatArg:   handleFormatArgAttr   (S, D, Attr); break;
   4741   case AttributeList::AT_CUDAGlobal:  handleGlobalAttr      (S, D, Attr); break;
   4742   case AttributeList::AT_GNUInline:   handleGNUInlineAttr   (S, D, Attr); break;
   4743   case AttributeList::AT_CUDALaunchBounds:
   4744     handleLaunchBoundsAttr(S, D, Attr);
   4745     break;
   4746   case AttributeList::AT_Mode:        handleModeAttr        (S, D, Attr); break;
   4747   case AttributeList::AT_Malloc:      handleMallocAttr      (S, D, Attr); break;
   4748   case AttributeList::AT_MayAlias:    handleMayAliasAttr    (S, D, Attr); break;
   4749   case AttributeList::AT_NoCommon:    handleNoCommonAttr    (S, D, Attr); break;
   4750   case AttributeList::AT_NonNull:     handleNonNullAttr     (S, D, Attr); break;
   4751   case AttributeList::AT_ownership_returns:
   4752   case AttributeList::AT_ownership_takes:
   4753   case AttributeList::AT_ownership_holds:
   4754       handleOwnershipAttr     (S, D, Attr); break;
   4755   case AttributeList::AT_Cold:        handleColdAttr        (S, D, Attr); break;
   4756   case AttributeList::AT_Hot:         handleHotAttr         (S, D, Attr); break;
   4757   case AttributeList::AT_Naked:       handleNakedAttr       (S, D, Attr); break;
   4758   case AttributeList::AT_NoReturn:    handleNoReturnAttr    (S, D, Attr); break;
   4759   case AttributeList::AT_NoThrow:     handleNothrowAttr     (S, D, Attr); break;
   4760   case AttributeList::AT_CUDAShared:  handleSharedAttr      (S, D, Attr); break;
   4761   case AttributeList::AT_VecReturn:   handleVecReturnAttr   (S, D, Attr); break;
   4762 
   4763   case AttributeList::AT_ObjCOwnership:
   4764     handleObjCOwnershipAttr(S, D, Attr); break;
   4765   case AttributeList::AT_ObjCPreciseLifetime:
   4766     handleObjCPreciseLifetimeAttr(S, D, Attr); break;
   4767 
   4768   case AttributeList::AT_ObjCReturnsInnerPointer:
   4769     handleObjCReturnsInnerPointerAttr(S, D, Attr); break;
   4770 
   4771   case AttributeList::AT_ObjCRequiresSuper:
   4772       handleObjCRequiresSuperAttr(S, D, Attr); break;
   4773 
   4774   case AttributeList::AT_NSBridged:
   4775     handleNSBridgedAttr(S, scope, D, Attr); break;
   4776 
   4777   case AttributeList::AT_CFAuditedTransfer:
   4778   case AttributeList::AT_CFUnknownTransfer:
   4779     handleCFTransferAttr(S, D, Attr); break;
   4780 
   4781   // Checker-specific.
   4782   case AttributeList::AT_CFConsumed:
   4783   case AttributeList::AT_NSConsumed:  handleNSConsumedAttr  (S, D, Attr); break;
   4784   case AttributeList::AT_NSConsumesSelf:
   4785     handleNSConsumesSelfAttr(S, D, Attr); break;
   4786 
   4787   case AttributeList::AT_NSReturnsAutoreleased:
   4788   case AttributeList::AT_NSReturnsNotRetained:
   4789   case AttributeList::AT_CFReturnsNotRetained:
   4790   case AttributeList::AT_NSReturnsRetained:
   4791   case AttributeList::AT_CFReturnsRetained:
   4792     handleNSReturnsRetainedAttr(S, D, Attr); break;
   4793 
   4794   case AttributeList::AT_WorkGroupSizeHint:
   4795   case AttributeList::AT_ReqdWorkGroupSize:
   4796     handleWorkGroupSize(S, D, Attr); break;
   4797 
   4798   case AttributeList::AT_VecTypeHint:
   4799     handleVecTypeHint(S, D, Attr); break;
   4800 
   4801   case AttributeList::AT_Endian:
   4802     handleEndianAttr(S, D, Attr);
   4803     break;
   4804 
   4805   case AttributeList::AT_InitPriority:
   4806       handleInitPriorityAttr(S, D, Attr); break;
   4807 
   4808   case AttributeList::AT_Packed:      handlePackedAttr      (S, D, Attr); break;
   4809   case AttributeList::AT_Section:     handleSectionAttr     (S, D, Attr); break;
   4810   case AttributeList::AT_Unavailable:
   4811     handleAttrWithMessage<UnavailableAttr>(S, D, Attr);
   4812     break;
   4813   case AttributeList::AT_ArcWeakrefUnavailable:
   4814     handleArcWeakrefUnavailableAttr (S, D, Attr);
   4815     break;
   4816   case AttributeList::AT_ObjCRootClass:
   4817     handleObjCRootClassAttr(S, D, Attr);
   4818     break;
   4819   case AttributeList::AT_ObjCRequiresPropertyDefs:
   4820     handleObjCRequiresPropertyDefsAttr (S, D, Attr);
   4821     break;
   4822   case AttributeList::AT_Unused:      handleUnusedAttr      (S, D, Attr); break;
   4823   case AttributeList::AT_ReturnsTwice:
   4824     handleReturnsTwiceAttr(S, D, Attr);
   4825     break;
   4826   case AttributeList::AT_Used:        handleUsedAttr        (S, D, Attr); break;
   4827   case AttributeList::AT_Visibility:
   4828     handleVisibilityAttr(S, D, Attr, false);
   4829     break;
   4830   case AttributeList::AT_TypeVisibility:
   4831     handleVisibilityAttr(S, D, Attr, true);
   4832     break;
   4833   case AttributeList::AT_WarnUnused:
   4834     handleWarnUnusedAttr(S, D, Attr);
   4835     break;
   4836   case AttributeList::AT_WarnUnusedResult: handleWarnUnusedResult(S, D, Attr);
   4837     break;
   4838   case AttributeList::AT_Weak:        handleWeakAttr        (S, D, Attr); break;
   4839   case AttributeList::AT_WeakRef:     handleWeakRefAttr     (S, D, Attr); break;
   4840   case AttributeList::AT_WeakImport:  handleWeakImportAttr  (S, D, Attr); break;
   4841   case AttributeList::AT_TransparentUnion:
   4842     handleTransparentUnionAttr(S, D, Attr);
   4843     break;
   4844   case AttributeList::AT_ObjCException:
   4845     handleObjCExceptionAttr(S, D, Attr);
   4846     break;
   4847   case AttributeList::AT_ObjCMethodFamily:
   4848     handleObjCMethodFamilyAttr(S, D, Attr);
   4849     break;
   4850   case AttributeList::AT_ObjCNSObject:handleObjCNSObject    (S, D, Attr); break;
   4851   case AttributeList::AT_Blocks:      handleBlocksAttr      (S, D, Attr); break;
   4852   case AttributeList::AT_Sentinel:    handleSentinelAttr    (S, D, Attr); break;
   4853   case AttributeList::AT_Const:       handleConstAttr       (S, D, Attr); break;
   4854   case AttributeList::AT_Pure:        handlePureAttr        (S, D, Attr); break;
   4855   case AttributeList::AT_Cleanup:     handleCleanupAttr     (S, D, Attr); break;
   4856   case AttributeList::AT_NoDebug:     handleNoDebugAttr     (S, D, Attr); break;
   4857   case AttributeList::AT_NoInline:    handleNoInlineAttr    (S, D, Attr); break;
   4858   case AttributeList::AT_Regparm:     handleRegparmAttr     (S, D, Attr); break;
   4859   case AttributeList::IgnoredAttribute:
   4860     // Just ignore
   4861     break;
   4862   case AttributeList::AT_NoInstrumentFunction:  // Interacts with -pg.
   4863     handleNoInstrumentFunctionAttr(S, D, Attr);
   4864     break;
   4865   case AttributeList::AT_StdCall:
   4866   case AttributeList::AT_CDecl:
   4867   case AttributeList::AT_FastCall:
   4868   case AttributeList::AT_ThisCall:
   4869   case AttributeList::AT_Pascal:
   4870   case AttributeList::AT_Pcs:
   4871   case AttributeList::AT_PnaclCall:
   4872   case AttributeList::AT_IntelOclBicc:
   4873     handleCallConvAttr(S, D, Attr);
   4874     break;
   4875   case AttributeList::AT_OpenCLKernel:
   4876     handleOpenCLKernelAttr(S, D, Attr);
   4877     break;
   4878   case AttributeList::AT_OpenCLImageAccess:
   4879     handleOpenCLImageAccessAttr(S, D, Attr);
   4880     break;
   4881 
   4882   // Microsoft attributes:
   4883   case AttributeList::AT_MsProperty: break;
   4884   case AttributeList::AT_MsStruct:
   4885     handleMsStructAttr(S, D, Attr);
   4886     break;
   4887   case AttributeList::AT_Uuid:
   4888     handleUuidAttr(S, D, Attr);
   4889     break;
   4890   case AttributeList::AT_SingleInheritance:
   4891   case AttributeList::AT_MultipleInheritance:
   4892   case AttributeList::AT_VirtualInheritance:
   4893     handleInheritanceAttr(S, D, Attr);
   4894     break;
   4895   case AttributeList::AT_Win64:
   4896     handlePortabilityAttr(S, D, Attr);
   4897     break;
   4898   case AttributeList::AT_ForceInline:
   4899     handleForceInlineAttr(S, D, Attr);
   4900     break;
   4901   case AttributeList::AT_SelectAny:
   4902     handleSelectAnyAttr(S, D, Attr);
   4903     break;
   4904 
   4905   // Thread safety attributes:
   4906   case AttributeList::AT_AssertExclusiveLock:
   4907     handleAssertExclusiveLockAttr(S, D, Attr);
   4908     break;
   4909   case AttributeList::AT_AssertSharedLock:
   4910     handleAssertSharedLockAttr(S, D, Attr);
   4911     break;
   4912   case AttributeList::AT_GuardedVar:
   4913     handleGuardedVarAttr(S, D, Attr);
   4914     break;
   4915   case AttributeList::AT_PtGuardedVar:
   4916     handlePtGuardedVarAttr(S, D, Attr);
   4917     break;
   4918   case AttributeList::AT_ScopedLockable:
   4919     handleScopedLockableAttr(S, D, Attr);
   4920     break;
   4921   case AttributeList::AT_NoSanitizeAddress:
   4922     handleNoSanitizeAddressAttr(S, D, Attr);
   4923     break;
   4924   case AttributeList::AT_NoThreadSafetyAnalysis:
   4925     handleNoThreadSafetyAnalysis(S, D, Attr);
   4926     break;
   4927   case AttributeList::AT_NoSanitizeThread:
   4928     handleNoSanitizeThread(S, D, Attr);
   4929     break;
   4930   case AttributeList::AT_NoSanitizeMemory:
   4931     handleNoSanitizeMemory(S, D, Attr);
   4932     break;
   4933   case AttributeList::AT_Lockable:
   4934     handleLockableAttr(S, D, Attr);
   4935     break;
   4936   case AttributeList::AT_GuardedBy:
   4937     handleGuardedByAttr(S, D, Attr);
   4938     break;
   4939   case AttributeList::AT_PtGuardedBy:
   4940     handlePtGuardedByAttr(S, D, Attr);
   4941     break;
   4942   case AttributeList::AT_ExclusiveLockFunction:
   4943     handleExclusiveLockFunctionAttr(S, D, Attr);
   4944     break;
   4945   case AttributeList::AT_ExclusiveLocksRequired:
   4946     handleExclusiveLocksRequiredAttr(S, D, Attr);
   4947     break;
   4948   case AttributeList::AT_ExclusiveTrylockFunction:
   4949     handleExclusiveTrylockFunctionAttr(S, D, Attr);
   4950     break;
   4951   case AttributeList::AT_LockReturned:
   4952     handleLockReturnedAttr(S, D, Attr);
   4953     break;
   4954   case AttributeList::AT_LocksExcluded:
   4955     handleLocksExcludedAttr(S, D, Attr);
   4956     break;
   4957   case AttributeList::AT_SharedLockFunction:
   4958     handleSharedLockFunctionAttr(S, D, Attr);
   4959     break;
   4960   case AttributeList::AT_SharedLocksRequired:
   4961     handleSharedLocksRequiredAttr(S, D, Attr);
   4962     break;
   4963   case AttributeList::AT_SharedTrylockFunction:
   4964     handleSharedTrylockFunctionAttr(S, D, Attr);
   4965     break;
   4966   case AttributeList::AT_UnlockFunction:
   4967     handleUnlockFunAttr(S, D, Attr);
   4968     break;
   4969   case AttributeList::AT_AcquiredBefore:
   4970     handleAcquiredBeforeAttr(S, D, Attr);
   4971     break;
   4972   case AttributeList::AT_AcquiredAfter:
   4973     handleAcquiredAfterAttr(S, D, Attr);
   4974     break;
   4975 
   4976   // Type safety attributes.
   4977   case AttributeList::AT_ArgumentWithTypeTag:
   4978     handleArgumentWithTypeTagAttr(S, D, Attr);
   4979     break;
   4980   case AttributeList::AT_TypeTagForDatatype:
   4981     handleTypeTagForDatatypeAttr(S, D, Attr);
   4982     break;
   4983 
   4984   default:
   4985     // Ask target about the attribute.
   4986     const TargetAttributesSema &TargetAttrs = S.getTargetAttributesSema();
   4987     if (!TargetAttrs.ProcessDeclAttribute(scope, D, Attr, S))
   4988       S.Diag(Attr.getLoc(), Attr.isDeclspecAttribute() ?
   4989              diag::warn_unhandled_ms_attribute_ignored :
   4990              diag::warn_unknown_attribute_ignored) << Attr.getName();
   4991     break;
   4992   }
   4993 }
   4994 
   4995 /// ProcessDeclAttribute - Apply the specific attribute to the specified decl if
   4996 /// the attribute applies to decls.  If the attribute is a type attribute, just
   4997 /// silently ignore it if a GNU attribute.
   4998 static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
   4999                                  const AttributeList &Attr,
   5000                                  bool NonInheritable, bool Inheritable,
   5001                                  bool IncludeCXX11Attributes) {
   5002   if (Attr.isInvalid())
   5003     return;
   5004 
   5005   // Ignore C++11 attributes on declarator chunks: they appertain to the type
   5006   // instead.
   5007   if (Attr.isCXX11Attribute() && !IncludeCXX11Attributes)
   5008     return;
   5009 
   5010   if (NonInheritable)
   5011     ProcessNonInheritableDeclAttr(S, scope, D, Attr);
   5012 
   5013   if (Inheritable)
   5014     ProcessInheritableDeclAttr(S, scope, D, Attr);
   5015 }
   5016 
   5017 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
   5018 /// attribute list to the specified decl, ignoring any type attributes.
   5019 void Sema::ProcessDeclAttributeList(Scope *S, Decl *D,
   5020                                     const AttributeList *AttrList,
   5021                                     bool NonInheritable, bool Inheritable,
   5022                                     bool IncludeCXX11Attributes) {
   5023   for (const AttributeList* l = AttrList; l; l = l->getNext())
   5024     ProcessDeclAttribute(*this, S, D, *l, NonInheritable, Inheritable,
   5025                          IncludeCXX11Attributes);
   5026 
   5027   // GCC accepts
   5028   // static int a9 __attribute__((weakref));
   5029   // but that looks really pointless. We reject it.
   5030   if (Inheritable && D->hasAttr<WeakRefAttr>() && !D->hasAttr<AliasAttr>()) {
   5031     Diag(AttrList->getLoc(), diag::err_attribute_weakref_without_alias) <<
   5032     cast<NamedDecl>(D)->getNameAsString();
   5033     D->dropAttr<WeakRefAttr>();
   5034     return;
   5035   }
   5036 }
   5037 
   5038 // Annotation attributes are the only attributes allowed after an access
   5039 // specifier.
   5040 bool Sema::ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl,
   5041                                           const AttributeList *AttrList) {
   5042   for (const AttributeList* l = AttrList; l; l = l->getNext()) {
   5043     if (l->getKind() == AttributeList::AT_Annotate) {
   5044       handleAnnotateAttr(*this, ASDecl, *l);
   5045     } else {
   5046       Diag(l->getLoc(), diag::err_only_annotate_after_access_spec);
   5047       return true;
   5048     }
   5049   }
   5050 
   5051   return false;
   5052 }
   5053 
   5054 /// checkUnusedDeclAttributes - Check a list of attributes to see if it
   5055 /// contains any decl attributes that we should warn about.
   5056 static void checkUnusedDeclAttributes(Sema &S, const AttributeList *A) {
   5057   for ( ; A; A = A->getNext()) {
   5058     // Only warn if the attribute is an unignored, non-type attribute.
   5059     if (A->isUsedAsTypeAttr() || A->isInvalid()) continue;
   5060     if (A->getKind() == AttributeList::IgnoredAttribute) continue;
   5061 
   5062     if (A->getKind() == AttributeList::UnknownAttribute) {
   5063       S.Diag(A->getLoc(), diag::warn_unknown_attribute_ignored)
   5064         << A->getName() << A->getRange();
   5065     } else {
   5066       S.Diag(A->getLoc(), diag::warn_attribute_not_on_decl)
   5067         << A->getName() << A->getRange();
   5068     }
   5069   }
   5070 }
   5071 
   5072 /// checkUnusedDeclAttributes - Given a declarator which is not being
   5073 /// used to build a declaration, complain about any decl attributes
   5074 /// which might be lying around on it.
   5075 void Sema::checkUnusedDeclAttributes(Declarator &D) {
   5076   ::checkUnusedDeclAttributes(*this, D.getDeclSpec().getAttributes().getList());
   5077   ::checkUnusedDeclAttributes(*this, D.getAttributes());
   5078   for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i)
   5079     ::checkUnusedDeclAttributes(*this, D.getTypeObject(i).getAttrs());
   5080 }
   5081 
   5082 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
   5083 /// \#pragma weak needs a non-definition decl and source may not have one.
   5084 NamedDecl * Sema::DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II,
   5085                                       SourceLocation Loc) {
   5086   assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
   5087   NamedDecl *NewD = 0;
   5088   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
   5089     FunctionDecl *NewFD;
   5090     // FIXME: Missing call to CheckFunctionDeclaration().
   5091     // FIXME: Mangling?
   5092     // FIXME: Is the qualifier info correct?
   5093     // FIXME: Is the DeclContext correct?
   5094     NewFD = FunctionDecl::Create(FD->getASTContext(), FD->getDeclContext(),
   5095                                  Loc, Loc, DeclarationName(II),
   5096                                  FD->getType(), FD->getTypeSourceInfo(),
   5097                                  SC_None, false/*isInlineSpecified*/,
   5098                                  FD->hasPrototype(),
   5099                                  false/*isConstexprSpecified*/);
   5100     NewD = NewFD;
   5101 
   5102     if (FD->getQualifier())
   5103       NewFD->setQualifierInfo(FD->getQualifierLoc());
   5104 
   5105     // Fake up parameter variables; they are declared as if this were
   5106     // a typedef.
   5107     QualType FDTy = FD->getType();
   5108     if (const FunctionProtoType *FT = FDTy->getAs<FunctionProtoType>()) {
   5109       SmallVector<ParmVarDecl*, 16> Params;
   5110       for (FunctionProtoType::arg_type_iterator AI = FT->arg_type_begin(),
   5111            AE = FT->arg_type_end(); AI != AE; ++AI) {
   5112         ParmVarDecl *Param = BuildParmVarDeclForTypedef(NewFD, Loc, *AI);
   5113         Param->setScopeInfo(0, Params.size());
   5114         Params.push_back(Param);
   5115       }
   5116       NewFD->setParams(Params);
   5117     }
   5118   } else if (VarDecl *VD = dyn_cast<VarDecl>(ND)) {
   5119     NewD = VarDecl::Create(VD->getASTContext(), VD->getDeclContext(),
   5120                            VD->getInnerLocStart(), VD->getLocation(), II,
   5121                            VD->getType(), VD->getTypeSourceInfo(),
   5122                            VD->getStorageClass());
   5123     if (VD->getQualifier()) {
   5124       VarDecl *NewVD = cast<VarDecl>(NewD);
   5125       NewVD->setQualifierInfo(VD->getQualifierLoc());
   5126     }
   5127   }
   5128   return NewD;
   5129 }
   5130 
   5131 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
   5132 /// applied to it, possibly with an alias.
   5133 void Sema::DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, WeakInfo &W) {
   5134   if (W.getUsed()) return; // only do this once
   5135   W.setUsed(true);
   5136   if (W.getAlias()) { // clone decl, impersonate __attribute(weak,alias(...))
   5137     IdentifierInfo *NDId = ND->getIdentifier();
   5138     NamedDecl *NewD = DeclClonePragmaWeak(ND, W.getAlias(), W.getLocation());
   5139     NewD->addAttr(::new (Context) AliasAttr(W.getLocation(), Context,
   5140                                             NDId->getName()));
   5141     NewD->addAttr(::new (Context) WeakAttr(W.getLocation(), Context));
   5142     WeakTopLevelDecl.push_back(NewD);
   5143     // FIXME: "hideous" code from Sema::LazilyCreateBuiltin
   5144     // to insert Decl at TU scope, sorry.
   5145     DeclContext *SavedContext = CurContext;
   5146     CurContext = Context.getTranslationUnitDecl();
   5147     PushOnScopeChains(NewD, S);
   5148     CurContext = SavedContext;
   5149   } else { // just add weak to existing
   5150     ND->addAttr(::new (Context) WeakAttr(W.getLocation(), Context));
   5151   }
   5152 }
   5153 
   5154 void Sema::ProcessPragmaWeak(Scope *S, Decl *D) {
   5155   // It's valid to "forward-declare" #pragma weak, in which case we
   5156   // have to do this.
   5157   LoadExternalWeakUndeclaredIdentifiers();
   5158   if (!WeakUndeclaredIdentifiers.empty()) {
   5159     NamedDecl *ND = NULL;
   5160     if (VarDecl *VD = dyn_cast<VarDecl>(D))
   5161       if (VD->isExternC())
   5162         ND = VD;
   5163     if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
   5164       if (FD->isExternC())
   5165         ND = FD;
   5166     if (ND) {
   5167       if (IdentifierInfo *Id = ND->getIdentifier()) {
   5168         llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator I
   5169           = WeakUndeclaredIdentifiers.find(Id);
   5170         if (I != WeakUndeclaredIdentifiers.end()) {
   5171           WeakInfo W = I->second;
   5172           DeclApplyPragmaWeak(S, ND, W);
   5173           WeakUndeclaredIdentifiers[Id] = W;
   5174         }
   5175       }
   5176     }
   5177   }
   5178 }
   5179 
   5180 /// ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in
   5181 /// it, apply them to D.  This is a bit tricky because PD can have attributes
   5182 /// specified in many different places, and we need to find and apply them all.
   5183 void Sema::ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD,
   5184                                  bool NonInheritable, bool Inheritable) {
   5185   // Apply decl attributes from the DeclSpec if present.
   5186   if (const AttributeList *Attrs = PD.getDeclSpec().getAttributes().getList())
   5187     ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
   5188 
   5189   // Walk the declarator structure, applying decl attributes that were in a type
   5190   // position to the decl itself.  This handles cases like:
   5191   //   int *__attr__(x)** D;
   5192   // when X is a decl attribute.
   5193   for (unsigned i = 0, e = PD.getNumTypeObjects(); i != e; ++i)
   5194     if (const AttributeList *Attrs = PD.getTypeObject(i).getAttrs())
   5195       ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable,
   5196                                /*IncludeCXX11Attributes=*/false);
   5197 
   5198   // Finally, apply any attributes on the decl itself.
   5199   if (const AttributeList *Attrs = PD.getAttributes())
   5200     ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
   5201 }
   5202 
   5203 /// Is the given declaration allowed to use a forbidden type?
   5204 static bool isForbiddenTypeAllowed(Sema &S, Decl *decl) {
   5205   // Private ivars are always okay.  Unfortunately, people don't
   5206   // always properly make their ivars private, even in system headers.
   5207   // Plus we need to make fields okay, too.
   5208   // Function declarations in sys headers will be marked unavailable.
   5209   if (!isa<FieldDecl>(decl) && !isa<ObjCPropertyDecl>(decl) &&
   5210       !isa<FunctionDecl>(decl))
   5211     return false;
   5212 
   5213   // Require it to be declared in a system header.
   5214   return S.Context.getSourceManager().isInSystemHeader(decl->getLocation());
   5215 }
   5216 
   5217 /// Handle a delayed forbidden-type diagnostic.
   5218 static void handleDelayedForbiddenType(Sema &S, DelayedDiagnostic &diag,
   5219                                        Decl *decl) {
   5220   if (decl && isForbiddenTypeAllowed(S, decl)) {
   5221     decl->addAttr(new (S.Context) UnavailableAttr(diag.Loc, S.Context,
   5222                         "this system declaration uses an unsupported type"));
   5223     return;
   5224   }
   5225   if (S.getLangOpts().ObjCAutoRefCount)
   5226     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(decl)) {
   5227       // FIXME: we may want to suppress diagnostics for all
   5228       // kind of forbidden type messages on unavailable functions.
   5229       if (FD->hasAttr<UnavailableAttr>() &&
   5230           diag.getForbiddenTypeDiagnostic() ==
   5231           diag::err_arc_array_param_no_ownership) {
   5232         diag.Triggered = true;
   5233         return;
   5234       }
   5235     }
   5236 
   5237   S.Diag(diag.Loc, diag.getForbiddenTypeDiagnostic())
   5238     << diag.getForbiddenTypeOperand() << diag.getForbiddenTypeArgument();
   5239   diag.Triggered = true;
   5240 }
   5241 
   5242 void Sema::PopParsingDeclaration(ParsingDeclState state, Decl *decl) {
   5243   assert(DelayedDiagnostics.getCurrentPool());
   5244   DelayedDiagnosticPool &poppedPool = *DelayedDiagnostics.getCurrentPool();
   5245   DelayedDiagnostics.popWithoutEmitting(state);
   5246 
   5247   // When delaying diagnostics to run in the context of a parsed
   5248   // declaration, we only want to actually emit anything if parsing
   5249   // succeeds.
   5250   if (!decl) return;
   5251 
   5252   // We emit all the active diagnostics in this pool or any of its
   5253   // parents.  In general, we'll get one pool for the decl spec
   5254   // and a child pool for each declarator; in a decl group like:
   5255   //   deprecated_typedef foo, *bar, baz();
   5256   // only the declarator pops will be passed decls.  This is correct;
   5257   // we really do need to consider delayed diagnostics from the decl spec
   5258   // for each of the different declarations.
   5259   const DelayedDiagnosticPool *pool = &poppedPool;
   5260   do {
   5261     for (DelayedDiagnosticPool::pool_iterator
   5262            i = pool->pool_begin(), e = pool->pool_end(); i != e; ++i) {
   5263       // This const_cast is a bit lame.  Really, Triggered should be mutable.
   5264       DelayedDiagnostic &diag = const_cast<DelayedDiagnostic&>(*i);
   5265       if (diag.Triggered)
   5266         continue;
   5267 
   5268       switch (diag.Kind) {
   5269       case DelayedDiagnostic::Deprecation:
   5270         // Don't bother giving deprecation diagnostics if the decl is invalid.
   5271         if (!decl->isInvalidDecl())
   5272           HandleDelayedDeprecationCheck(diag, decl);
   5273         break;
   5274 
   5275       case DelayedDiagnostic::Access:
   5276         HandleDelayedAccessCheck(diag, decl);
   5277         break;
   5278 
   5279       case DelayedDiagnostic::ForbiddenType:
   5280         handleDelayedForbiddenType(*this, diag, decl);
   5281         break;
   5282       }
   5283     }
   5284   } while ((pool = pool->getParent()));
   5285 }
   5286 
   5287 /// Given a set of delayed diagnostics, re-emit them as if they had
   5288 /// been delayed in the current context instead of in the given pool.
   5289 /// Essentially, this just moves them to the current pool.
   5290 void Sema::redelayDiagnostics(DelayedDiagnosticPool &pool) {
   5291   DelayedDiagnosticPool *curPool = DelayedDiagnostics.getCurrentPool();
   5292   assert(curPool && "re-emitting in undelayed context not supported");
   5293   curPool->steal(pool);
   5294 }
   5295 
   5296 static bool isDeclDeprecated(Decl *D) {
   5297   do {
   5298     if (D->isDeprecated())
   5299       return true;
   5300     // A category implicitly has the availability of the interface.
   5301     if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(D))
   5302       return CatD->getClassInterface()->isDeprecated();
   5303   } while ((D = cast_or_null<Decl>(D->getDeclContext())));
   5304   return false;
   5305 }
   5306 
   5307 static void
   5308 DoEmitDeprecationWarning(Sema &S, const NamedDecl *D, StringRef Message,
   5309                          SourceLocation Loc,
   5310                          const ObjCInterfaceDecl *UnknownObjCClass,
   5311                          const ObjCPropertyDecl *ObjCPropery) {
   5312   DeclarationName Name = D->getDeclName();
   5313   if (!Message.empty()) {
   5314     S.Diag(Loc, diag::warn_deprecated_message) << Name << Message;
   5315     S.Diag(D->getLocation(),
   5316            isa<ObjCMethodDecl>(D) ? diag::note_method_declared_at
   5317                                   : diag::note_previous_decl) << Name;
   5318     if (ObjCPropery)
   5319       S.Diag(ObjCPropery->getLocation(), diag::note_property_attribute)
   5320         << ObjCPropery->getDeclName() << 0;
   5321   } else if (!UnknownObjCClass) {
   5322     S.Diag(Loc, diag::warn_deprecated) << D->getDeclName();
   5323     S.Diag(D->getLocation(),
   5324            isa<ObjCMethodDecl>(D) ? diag::note_method_declared_at
   5325                                   : diag::note_previous_decl) << Name;
   5326     if (ObjCPropery)
   5327       S.Diag(ObjCPropery->getLocation(), diag::note_property_attribute)
   5328         << ObjCPropery->getDeclName() << 0;
   5329   } else {
   5330     S.Diag(Loc, diag::warn_deprecated_fwdclass_message) << Name;
   5331     S.Diag(UnknownObjCClass->getLocation(), diag::note_forward_class);
   5332   }
   5333 }
   5334 
   5335 void Sema::HandleDelayedDeprecationCheck(DelayedDiagnostic &DD,
   5336                                          Decl *Ctx) {
   5337   if (isDeclDeprecated(Ctx))
   5338     return;
   5339 
   5340   DD.Triggered = true;
   5341   DoEmitDeprecationWarning(*this, DD.getDeprecationDecl(),
   5342                            DD.getDeprecationMessage(), DD.Loc,
   5343                            DD.getUnknownObjCClass(),
   5344                            DD.getObjCProperty());
   5345 }
   5346 
   5347 void Sema::EmitDeprecationWarning(NamedDecl *D, StringRef Message,
   5348                                   SourceLocation Loc,
   5349                                   const ObjCInterfaceDecl *UnknownObjCClass,
   5350                                   const ObjCPropertyDecl  *ObjCProperty) {
   5351   // Delay if we're currently parsing a declaration.
   5352   if (DelayedDiagnostics.shouldDelayDiagnostics()) {
   5353     DelayedDiagnostics.add(DelayedDiagnostic::makeDeprecation(Loc, D,
   5354                                                               UnknownObjCClass,
   5355                                                               ObjCProperty,
   5356                                                               Message));
   5357     return;
   5358   }
   5359 
   5360   // Otherwise, don't warn if our current context is deprecated.
   5361   if (isDeclDeprecated(cast<Decl>(getCurLexicalContext())))
   5362     return;
   5363   DoEmitDeprecationWarning(*this, D, Message, Loc, UnknownObjCClass, ObjCProperty);
   5364 }
   5365