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/DeclCXX.h"
     18 #include "clang/AST/DeclTemplate.h"
     19 #include "clang/AST/DeclObjC.h"
     20 #include "clang/AST/Expr.h"
     21 #include "clang/Basic/SourceManager.h"
     22 #include "clang/Basic/TargetInfo.h"
     23 #include "clang/Sema/DeclSpec.h"
     24 #include "clang/Sema/DelayedDiagnostic.h"
     25 #include "clang/Sema/Lookup.h"
     26 #include "llvm/ADT/StringExtras.h"
     27 using namespace clang;
     28 using namespace sema;
     29 
     30 /// These constants match the enumerated choices of
     31 /// warn_attribute_wrong_decl_type and err_attribute_wrong_decl_type.
     32 enum AttributeDeclKind {
     33   ExpectedFunction,
     34   ExpectedUnion,
     35   ExpectedVariableOrFunction,
     36   ExpectedFunctionOrMethod,
     37   ExpectedParameter,
     38   ExpectedParameterOrMethod,
     39   ExpectedFunctionMethodOrBlock,
     40   ExpectedClassOrVirtualMethod,
     41   ExpectedFunctionMethodOrParameter,
     42   ExpectedClass,
     43   ExpectedVirtualMethod,
     44   ExpectedClassMember,
     45   ExpectedVariable,
     46   ExpectedMethod,
     47   ExpectedVariableFunctionOrLabel,
     48   ExpectedFieldOrGlobalVar
     49 };
     50 
     51 //===----------------------------------------------------------------------===//
     52 //  Helper functions
     53 //===----------------------------------------------------------------------===//
     54 
     55 static const FunctionType *getFunctionType(const Decl *D,
     56                                            bool blocksToo = true) {
     57   QualType Ty;
     58   if (const ValueDecl *decl = dyn_cast<ValueDecl>(D))
     59     Ty = decl->getType();
     60   else if (const FieldDecl *decl = dyn_cast<FieldDecl>(D))
     61     Ty = decl->getType();
     62   else if (const TypedefNameDecl* decl = dyn_cast<TypedefNameDecl>(D))
     63     Ty = decl->getUnderlyingType();
     64   else
     65     return 0;
     66 
     67   if (Ty->isFunctionPointerType())
     68     Ty = Ty->getAs<PointerType>()->getPointeeType();
     69   else if (blocksToo && Ty->isBlockPointerType())
     70     Ty = Ty->getAs<BlockPointerType>()->getPointeeType();
     71 
     72   return Ty->getAs<FunctionType>();
     73 }
     74 
     75 // FIXME: We should provide an abstraction around a method or function
     76 // to provide the following bits of information.
     77 
     78 /// isFunction - Return true if the given decl has function
     79 /// type (function or function-typed variable).
     80 static bool isFunction(const Decl *D) {
     81   return getFunctionType(D, false) != NULL;
     82 }
     83 
     84 /// isFunctionOrMethod - Return true if the given decl has function
     85 /// type (function or function-typed variable) or an Objective-C
     86 /// method.
     87 static bool isFunctionOrMethod(const Decl *D) {
     88   return isFunction(D)|| isa<ObjCMethodDecl>(D);
     89 }
     90 
     91 /// isFunctionOrMethodOrBlock - Return true if the given decl has function
     92 /// type (function or function-typed variable) or an Objective-C
     93 /// method or a block.
     94 static bool isFunctionOrMethodOrBlock(const Decl *D) {
     95   if (isFunctionOrMethod(D))
     96     return true;
     97   // check for block is more involved.
     98   if (const VarDecl *V = dyn_cast<VarDecl>(D)) {
     99     QualType Ty = V->getType();
    100     return Ty->isBlockPointerType();
    101   }
    102   return isa<BlockDecl>(D);
    103 }
    104 
    105 /// Return true if the given decl has a declarator that should have
    106 /// been processed by Sema::GetTypeForDeclarator.
    107 static bool hasDeclarator(const Decl *D) {
    108   // In some sense, TypedefDecl really *ought* to be a DeclaratorDecl.
    109   return isa<DeclaratorDecl>(D) || isa<BlockDecl>(D) || isa<TypedefNameDecl>(D) ||
    110          isa<ObjCPropertyDecl>(D);
    111 }
    112 
    113 /// hasFunctionProto - Return true if the given decl has a argument
    114 /// information. This decl should have already passed
    115 /// isFunctionOrMethod or isFunctionOrMethodOrBlock.
    116 static bool hasFunctionProto(const Decl *D) {
    117   if (const FunctionType *FnTy = getFunctionType(D))
    118     return isa<FunctionProtoType>(FnTy);
    119   else {
    120     assert(isa<ObjCMethodDecl>(D) || isa<BlockDecl>(D));
    121     return true;
    122   }
    123 }
    124 
    125 /// getFunctionOrMethodNumArgs - Return number of function or method
    126 /// arguments. It is an error to call this on a K&R function (use
    127 /// hasFunctionProto first).
    128 static unsigned getFunctionOrMethodNumArgs(const Decl *D) {
    129   if (const FunctionType *FnTy = getFunctionType(D))
    130     return cast<FunctionProtoType>(FnTy)->getNumArgs();
    131   if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
    132     return BD->getNumParams();
    133   return cast<ObjCMethodDecl>(D)->param_size();
    134 }
    135 
    136 static QualType getFunctionOrMethodArgType(const Decl *D, unsigned Idx) {
    137   if (const FunctionType *FnTy = getFunctionType(D))
    138     return cast<FunctionProtoType>(FnTy)->getArgType(Idx);
    139   if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
    140     return BD->getParamDecl(Idx)->getType();
    141 
    142   return cast<ObjCMethodDecl>(D)->param_begin()[Idx]->getType();
    143 }
    144 
    145 static QualType getFunctionOrMethodResultType(const Decl *D) {
    146   if (const FunctionType *FnTy = getFunctionType(D))
    147     return cast<FunctionProtoType>(FnTy)->getResultType();
    148   return cast<ObjCMethodDecl>(D)->getResultType();
    149 }
    150 
    151 static bool isFunctionOrMethodVariadic(const Decl *D) {
    152   if (const FunctionType *FnTy = getFunctionType(D)) {
    153     const FunctionProtoType *proto = cast<FunctionProtoType>(FnTy);
    154     return proto->isVariadic();
    155   } else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D))
    156     return BD->isVariadic();
    157   else {
    158     return cast<ObjCMethodDecl>(D)->isVariadic();
    159   }
    160 }
    161 
    162 static bool isInstanceMethod(const Decl *D) {
    163   if (const CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(D))
    164     return MethodDecl->isInstance();
    165   return false;
    166 }
    167 
    168 static inline bool isNSStringType(QualType T, ASTContext &Ctx) {
    169   const ObjCObjectPointerType *PT = T->getAs<ObjCObjectPointerType>();
    170   if (!PT)
    171     return false;
    172 
    173   ObjCInterfaceDecl *Cls = PT->getObjectType()->getInterface();
    174   if (!Cls)
    175     return false;
    176 
    177   IdentifierInfo* ClsName = Cls->getIdentifier();
    178 
    179   // FIXME: Should we walk the chain of classes?
    180   return ClsName == &Ctx.Idents.get("NSString") ||
    181          ClsName == &Ctx.Idents.get("NSMutableString");
    182 }
    183 
    184 static inline bool isCFStringType(QualType T, ASTContext &Ctx) {
    185   const PointerType *PT = T->getAs<PointerType>();
    186   if (!PT)
    187     return false;
    188 
    189   const RecordType *RT = PT->getPointeeType()->getAs<RecordType>();
    190   if (!RT)
    191     return false;
    192 
    193   const RecordDecl *RD = RT->getDecl();
    194   if (RD->getTagKind() != TTK_Struct)
    195     return false;
    196 
    197   return RD->getIdentifier() == &Ctx.Idents.get("__CFString");
    198 }
    199 
    200 /// \brief Check if the attribute has exactly as many args as Num. May
    201 /// output an error.
    202 static bool checkAttributeNumArgs(Sema &S, const AttributeList &Attr,
    203                                   unsigned int Num) {
    204   if (Attr.getNumArgs() != Num) {
    205     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << Num;
    206     return false;
    207   }
    208 
    209   return true;
    210 }
    211 
    212 
    213 /// \brief Check if the attribute has at least as many args as Num. May
    214 /// output an error.
    215 static bool checkAttributeAtLeastNumArgs(Sema &S, const AttributeList &Attr,
    216                                   unsigned int Num) {
    217   if (Attr.getNumArgs() < Num) {
    218     S.Diag(Attr.getLoc(), diag::err_attribute_too_few_arguments) << Num;
    219     return false;
    220   }
    221 
    222   return true;
    223 }
    224 
    225 ///
    226 /// \brief Check if passed in Decl is a field or potentially shared global var
    227 /// \return true if the Decl is a field or potentially shared global variable
    228 ///
    229 static bool mayBeSharedVariable(const Decl *D) {
    230   if (isa<FieldDecl>(D))
    231     return true;
    232   if (const VarDecl *vd = dyn_cast<VarDecl>(D))
    233     return (vd->hasGlobalStorage() && !(vd->isThreadSpecified()));
    234 
    235   return false;
    236 }
    237 
    238 /// \brief Check if the passed-in expression is of type int or bool.
    239 static bool isIntOrBool(Expr *Exp) {
    240   QualType QT = Exp->getType();
    241   return QT->isBooleanType() || QT->isIntegerType();
    242 }
    243 
    244 ///
    245 /// \brief Check if passed in Decl is a pointer type.
    246 /// Note that this function may produce an error message.
    247 /// \return true if the Decl is a pointer type; false otherwise
    248 ///
    249 static bool checkIsPointer(Sema &S, const Decl *D, const AttributeList &Attr) {
    250   if (const ValueDecl *vd = dyn_cast<ValueDecl>(D)) {
    251     QualType QT = vd->getType();
    252     if (QT->isAnyPointerType())
    253       return true;
    254     S.Diag(Attr.getLoc(), diag::warn_pointer_attribute_wrong_type)
    255       << Attr.getName()->getName() << QT;
    256   } else {
    257     S.Diag(Attr.getLoc(), diag::err_attribute_can_be_applied_only_to_value_decl)
    258       << Attr.getName();
    259   }
    260   return false;
    261 }
    262 
    263 /// \brief Checks that the passed in QualType either is of RecordType or points
    264 /// to RecordType. Returns the relevant RecordType, null if it does not exit.
    265 static const RecordType *getRecordType(QualType QT) {
    266   if (const RecordType *RT = QT->getAs<RecordType>())
    267     return RT;
    268 
    269   // Now check if we point to record type.
    270   if (const PointerType *PT = QT->getAs<PointerType>())
    271     return PT->getPointeeType()->getAs<RecordType>();
    272 
    273   return 0;
    274 }
    275 
    276 /// \brief Thread Safety Analysis: Checks that the passed in RecordType
    277 /// resolves to a lockable object. May flag an error.
    278 static bool checkForLockableRecord(Sema &S, Decl *D, const AttributeList &Attr,
    279                                    const RecordType *RT) {
    280   // Flag error if could not get record type for this argument.
    281   if (!RT) {
    282     S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_class)
    283       << Attr.getName();
    284     return false;
    285   }
    286   // Flag error if the type is not lockable.
    287   if (!RT->getDecl()->getAttr<LockableAttr>()) {
    288     S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_lockable)
    289       << Attr.getName();
    290     return false;
    291   }
    292   return true;
    293 }
    294 
    295 /// \brief Thread Safety Analysis: Checks that all attribute arguments, starting
    296 /// from Sidx, resolve to a lockable object. May flag an error.
    297 /// \param Sidx The attribute argument index to start checking with.
    298 /// \param ParamIdxOk Whether an argument can be indexing into a function
    299 /// parameter list.
    300 static bool checkAttrArgsAreLockableObjs(Sema &S, Decl *D,
    301                                          const AttributeList &Attr,
    302                                          SmallVectorImpl<Expr*> &Args,
    303                                          int Sidx = 0,
    304                                          bool ParamIdxOk = false) {
    305   for(unsigned Idx = Sidx; Idx < Attr.getNumArgs(); ++Idx) {
    306     Expr *ArgExp = Attr.getArg(Idx);
    307 
    308     if (ArgExp->isTypeDependent()) {
    309       // FIXME -- need to processs this again on template instantiation
    310       Args.push_back(ArgExp);
    311       continue;
    312     }
    313 
    314     QualType ArgTy = ArgExp->getType();
    315 
    316     // First see if we can just cast to record type, or point to record type.
    317     const RecordType *RT = getRecordType(ArgTy);
    318 
    319     // Now check if we index into a record type function param.
    320     if(!RT && ParamIdxOk) {
    321       FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
    322       IntegerLiteral *IL = dyn_cast<IntegerLiteral>(ArgExp);
    323       if(FD && IL) {
    324         unsigned int NumParams = FD->getNumParams();
    325         llvm::APInt ArgValue = IL->getValue();
    326         uint64_t ParamIdxFromOne = ArgValue.getZExtValue();
    327         uint64_t ParamIdxFromZero = ParamIdxFromOne - 1;
    328         if(!ArgValue.isStrictlyPositive() || ParamIdxFromOne > NumParams) {
    329           S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_range)
    330             << Attr.getName() << Idx + 1 << NumParams;
    331           return false;
    332         }
    333         ArgTy = FD->getParamDecl(ParamIdxFromZero)->getType();
    334         RT = getRecordType(ArgTy);
    335       }
    336     }
    337 
    338     if (!checkForLockableRecord(S, D, Attr, RT))
    339       return false;
    340 
    341     Args.push_back(ArgExp);
    342   }
    343   return true;
    344 }
    345 
    346 //===----------------------------------------------------------------------===//
    347 // Attribute Implementations
    348 //===----------------------------------------------------------------------===//
    349 
    350 // FIXME: All this manual attribute parsing code is gross. At the
    351 // least add some helper functions to check most argument patterns (#
    352 // and types of args).
    353 
    354 static void handleGuardedVarAttr(Sema &S, Decl *D, const AttributeList &Attr,
    355                                  bool pointer = false) {
    356   assert(!Attr.isInvalid());
    357 
    358   if (!checkAttributeNumArgs(S, Attr, 0))
    359     return;
    360 
    361   // D must be either a member field or global (potentially shared) variable.
    362   if (!mayBeSharedVariable(D)) {
    363     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    364       << Attr.getName() << ExpectedFieldOrGlobalVar;
    365     return;
    366   }
    367 
    368   if (pointer && !checkIsPointer(S, D, Attr))
    369     return;
    370 
    371   if (pointer)
    372     D->addAttr(::new (S.Context) PtGuardedVarAttr(Attr.getRange(), S.Context));
    373   else
    374     D->addAttr(::new (S.Context) GuardedVarAttr(Attr.getRange(), S.Context));
    375 }
    376 
    377 static void handleGuardedByAttr(Sema &S, Decl *D, const AttributeList &Attr,
    378                                 bool pointer = false) {
    379   assert(!Attr.isInvalid());
    380 
    381   if (!checkAttributeNumArgs(S, Attr, 1))
    382     return;
    383 
    384   Expr *Arg = Attr.getArg(0);
    385 
    386   // D must be either a member field or global (potentially shared) variable.
    387   if (!mayBeSharedVariable(D)) {
    388     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    389       << Attr.getName() << ExpectedFieldOrGlobalVar;
    390     return;
    391   }
    392 
    393   if (pointer && !checkIsPointer(S, D, Attr))
    394     return;
    395 
    396   if (Arg->isTypeDependent())
    397     // FIXME: handle attributes with dependent types
    398     return;
    399 
    400   // check that the argument is lockable object
    401   if (!checkForLockableRecord(S, D, Attr, getRecordType(Arg->getType())))
    402     return;
    403 
    404   if (pointer)
    405     D->addAttr(::new (S.Context) PtGuardedByAttr(Attr.getRange(),
    406                                                  S.Context, Arg));
    407   else
    408     D->addAttr(::new (S.Context) GuardedByAttr(Attr.getRange(), S.Context, Arg));
    409 }
    410 
    411 
    412 static void handleLockableAttr(Sema &S, Decl *D, const AttributeList &Attr,
    413                                bool scoped = false) {
    414   assert(!Attr.isInvalid());
    415 
    416   if (!checkAttributeNumArgs(S, Attr, 0))
    417     return;
    418 
    419   // FIXME: Lockable structs for C code.
    420   if (!isa<CXXRecordDecl>(D)) {
    421     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    422       << Attr.getName() << ExpectedClass;
    423     return;
    424   }
    425 
    426   if (scoped)
    427     D->addAttr(::new (S.Context) ScopedLockableAttr(Attr.getRange(), S.Context));
    428   else
    429     D->addAttr(::new (S.Context) LockableAttr(Attr.getRange(), S.Context));
    430 }
    431 
    432 static void handleNoThreadSafetyAttr(Sema &S, Decl *D,
    433                                      const AttributeList &Attr) {
    434   assert(!Attr.isInvalid());
    435 
    436   if (!checkAttributeNumArgs(S, Attr, 0))
    437     return;
    438 
    439   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    440     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    441       << Attr.getName() << ExpectedFunctionOrMethod;
    442     return;
    443   }
    444 
    445   D->addAttr(::new (S.Context) NoThreadSafetyAnalysisAttr(Attr.getRange(),
    446                                                           S.Context));
    447 }
    448 
    449 static void handleAcquireOrderAttr(Sema &S, Decl *D, const AttributeList &Attr,
    450                                    bool before) {
    451   assert(!Attr.isInvalid());
    452 
    453   if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
    454     return;
    455 
    456   // D must be either a member field or global (potentially shared) variable.
    457   ValueDecl *VD = dyn_cast<ValueDecl>(D);
    458   if (!VD || !mayBeSharedVariable(D)) {
    459     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    460       << Attr.getName() << ExpectedFieldOrGlobalVar;
    461     return;
    462   }
    463 
    464   // Check that this attribute only applies to lockable types
    465   QualType QT = VD->getType();
    466   if (!QT->isDependentType()) {
    467     const RecordType *RT = getRecordType(QT);
    468     if (!RT || !RT->getDecl()->getAttr<LockableAttr>()) {
    469       S.Diag(Attr.getLoc(), diag::err_attribute_decl_not_lockable)
    470               << Attr.getName();
    471       return;
    472     }
    473   }
    474 
    475   SmallVector<Expr*, 1> Args;
    476   // check that all arguments are lockable objects
    477   if (!checkAttrArgsAreLockableObjs(S, D, Attr, Args))
    478     return;
    479 
    480   unsigned Size = Args.size();
    481   assert(Size == Attr.getNumArgs());
    482   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    483 
    484   if (before)
    485     D->addAttr(::new (S.Context) AcquiredBeforeAttr(Attr.getRange(), S.Context,
    486                                                     StartArg, Size));
    487   else
    488     D->addAttr(::new (S.Context) AcquiredAfterAttr(Attr.getRange(), S.Context,
    489                                                    StartArg, Size));
    490 }
    491 
    492 static void handleLockFunAttr(Sema &S, Decl *D, const AttributeList &Attr,
    493                               bool exclusive = false) {
    494   assert(!Attr.isInvalid());
    495 
    496   // zero or more arguments ok
    497 
    498   // check that the attribute is applied to a function
    499   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    500     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    501       << Attr.getName() << ExpectedFunctionOrMethod;
    502     return;
    503   }
    504 
    505   // check that all arguments are lockable objects
    506   SmallVector<Expr*, 1> Args;
    507   if (!checkAttrArgsAreLockableObjs(S, D, Attr, Args, 0, /*ParamIdxOk=*/true))
    508     return;
    509 
    510   unsigned Size = Args.size();
    511   assert(Size == Attr.getNumArgs());
    512   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    513 
    514   if (exclusive)
    515     D->addAttr(::new (S.Context) ExclusiveLockFunctionAttr(Attr.getRange(),
    516                                                            S.Context, StartArg,
    517                                                            Size));
    518   else
    519     D->addAttr(::new (S.Context) SharedLockFunctionAttr(Attr.getRange(),
    520                                                         S.Context, StartArg,
    521                                                         Size));
    522 }
    523 
    524 static void handleTrylockFunAttr(Sema &S, Decl *D, const AttributeList &Attr,
    525                                  bool exclusive = false) {
    526   assert(!Attr.isInvalid());
    527 
    528   if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
    529     return;
    530 
    531 
    532   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    533     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    534       << Attr.getName() << ExpectedFunctionOrMethod;
    535     return;
    536   }
    537 
    538   if (!isIntOrBool(Attr.getArg(0))) {
    539     S.Diag(Attr.getLoc(), diag::err_attribute_first_argument_not_int_or_bool)
    540         << Attr.getName();
    541     return;
    542   }
    543 
    544   SmallVector<Expr*, 2> Args;
    545   // check that all arguments are lockable objects
    546   if (!checkAttrArgsAreLockableObjs(S, D, Attr, Args, 1))
    547     return;
    548 
    549   unsigned Size = Args.size();
    550   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    551 
    552   if (exclusive)
    553     D->addAttr(::new (S.Context) ExclusiveTrylockFunctionAttr(Attr.getRange(),
    554                                                               S.Context,
    555                                                               Attr.getArg(0),
    556                                                               StartArg, Size));
    557   else
    558     D->addAttr(::new (S.Context) SharedTrylockFunctionAttr(Attr.getRange(),
    559                                                            S.Context,
    560                                                            Attr.getArg(0),
    561                                                            StartArg, Size));
    562 }
    563 
    564 static void handleLocksRequiredAttr(Sema &S, Decl *D, const AttributeList &Attr,
    565                                     bool exclusive = false) {
    566   assert(!Attr.isInvalid());
    567 
    568   if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
    569     return;
    570 
    571   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    572     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    573       << Attr.getName() << ExpectedFunctionOrMethod;
    574     return;
    575   }
    576 
    577   // check that all arguments are lockable objects
    578   SmallVector<Expr*, 1> Args;
    579   if (!checkAttrArgsAreLockableObjs(S, D, Attr, Args))
    580     return;
    581 
    582   unsigned Size = Args.size();
    583   assert(Size == Attr.getNumArgs());
    584   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    585 
    586   if (exclusive)
    587     D->addAttr(::new (S.Context) ExclusiveLocksRequiredAttr(Attr.getRange(),
    588                                                             S.Context, StartArg,
    589                                                             Size));
    590   else
    591     D->addAttr(::new (S.Context) SharedLocksRequiredAttr(Attr.getRange(),
    592                                                          S.Context, StartArg,
    593                                                          Size));
    594 }
    595 
    596 static void handleUnlockFunAttr(Sema &S, Decl *D,
    597                                 const AttributeList &Attr) {
    598   assert(!Attr.isInvalid());
    599 
    600   // zero or more arguments ok
    601 
    602   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    603     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    604       << Attr.getName() << ExpectedFunctionOrMethod;
    605     return;
    606   }
    607 
    608   // check that all arguments are lockable objects
    609   SmallVector<Expr*, 1> Args;
    610   if (!checkAttrArgsAreLockableObjs(S, D, Attr, Args, 0, /*ParamIdxOk=*/true))
    611     return;
    612 
    613   unsigned Size = Args.size();
    614   assert(Size == Attr.getNumArgs());
    615   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    616 
    617   D->addAttr(::new (S.Context) UnlockFunctionAttr(Attr.getRange(), S.Context,
    618                                                   StartArg, Size));
    619 }
    620 
    621 static void handleLockReturnedAttr(Sema &S, Decl *D,
    622                                    const AttributeList &Attr) {
    623   assert(!Attr.isInvalid());
    624 
    625   if (!checkAttributeNumArgs(S, Attr, 1))
    626     return;
    627   Expr *Arg = Attr.getArg(0);
    628 
    629   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    630     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    631       << Attr.getName() << ExpectedFunctionOrMethod;
    632     return;
    633   }
    634 
    635   if (Arg->isTypeDependent())
    636     return;
    637 
    638   // check that the argument is lockable object
    639   if (!checkForLockableRecord(S, D, Attr, getRecordType(Arg->getType())))
    640     return;
    641 
    642   D->addAttr(::new (S.Context) LockReturnedAttr(Attr.getRange(), S.Context, Arg));
    643 }
    644 
    645 static void handleLocksExcludedAttr(Sema &S, Decl *D,
    646                                     const AttributeList &Attr) {
    647   assert(!Attr.isInvalid());
    648 
    649   if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
    650     return;
    651 
    652   if (!isa<FunctionDecl>(D) && !isa<FunctionTemplateDecl>(D)) {
    653     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    654       << Attr.getName() << ExpectedFunctionOrMethod;
    655     return;
    656   }
    657 
    658   // check that all arguments are lockable objects
    659   SmallVector<Expr*, 1> Args;
    660   if (!checkAttrArgsAreLockableObjs(S, D, Attr, Args))
    661     return;
    662 
    663   unsigned Size = Args.size();
    664   assert(Size == Attr.getNumArgs());
    665   Expr **StartArg = Size == 0 ? 0 : &Args[0];
    666 
    667   D->addAttr(::new (S.Context) LocksExcludedAttr(Attr.getRange(), S.Context,
    668                                                  StartArg, Size));
    669 }
    670 
    671 
    672 static void handleExtVectorTypeAttr(Sema &S, Scope *scope, Decl *D,
    673                                     const AttributeList &Attr) {
    674   TypedefNameDecl *tDecl = dyn_cast<TypedefNameDecl>(D);
    675   if (tDecl == 0) {
    676     S.Diag(Attr.getLoc(), diag::err_typecheck_ext_vector_not_typedef);
    677     return;
    678   }
    679 
    680   QualType curType = tDecl->getUnderlyingType();
    681 
    682   Expr *sizeExpr;
    683 
    684   // Special case where the argument is a template id.
    685   if (Attr.getParameterName()) {
    686     CXXScopeSpec SS;
    687     UnqualifiedId id;
    688     id.setIdentifier(Attr.getParameterName(), Attr.getLoc());
    689 
    690     ExprResult Size = S.ActOnIdExpression(scope, SS, id, false, false);
    691     if (Size.isInvalid())
    692       return;
    693 
    694     sizeExpr = Size.get();
    695   } else {
    696     // check the attribute arguments.
    697     if (!checkAttributeNumArgs(S, Attr, 1))
    698       return;
    699 
    700     sizeExpr = Attr.getArg(0);
    701   }
    702 
    703   // Instantiate/Install the vector type, and let Sema build the type for us.
    704   // This will run the reguired checks.
    705   QualType T = S.BuildExtVectorType(curType, sizeExpr, Attr.getLoc());
    706   if (!T.isNull()) {
    707     // FIXME: preserve the old source info.
    708     tDecl->setTypeSourceInfo(S.Context.getTrivialTypeSourceInfo(T));
    709 
    710     // Remember this typedef decl, we will need it later for diagnostics.
    711     S.ExtVectorDecls.push_back(tDecl);
    712   }
    713 }
    714 
    715 static void handlePackedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
    716   // check the attribute arguments.
    717   if (!checkAttributeNumArgs(S, Attr, 0))
    718     return;
    719 
    720   if (TagDecl *TD = dyn_cast<TagDecl>(D))
    721     TD->addAttr(::new (S.Context) PackedAttr(Attr.getRange(), S.Context));
    722   else if (FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
    723     // If the alignment is less than or equal to 8 bits, the packed attribute
    724     // has no effect.
    725     if (!FD->getType()->isIncompleteType() &&
    726         S.Context.getTypeAlign(FD->getType()) <= 8)
    727       S.Diag(Attr.getLoc(), diag::warn_attribute_ignored_for_field_of_type)
    728         << Attr.getName() << FD->getType();
    729     else
    730       FD->addAttr(::new (S.Context) PackedAttr(Attr.getRange(), S.Context));
    731   } else
    732     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
    733 }
    734 
    735 static void handleMsStructAttr(Sema &S, Decl *D, const AttributeList &Attr) {
    736   if (TagDecl *TD = dyn_cast<TagDecl>(D))
    737     TD->addAttr(::new (S.Context) MsStructAttr(Attr.getRange(), S.Context));
    738   else
    739     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
    740 }
    741 
    742 static void handleIBAction(Sema &S, Decl *D, const AttributeList &Attr) {
    743   // check the attribute arguments.
    744   if (!checkAttributeNumArgs(S, Attr, 0))
    745     return;
    746 
    747   // The IBAction attributes only apply to instance methods.
    748   if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
    749     if (MD->isInstanceMethod()) {
    750       D->addAttr(::new (S.Context) IBActionAttr(Attr.getRange(), S.Context));
    751       return;
    752     }
    753 
    754   S.Diag(Attr.getLoc(), diag::warn_attribute_ibaction) << Attr.getName();
    755 }
    756 
    757 static bool checkIBOutletCommon(Sema &S, Decl *D, const AttributeList &Attr) {
    758   // The IBOutlet/IBOutletCollection attributes only apply to instance
    759   // variables or properties of Objective-C classes.  The outlet must also
    760   // have an object reference type.
    761   if (const ObjCIvarDecl *VD = dyn_cast<ObjCIvarDecl>(D)) {
    762     if (!VD->getType()->getAs<ObjCObjectPointerType>()) {
    763       S.Diag(Attr.getLoc(), diag::err_iboutlet_object_type)
    764         << Attr.getName() << VD->getType() << 0;
    765       return false;
    766     }
    767   }
    768   else if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D)) {
    769     if (!PD->getType()->getAs<ObjCObjectPointerType>()) {
    770       S.Diag(Attr.getLoc(), diag::err_iboutlet_object_type)
    771         << Attr.getName() << PD->getType() << 1;
    772       return false;
    773     }
    774   }
    775   else {
    776     S.Diag(Attr.getLoc(), diag::warn_attribute_iboutlet) << Attr.getName();
    777     return false;
    778   }
    779 
    780   return true;
    781 }
    782 
    783 static void handleIBOutlet(Sema &S, Decl *D, const AttributeList &Attr) {
    784   // check the attribute arguments.
    785   if (!checkAttributeNumArgs(S, Attr, 0))
    786     return;
    787 
    788   if (!checkIBOutletCommon(S, D, Attr))
    789     return;
    790 
    791   D->addAttr(::new (S.Context) IBOutletAttr(Attr.getRange(), S.Context));
    792 }
    793 
    794 static void handleIBOutletCollection(Sema &S, Decl *D,
    795                                      const AttributeList &Attr) {
    796 
    797   // The iboutletcollection attribute can have zero or one arguments.
    798   if (Attr.getParameterName() && Attr.getNumArgs() > 0) {
    799     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
    800     return;
    801   }
    802 
    803   if (!checkIBOutletCommon(S, D, Attr))
    804     return;
    805 
    806   IdentifierInfo *II = Attr.getParameterName();
    807   if (!II)
    808     II = &S.Context.Idents.get("NSObject");
    809 
    810   ParsedType TypeRep = S.getTypeName(*II, Attr.getLoc(),
    811                         S.getScopeForContext(D->getDeclContext()->getParent()));
    812   if (!TypeRep) {
    813     S.Diag(Attr.getLoc(), diag::err_iboutletcollection_type) << II;
    814     return;
    815   }
    816   QualType QT = TypeRep.get();
    817   // Diagnose use of non-object type in iboutletcollection attribute.
    818   // FIXME. Gnu attribute extension ignores use of builtin types in
    819   // attributes. So, __attribute__((iboutletcollection(char))) will be
    820   // treated as __attribute__((iboutletcollection())).
    821   if (!QT->isObjCIdType() && !QT->isObjCObjectType()) {
    822     S.Diag(Attr.getLoc(), diag::err_iboutletcollection_type) << II;
    823     return;
    824   }
    825   D->addAttr(::new (S.Context) IBOutletCollectionAttr(Attr.getRange(),S.Context,
    826                                                    QT, Attr.getParameterLoc()));
    827 }
    828 
    829 static void possibleTransparentUnionPointerType(QualType &T) {
    830   if (const RecordType *UT = T->getAsUnionType())
    831     if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>()) {
    832       RecordDecl *UD = UT->getDecl();
    833       for (RecordDecl::field_iterator it = UD->field_begin(),
    834            itend = UD->field_end(); it != itend; ++it) {
    835         QualType QT = it->getType();
    836         if (QT->isAnyPointerType() || QT->isBlockPointerType()) {
    837           T = QT;
    838           return;
    839         }
    840       }
    841     }
    842 }
    843 
    844 static void handleNonNullAttr(Sema &S, Decl *D, const AttributeList &Attr) {
    845   // GCC ignores the nonnull attribute on K&R style function prototypes, so we
    846   // ignore it as well
    847   if (!isFunctionOrMethod(D) || !hasFunctionProto(D)) {
    848     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
    849       << Attr.getName() << ExpectedFunction;
    850     return;
    851   }
    852 
    853   // In C++ the implicit 'this' function parameter also counts, and they are
    854   // counted from one.
    855   bool HasImplicitThisParam = isInstanceMethod(D);
    856   unsigned NumArgs  = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
    857 
    858   // The nonnull attribute only applies to pointers.
    859   SmallVector<unsigned, 10> NonNullArgs;
    860 
    861   for (AttributeList::arg_iterator I=Attr.arg_begin(),
    862                                    E=Attr.arg_end(); I!=E; ++I) {
    863 
    864 
    865     // The argument must be an integer constant expression.
    866     Expr *Ex = *I;
    867     llvm::APSInt ArgNum(32);
    868     if (Ex->isTypeDependent() || Ex->isValueDependent() ||
    869         !Ex->isIntegerConstantExpr(ArgNum, S.Context)) {
    870       S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
    871         << "nonnull" << Ex->getSourceRange();
    872       return;
    873     }
    874 
    875     unsigned x = (unsigned) ArgNum.getZExtValue();
    876 
    877     if (x < 1 || x > NumArgs) {
    878       S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
    879        << "nonnull" << I.getArgNum() << Ex->getSourceRange();
    880       return;
    881     }
    882 
    883     --x;
    884     if (HasImplicitThisParam) {
    885       if (x == 0) {
    886         S.Diag(Attr.getLoc(),
    887                diag::err_attribute_invalid_implicit_this_argument)
    888           << "nonnull" << Ex->getSourceRange();
    889         return;
    890       }
    891       --x;
    892     }
    893 
    894     // Is the function argument a pointer type?
    895     QualType T = getFunctionOrMethodArgType(D, x).getNonReferenceType();
    896     possibleTransparentUnionPointerType(T);
    897 
    898     if (!T->isAnyPointerType() && !T->isBlockPointerType()) {
    899       // FIXME: Should also highlight argument in decl.
    900       S.Diag(Attr.getLoc(), diag::warn_nonnull_pointers_only)
    901         << "nonnull" << Ex->getSourceRange();
    902       continue;
    903     }
    904 
    905     NonNullArgs.push_back(x);
    906   }
    907 
    908   // If no arguments were specified to __attribute__((nonnull)) then all pointer
    909   // arguments have a nonnull attribute.
    910   if (NonNullArgs.empty()) {
    911     for (unsigned I = 0, E = getFunctionOrMethodNumArgs(D); I != E; ++I) {
    912       QualType T = getFunctionOrMethodArgType(D, I).getNonReferenceType();
    913       possibleTransparentUnionPointerType(T);
    914       if (T->isAnyPointerType() || T->isBlockPointerType())
    915         NonNullArgs.push_back(I);
    916     }
    917 
    918     // No pointer arguments?
    919     if (NonNullArgs.empty()) {
    920       // Warn the trivial case only if attribute is not coming from a
    921       // macro instantiation.
    922       if (Attr.getLoc().isFileID())
    923         S.Diag(Attr.getLoc(), diag::warn_attribute_nonnull_no_pointers);
    924       return;
    925     }
    926   }
    927 
    928   unsigned* start = &NonNullArgs[0];
    929   unsigned size = NonNullArgs.size();
    930   llvm::array_pod_sort(start, start + size);
    931   D->addAttr(::new (S.Context) NonNullAttr(Attr.getRange(), S.Context, start,
    932                                            size));
    933 }
    934 
    935 static void handleOwnershipAttr(Sema &S, Decl *D, const AttributeList &AL) {
    936   // This attribute must be applied to a function declaration.
    937   // The first argument to the attribute must be a string,
    938   // the name of the resource, for example "malloc".
    939   // The following arguments must be argument indexes, the arguments must be
    940   // of integer type for Returns, otherwise of pointer type.
    941   // The difference between Holds and Takes is that a pointer may still be used
    942   // after being held.  free() should be __attribute((ownership_takes)), whereas
    943   // a list append function may well be __attribute((ownership_holds)).
    944 
    945   if (!AL.getParameterName()) {
    946     S.Diag(AL.getLoc(), diag::err_attribute_argument_n_not_string)
    947         << AL.getName()->getName() << 1;
    948     return;
    949   }
    950   // Figure out our Kind, and check arguments while we're at it.
    951   OwnershipAttr::OwnershipKind K;
    952   switch (AL.getKind()) {
    953   case AttributeList::AT_ownership_takes:
    954     K = OwnershipAttr::Takes;
    955     if (AL.getNumArgs() < 1) {
    956       S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << 2;
    957       return;
    958     }
    959     break;
    960   case AttributeList::AT_ownership_holds:
    961     K = OwnershipAttr::Holds;
    962     if (AL.getNumArgs() < 1) {
    963       S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << 2;
    964       return;
    965     }
    966     break;
    967   case AttributeList::AT_ownership_returns:
    968     K = OwnershipAttr::Returns;
    969     if (AL.getNumArgs() > 1) {
    970       S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments)
    971           << AL.getNumArgs() + 1;
    972       return;
    973     }
    974     break;
    975   default:
    976     // This should never happen given how we are called.
    977     llvm_unreachable("Unknown ownership attribute");
    978   }
    979 
    980   if (!isFunction(D) || !hasFunctionProto(D)) {
    981     S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type)
    982       << AL.getName() << ExpectedFunction;
    983     return;
    984   }
    985 
    986   // In C++ the implicit 'this' function parameter also counts, and they are
    987   // counted from one.
    988   bool HasImplicitThisParam = isInstanceMethod(D);
    989   unsigned NumArgs  = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
    990 
    991   StringRef Module = AL.getParameterName()->getName();
    992 
    993   // Normalize the argument, __foo__ becomes foo.
    994   if (Module.startswith("__") && Module.endswith("__"))
    995     Module = Module.substr(2, Module.size() - 4);
    996 
    997   SmallVector<unsigned, 10> OwnershipArgs;
    998 
    999   for (AttributeList::arg_iterator I = AL.arg_begin(), E = AL.arg_end(); I != E;
   1000        ++I) {
   1001 
   1002     Expr *IdxExpr = *I;
   1003     llvm::APSInt ArgNum(32);
   1004     if (IdxExpr->isTypeDependent() || IdxExpr->isValueDependent()
   1005         || !IdxExpr->isIntegerConstantExpr(ArgNum, S.Context)) {
   1006       S.Diag(AL.getLoc(), diag::err_attribute_argument_not_int)
   1007           << AL.getName()->getName() << IdxExpr->getSourceRange();
   1008       continue;
   1009     }
   1010 
   1011     unsigned x = (unsigned) ArgNum.getZExtValue();
   1012 
   1013     if (x > NumArgs || x < 1) {
   1014       S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_bounds)
   1015           << AL.getName()->getName() << x << IdxExpr->getSourceRange();
   1016       continue;
   1017     }
   1018     --x;
   1019     if (HasImplicitThisParam) {
   1020       if (x == 0) {
   1021         S.Diag(AL.getLoc(), diag::err_attribute_invalid_implicit_this_argument)
   1022           << "ownership" << IdxExpr->getSourceRange();
   1023         return;
   1024       }
   1025       --x;
   1026     }
   1027 
   1028     switch (K) {
   1029     case OwnershipAttr::Takes:
   1030     case OwnershipAttr::Holds: {
   1031       // Is the function argument a pointer type?
   1032       QualType T = getFunctionOrMethodArgType(D, x);
   1033       if (!T->isAnyPointerType() && !T->isBlockPointerType()) {
   1034         // FIXME: Should also highlight argument in decl.
   1035         S.Diag(AL.getLoc(), diag::err_ownership_type)
   1036             << ((K==OwnershipAttr::Takes)?"ownership_takes":"ownership_holds")
   1037             << "pointer"
   1038             << IdxExpr->getSourceRange();
   1039         continue;
   1040       }
   1041       break;
   1042     }
   1043     case OwnershipAttr::Returns: {
   1044       if (AL.getNumArgs() > 1) {
   1045           // Is the function argument an integer type?
   1046           Expr *IdxExpr = AL.getArg(0);
   1047           llvm::APSInt ArgNum(32);
   1048           if (IdxExpr->isTypeDependent() || IdxExpr->isValueDependent()
   1049               || !IdxExpr->isIntegerConstantExpr(ArgNum, S.Context)) {
   1050             S.Diag(AL.getLoc(), diag::err_ownership_type)
   1051                 << "ownership_returns" << "integer"
   1052                 << IdxExpr->getSourceRange();
   1053             return;
   1054           }
   1055       }
   1056       break;
   1057     }
   1058     default:
   1059       llvm_unreachable("Unknown ownership attribute");
   1060     } // switch
   1061 
   1062     // Check we don't have a conflict with another ownership attribute.
   1063     for (specific_attr_iterator<OwnershipAttr>
   1064           i = D->specific_attr_begin<OwnershipAttr>(),
   1065           e = D->specific_attr_end<OwnershipAttr>();
   1066         i != e; ++i) {
   1067       if ((*i)->getOwnKind() != K) {
   1068         for (const unsigned *I = (*i)->args_begin(), *E = (*i)->args_end();
   1069              I!=E; ++I) {
   1070           if (x == *I) {
   1071             S.Diag(AL.getLoc(), diag::err_attributes_are_not_compatible)
   1072                 << AL.getName()->getName() << "ownership_*";
   1073           }
   1074         }
   1075       }
   1076     }
   1077     OwnershipArgs.push_back(x);
   1078   }
   1079 
   1080   unsigned* start = OwnershipArgs.data();
   1081   unsigned size = OwnershipArgs.size();
   1082   llvm::array_pod_sort(start, start + size);
   1083 
   1084   if (K != OwnershipAttr::Returns && OwnershipArgs.empty()) {
   1085     S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << 2;
   1086     return;
   1087   }
   1088 
   1089   D->addAttr(::new (S.Context) OwnershipAttr(AL.getLoc(), S.Context, K, Module,
   1090                                              start, size));
   1091 }
   1092 
   1093 /// Whether this declaration has internal linkage for the purposes of
   1094 /// things that want to complain about things not have internal linkage.
   1095 static bool hasEffectivelyInternalLinkage(NamedDecl *D) {
   1096   switch (D->getLinkage()) {
   1097   case NoLinkage:
   1098   case InternalLinkage:
   1099     return true;
   1100 
   1101   // Template instantiations that go from external to unique-external
   1102   // shouldn't get diagnosed.
   1103   case UniqueExternalLinkage:
   1104     return true;
   1105 
   1106   case ExternalLinkage:
   1107     return false;
   1108   }
   1109   llvm_unreachable("unknown linkage kind!");
   1110   return false;
   1111 }
   1112 
   1113 static void handleWeakRefAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1114   // Check the attribute arguments.
   1115   if (Attr.getNumArgs() > 1) {
   1116     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   1117     return;
   1118   }
   1119 
   1120   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) {
   1121     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1122       << Attr.getName() << ExpectedVariableOrFunction;
   1123     return;
   1124   }
   1125 
   1126   NamedDecl *nd = cast<NamedDecl>(D);
   1127 
   1128   // gcc rejects
   1129   // class c {
   1130   //   static int a __attribute__((weakref ("v2")));
   1131   //   static int b() __attribute__((weakref ("f3")));
   1132   // };
   1133   // and ignores the attributes of
   1134   // void f(void) {
   1135   //   static int a __attribute__((weakref ("v2")));
   1136   // }
   1137   // we reject them
   1138   const DeclContext *Ctx = D->getDeclContext()->getRedeclContext();
   1139   if (!Ctx->isFileContext()) {
   1140     S.Diag(Attr.getLoc(), diag::err_attribute_weakref_not_global_context) <<
   1141         nd->getNameAsString();
   1142     return;
   1143   }
   1144 
   1145   // The GCC manual says
   1146   //
   1147   // At present, a declaration to which `weakref' is attached can only
   1148   // be `static'.
   1149   //
   1150   // It also says
   1151   //
   1152   // Without a TARGET,
   1153   // given as an argument to `weakref' or to `alias', `weakref' is
   1154   // equivalent to `weak'.
   1155   //
   1156   // gcc 4.4.1 will accept
   1157   // int a7 __attribute__((weakref));
   1158   // as
   1159   // int a7 __attribute__((weak));
   1160   // This looks like a bug in gcc. We reject that for now. We should revisit
   1161   // it if this behaviour is actually used.
   1162 
   1163   if (!hasEffectivelyInternalLinkage(nd)) {
   1164     S.Diag(Attr.getLoc(), diag::err_attribute_weakref_not_static);
   1165     return;
   1166   }
   1167 
   1168   // GCC rejects
   1169   // static ((alias ("y"), weakref)).
   1170   // Should we? How to check that weakref is before or after alias?
   1171 
   1172   if (Attr.getNumArgs() == 1) {
   1173     Expr *Arg = Attr.getArg(0);
   1174     Arg = Arg->IgnoreParenCasts();
   1175     StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   1176 
   1177     if (!Str || !Str->isAscii()) {
   1178       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
   1179           << "weakref" << 1;
   1180       return;
   1181     }
   1182     // GCC will accept anything as the argument of weakref. Should we
   1183     // check for an existing decl?
   1184     D->addAttr(::new (S.Context) AliasAttr(Attr.getRange(), S.Context,
   1185                                            Str->getString()));
   1186   }
   1187 
   1188   D->addAttr(::new (S.Context) WeakRefAttr(Attr.getRange(), S.Context));
   1189 }
   1190 
   1191 static void handleAliasAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1192   // check the attribute arguments.
   1193   if (Attr.getNumArgs() != 1) {
   1194     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   1195     return;
   1196   }
   1197 
   1198   Expr *Arg = Attr.getArg(0);
   1199   Arg = Arg->IgnoreParenCasts();
   1200   StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   1201 
   1202   if (!Str || !Str->isAscii()) {
   1203     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
   1204       << "alias" << 1;
   1205     return;
   1206   }
   1207 
   1208   if (S.Context.getTargetInfo().getTriple().isOSDarwin()) {
   1209     S.Diag(Attr.getLoc(), diag::err_alias_not_supported_on_darwin);
   1210     return;
   1211   }
   1212 
   1213   // FIXME: check if target symbol exists in current file
   1214 
   1215   D->addAttr(::new (S.Context) AliasAttr(Attr.getRange(), S.Context,
   1216                                          Str->getString()));
   1217 }
   1218 
   1219 static void handleNakedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1220   // Check the attribute arguments.
   1221   if (!checkAttributeNumArgs(S, Attr, 0))
   1222     return;
   1223 
   1224   if (!isa<FunctionDecl>(D)) {
   1225     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1226       << Attr.getName() << ExpectedFunction;
   1227     return;
   1228   }
   1229 
   1230   D->addAttr(::new (S.Context) NakedAttr(Attr.getRange(), S.Context));
   1231 }
   1232 
   1233 static void handleAlwaysInlineAttr(Sema &S, Decl *D,
   1234                                    const AttributeList &Attr) {
   1235   // Check the attribute arguments.
   1236   if (Attr.hasParameterOrArguments()) {
   1237     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   1238     return;
   1239   }
   1240 
   1241   if (!isa<FunctionDecl>(D)) {
   1242     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1243       << Attr.getName() << ExpectedFunction;
   1244     return;
   1245   }
   1246 
   1247   D->addAttr(::new (S.Context) AlwaysInlineAttr(Attr.getRange(), S.Context));
   1248 }
   1249 
   1250 static void handleMallocAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1251   // Check the attribute arguments.
   1252   if (Attr.hasParameterOrArguments()) {
   1253     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   1254     return;
   1255   }
   1256 
   1257   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
   1258     QualType RetTy = FD->getResultType();
   1259     if (RetTy->isAnyPointerType() || RetTy->isBlockPointerType()) {
   1260       D->addAttr(::new (S.Context) MallocAttr(Attr.getRange(), S.Context));
   1261       return;
   1262     }
   1263   }
   1264 
   1265   S.Diag(Attr.getLoc(), diag::warn_attribute_malloc_pointer_only);
   1266 }
   1267 
   1268 static void handleMayAliasAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1269   // check the attribute arguments.
   1270   if (!checkAttributeNumArgs(S, Attr, 0))
   1271     return;
   1272 
   1273   D->addAttr(::new (S.Context) MayAliasAttr(Attr.getRange(), S.Context));
   1274 }
   1275 
   1276 static void handleNoCommonAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1277   assert(!Attr.isInvalid());
   1278   if (isa<VarDecl>(D))
   1279     D->addAttr(::new (S.Context) NoCommonAttr(Attr.getRange(), S.Context));
   1280   else
   1281     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1282       << Attr.getName() << ExpectedVariable;
   1283 }
   1284 
   1285 static void handleCommonAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1286   assert(!Attr.isInvalid());
   1287   if (isa<VarDecl>(D))
   1288     D->addAttr(::new (S.Context) CommonAttr(Attr.getRange(), S.Context));
   1289   else
   1290     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1291       << Attr.getName() << ExpectedVariable;
   1292 }
   1293 
   1294 static void handleNoReturnAttr(Sema &S, Decl *D, const AttributeList &attr) {
   1295   if (hasDeclarator(D)) return;
   1296 
   1297   if (S.CheckNoReturnAttr(attr)) return;
   1298 
   1299   if (!isa<ObjCMethodDecl>(D)) {
   1300     S.Diag(attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1301       << attr.getName() << ExpectedFunctionOrMethod;
   1302     return;
   1303   }
   1304 
   1305   D->addAttr(::new (S.Context) NoReturnAttr(attr.getRange(), S.Context));
   1306 }
   1307 
   1308 bool Sema::CheckNoReturnAttr(const AttributeList &attr) {
   1309   if (attr.hasParameterOrArguments()) {
   1310     Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   1311     attr.setInvalid();
   1312     return true;
   1313   }
   1314 
   1315   return false;
   1316 }
   1317 
   1318 static void handleAnalyzerNoReturnAttr(Sema &S, Decl *D,
   1319                                        const AttributeList &Attr) {
   1320 
   1321   // The checking path for 'noreturn' and 'analyzer_noreturn' are different
   1322   // because 'analyzer_noreturn' does not impact the type.
   1323 
   1324   if(!checkAttributeNumArgs(S, Attr, 0))
   1325       return;
   1326 
   1327   if (!isFunctionOrMethod(D) && !isa<BlockDecl>(D)) {
   1328     ValueDecl *VD = dyn_cast<ValueDecl>(D);
   1329     if (VD == 0 || (!VD->getType()->isBlockPointerType()
   1330                     && !VD->getType()->isFunctionPointerType())) {
   1331       S.Diag(Attr.getLoc(),
   1332              Attr.isCXX0XAttribute() ? diag::err_attribute_wrong_decl_type
   1333              : diag::warn_attribute_wrong_decl_type)
   1334         << Attr.getName() << ExpectedFunctionMethodOrBlock;
   1335       return;
   1336     }
   1337   }
   1338 
   1339   D->addAttr(::new (S.Context) AnalyzerNoReturnAttr(Attr.getRange(), S.Context));
   1340 }
   1341 
   1342 // PS3 PPU-specific.
   1343 static void handleVecReturnAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1344 /*
   1345   Returning a Vector Class in Registers
   1346 
   1347   According to the PPU ABI specifications, a class with a single member of
   1348   vector type is returned in memory when used as the return value of a function.
   1349   This results in inefficient code when implementing vector classes. To return
   1350   the value in a single vector register, add the vecreturn attribute to the
   1351   class definition. This attribute is also applicable to struct types.
   1352 
   1353   Example:
   1354 
   1355   struct Vector
   1356   {
   1357     __vector float xyzw;
   1358   } __attribute__((vecreturn));
   1359 
   1360   Vector Add(Vector lhs, Vector rhs)
   1361   {
   1362     Vector result;
   1363     result.xyzw = vec_add(lhs.xyzw, rhs.xyzw);
   1364     return result; // This will be returned in a register
   1365   }
   1366 */
   1367   if (!isa<RecordDecl>(D)) {
   1368     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1369       << Attr.getName() << ExpectedClass;
   1370     return;
   1371   }
   1372 
   1373   if (D->getAttr<VecReturnAttr>()) {
   1374     S.Diag(Attr.getLoc(), diag::err_repeat_attribute) << "vecreturn";
   1375     return;
   1376   }
   1377 
   1378   RecordDecl *record = cast<RecordDecl>(D);
   1379   int count = 0;
   1380 
   1381   if (!isa<CXXRecordDecl>(record)) {
   1382     S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_vector_member);
   1383     return;
   1384   }
   1385 
   1386   if (!cast<CXXRecordDecl>(record)->isPOD()) {
   1387     S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_pod_record);
   1388     return;
   1389   }
   1390 
   1391   for (RecordDecl::field_iterator iter = record->field_begin();
   1392        iter != record->field_end(); iter++) {
   1393     if ((count == 1) || !iter->getType()->isVectorType()) {
   1394       S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_vector_member);
   1395       return;
   1396     }
   1397     count++;
   1398   }
   1399 
   1400   D->addAttr(::new (S.Context) VecReturnAttr(Attr.getRange(), S.Context));
   1401 }
   1402 
   1403 static void handleDependencyAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1404   if (!isFunctionOrMethod(D) && !isa<ParmVarDecl>(D)) {
   1405     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1406       << Attr.getName() << ExpectedFunctionMethodOrParameter;
   1407     return;
   1408   }
   1409   // FIXME: Actually store the attribute on the declaration
   1410 }
   1411 
   1412 static void handleUnusedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1413   // check the attribute arguments.
   1414   if (Attr.hasParameterOrArguments()) {
   1415     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   1416     return;
   1417   }
   1418 
   1419   if (!isa<VarDecl>(D) && !isa<ObjCIvarDecl>(D) && !isFunctionOrMethod(D) &&
   1420       !isa<TypeDecl>(D) && !isa<LabelDecl>(D)) {
   1421     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1422       << Attr.getName() << ExpectedVariableFunctionOrLabel;
   1423     return;
   1424   }
   1425 
   1426   D->addAttr(::new (S.Context) UnusedAttr(Attr.getRange(), S.Context));
   1427 }
   1428 
   1429 static void handleReturnsTwiceAttr(Sema &S, Decl *D,
   1430                                    const AttributeList &Attr) {
   1431   // check the attribute arguments.
   1432   if (Attr.hasParameterOrArguments()) {
   1433     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   1434     return;
   1435   }
   1436 
   1437   if (!isa<FunctionDecl>(D)) {
   1438     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1439       << Attr.getName() << ExpectedFunction;
   1440     return;
   1441   }
   1442 
   1443   D->addAttr(::new (S.Context) ReturnsTwiceAttr(Attr.getRange(), S.Context));
   1444 }
   1445 
   1446 static void handleUsedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1447   // check the attribute arguments.
   1448   if (Attr.hasParameterOrArguments()) {
   1449     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   1450     return;
   1451   }
   1452 
   1453   if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
   1454     if (VD->hasLocalStorage() || VD->hasExternalStorage()) {
   1455       S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "used";
   1456       return;
   1457     }
   1458   } else if (!isFunctionOrMethod(D)) {
   1459     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1460       << Attr.getName() << ExpectedVariableOrFunction;
   1461     return;
   1462   }
   1463 
   1464   D->addAttr(::new (S.Context) UsedAttr(Attr.getRange(), S.Context));
   1465 }
   1466 
   1467 static void handleConstructorAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1468   // check the attribute arguments.
   1469   if (Attr.getNumArgs() > 1) {
   1470     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
   1471     return;
   1472   }
   1473 
   1474   int priority = 65535; // FIXME: Do not hardcode such constants.
   1475   if (Attr.getNumArgs() > 0) {
   1476     Expr *E = Attr.getArg(0);
   1477     llvm::APSInt Idx(32);
   1478     if (E->isTypeDependent() || E->isValueDependent() ||
   1479         !E->isIntegerConstantExpr(Idx, S.Context)) {
   1480       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
   1481         << "constructor" << 1 << E->getSourceRange();
   1482       return;
   1483     }
   1484     priority = Idx.getZExtValue();
   1485   }
   1486 
   1487   if (!isa<FunctionDecl>(D)) {
   1488     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1489       << Attr.getName() << ExpectedFunction;
   1490     return;
   1491   }
   1492 
   1493   D->addAttr(::new (S.Context) ConstructorAttr(Attr.getRange(), S.Context,
   1494                                                priority));
   1495 }
   1496 
   1497 static void handleDestructorAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1498   // check the attribute arguments.
   1499   if (Attr.getNumArgs() > 1) {
   1500     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
   1501     return;
   1502   }
   1503 
   1504   int priority = 65535; // FIXME: Do not hardcode such constants.
   1505   if (Attr.getNumArgs() > 0) {
   1506     Expr *E = Attr.getArg(0);
   1507     llvm::APSInt Idx(32);
   1508     if (E->isTypeDependent() || E->isValueDependent() ||
   1509         !E->isIntegerConstantExpr(Idx, S.Context)) {
   1510       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
   1511         << "destructor" << 1 << E->getSourceRange();
   1512       return;
   1513     }
   1514     priority = Idx.getZExtValue();
   1515   }
   1516 
   1517   if (!isa<FunctionDecl>(D)) {
   1518     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1519       << Attr.getName() << ExpectedFunction;
   1520     return;
   1521   }
   1522 
   1523   D->addAttr(::new (S.Context) DestructorAttr(Attr.getRange(), S.Context,
   1524                                               priority));
   1525 }
   1526 
   1527 static void handleDeprecatedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1528   unsigned NumArgs = Attr.getNumArgs();
   1529   if (NumArgs > 1) {
   1530     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
   1531     return;
   1532   }
   1533 
   1534   // Handle the case where deprecated attribute has a text message.
   1535   StringRef Str;
   1536   if (NumArgs == 1) {
   1537     StringLiteral *SE = dyn_cast<StringLiteral>(Attr.getArg(0));
   1538     if (!SE) {
   1539       S.Diag(Attr.getArg(0)->getLocStart(), diag::err_attribute_not_string)
   1540         << "deprecated";
   1541       return;
   1542     }
   1543     Str = SE->getString();
   1544   }
   1545 
   1546   D->addAttr(::new (S.Context) DeprecatedAttr(Attr.getRange(), S.Context, Str));
   1547 }
   1548 
   1549 static void handleUnavailableAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1550   unsigned NumArgs = Attr.getNumArgs();
   1551   if (NumArgs > 1) {
   1552     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 1;
   1553     return;
   1554   }
   1555 
   1556   // Handle the case where unavailable attribute has a text message.
   1557   StringRef Str;
   1558   if (NumArgs == 1) {
   1559     StringLiteral *SE = dyn_cast<StringLiteral>(Attr.getArg(0));
   1560     if (!SE) {
   1561       S.Diag(Attr.getArg(0)->getLocStart(),
   1562              diag::err_attribute_not_string) << "unavailable";
   1563       return;
   1564     }
   1565     Str = SE->getString();
   1566   }
   1567   D->addAttr(::new (S.Context) UnavailableAttr(Attr.getRange(), S.Context, Str));
   1568 }
   1569 
   1570 static void handleArcWeakrefUnavailableAttr(Sema &S, Decl *D,
   1571                                             const AttributeList &Attr) {
   1572   unsigned NumArgs = Attr.getNumArgs();
   1573   if (NumArgs > 0) {
   1574     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 0;
   1575     return;
   1576   }
   1577 
   1578   D->addAttr(::new (S.Context) ArcWeakrefUnavailableAttr(
   1579                                           Attr.getRange(), S.Context));
   1580 }
   1581 
   1582 static void handleAvailabilityAttr(Sema &S, Decl *D,
   1583                                    const AttributeList &Attr) {
   1584   IdentifierInfo *Platform = Attr.getParameterName();
   1585   SourceLocation PlatformLoc = Attr.getParameterLoc();
   1586 
   1587   StringRef PlatformName
   1588     = AvailabilityAttr::getPrettyPlatformName(Platform->getName());
   1589   if (PlatformName.empty()) {
   1590     S.Diag(PlatformLoc, diag::warn_availability_unknown_platform)
   1591       << Platform;
   1592 
   1593     PlatformName = Platform->getName();
   1594   }
   1595 
   1596   AvailabilityChange Introduced = Attr.getAvailabilityIntroduced();
   1597   AvailabilityChange Deprecated = Attr.getAvailabilityDeprecated();
   1598   AvailabilityChange Obsoleted = Attr.getAvailabilityObsoleted();
   1599   bool IsUnavailable = Attr.getUnavailableLoc().isValid();
   1600 
   1601   // Ensure that Introduced <= Deprecated <= Obsoleted (although not all
   1602   // of these steps are needed).
   1603   if (Introduced.isValid() && Deprecated.isValid() &&
   1604       !(Introduced.Version <= Deprecated.Version)) {
   1605     S.Diag(Introduced.KeywordLoc, diag::warn_availability_version_ordering)
   1606       << 1 << PlatformName << Deprecated.Version.getAsString()
   1607       << 0 << Introduced.Version.getAsString();
   1608     return;
   1609   }
   1610 
   1611   if (Introduced.isValid() && Obsoleted.isValid() &&
   1612       !(Introduced.Version <= Obsoleted.Version)) {
   1613     S.Diag(Introduced.KeywordLoc, diag::warn_availability_version_ordering)
   1614       << 2 << PlatformName << Obsoleted.Version.getAsString()
   1615       << 0 << Introduced.Version.getAsString();
   1616     return;
   1617   }
   1618 
   1619   if (Deprecated.isValid() && Obsoleted.isValid() &&
   1620       !(Deprecated.Version <= Obsoleted.Version)) {
   1621     S.Diag(Deprecated.KeywordLoc, diag::warn_availability_version_ordering)
   1622       << 2 << PlatformName << Obsoleted.Version.getAsString()
   1623       << 1 << Deprecated.Version.getAsString();
   1624     return;
   1625   }
   1626 
   1627   D->addAttr(::new (S.Context) AvailabilityAttr(Attr.getRange(), S.Context,
   1628                                                 Platform,
   1629                                                 Introduced.Version,
   1630                                                 Deprecated.Version,
   1631                                                 Obsoleted.Version,
   1632                                                 IsUnavailable));
   1633 }
   1634 
   1635 static void handleVisibilityAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1636   // check the attribute arguments.
   1637   if(!checkAttributeNumArgs(S, Attr, 1))
   1638     return;
   1639 
   1640   Expr *Arg = Attr.getArg(0);
   1641   Arg = Arg->IgnoreParenCasts();
   1642   StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   1643 
   1644   if (!Str || !Str->isAscii()) {
   1645     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
   1646       << "visibility" << 1;
   1647     return;
   1648   }
   1649 
   1650   StringRef TypeStr = Str->getString();
   1651   VisibilityAttr::VisibilityType type;
   1652 
   1653   if (TypeStr == "default")
   1654     type = VisibilityAttr::Default;
   1655   else if (TypeStr == "hidden")
   1656     type = VisibilityAttr::Hidden;
   1657   else if (TypeStr == "internal")
   1658     type = VisibilityAttr::Hidden; // FIXME
   1659   else if (TypeStr == "protected")
   1660     type = VisibilityAttr::Protected;
   1661   else {
   1662     S.Diag(Attr.getLoc(), diag::warn_attribute_unknown_visibility) << TypeStr;
   1663     return;
   1664   }
   1665 
   1666   D->addAttr(::new (S.Context) VisibilityAttr(Attr.getRange(), S.Context, type));
   1667 }
   1668 
   1669 static void handleObjCMethodFamilyAttr(Sema &S, Decl *decl,
   1670                                        const AttributeList &Attr) {
   1671   ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(decl);
   1672   if (!method) {
   1673     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
   1674       << ExpectedMethod;
   1675     return;
   1676   }
   1677 
   1678   if (Attr.getNumArgs() != 0 || !Attr.getParameterName()) {
   1679     if (!Attr.getParameterName() && Attr.getNumArgs() == 1) {
   1680       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
   1681         << "objc_method_family" << 1;
   1682     } else {
   1683       S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   1684     }
   1685     Attr.setInvalid();
   1686     return;
   1687   }
   1688 
   1689   StringRef param = Attr.getParameterName()->getName();
   1690   ObjCMethodFamilyAttr::FamilyKind family;
   1691   if (param == "none")
   1692     family = ObjCMethodFamilyAttr::OMF_None;
   1693   else if (param == "alloc")
   1694     family = ObjCMethodFamilyAttr::OMF_alloc;
   1695   else if (param == "copy")
   1696     family = ObjCMethodFamilyAttr::OMF_copy;
   1697   else if (param == "init")
   1698     family = ObjCMethodFamilyAttr::OMF_init;
   1699   else if (param == "mutableCopy")
   1700     family = ObjCMethodFamilyAttr::OMF_mutableCopy;
   1701   else if (param == "new")
   1702     family = ObjCMethodFamilyAttr::OMF_new;
   1703   else {
   1704     // Just warn and ignore it.  This is future-proof against new
   1705     // families being used in system headers.
   1706     S.Diag(Attr.getParameterLoc(), diag::warn_unknown_method_family);
   1707     return;
   1708   }
   1709 
   1710   if (family == ObjCMethodFamilyAttr::OMF_init &&
   1711       !method->getResultType()->isObjCObjectPointerType()) {
   1712     S.Diag(method->getLocation(), diag::err_init_method_bad_return_type)
   1713       << method->getResultType();
   1714     // Ignore the attribute.
   1715     return;
   1716   }
   1717 
   1718   method->addAttr(new (S.Context) ObjCMethodFamilyAttr(Attr.getRange(),
   1719                                                        S.Context, family));
   1720 }
   1721 
   1722 static void handleObjCExceptionAttr(Sema &S, Decl *D,
   1723                                     const AttributeList &Attr) {
   1724   if (!checkAttributeNumArgs(S, Attr, 0))
   1725     return;
   1726 
   1727   ObjCInterfaceDecl *OCI = dyn_cast<ObjCInterfaceDecl>(D);
   1728   if (OCI == 0) {
   1729     S.Diag(Attr.getLoc(), diag::err_attribute_requires_objc_interface);
   1730     return;
   1731   }
   1732 
   1733   D->addAttr(::new (S.Context) ObjCExceptionAttr(Attr.getRange(), S.Context));
   1734 }
   1735 
   1736 static void handleObjCNSObject(Sema &S, Decl *D, const AttributeList &Attr) {
   1737   if (Attr.getNumArgs() != 0) {
   1738     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   1739     return;
   1740   }
   1741   if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D)) {
   1742     QualType T = TD->getUnderlyingType();
   1743     if (!T->isPointerType() ||
   1744         !T->getAs<PointerType>()->getPointeeType()->isRecordType()) {
   1745       S.Diag(TD->getLocation(), diag::err_nsobject_attribute);
   1746       return;
   1747     }
   1748   }
   1749   D->addAttr(::new (S.Context) ObjCNSObjectAttr(Attr.getRange(), S.Context));
   1750 }
   1751 
   1752 static void
   1753 handleOverloadableAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1754   if (Attr.getNumArgs() != 0) {
   1755     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   1756     return;
   1757   }
   1758 
   1759   if (!isa<FunctionDecl>(D)) {
   1760     S.Diag(Attr.getLoc(), diag::err_attribute_overloadable_not_function);
   1761     return;
   1762   }
   1763 
   1764   D->addAttr(::new (S.Context) OverloadableAttr(Attr.getRange(), S.Context));
   1765 }
   1766 
   1767 static void handleBlocksAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1768   if (!Attr.getParameterName()) {
   1769     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
   1770       << "blocks" << 1;
   1771     return;
   1772   }
   1773 
   1774   if (Attr.getNumArgs() != 0) {
   1775     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   1776     return;
   1777   }
   1778 
   1779   BlocksAttr::BlockType type;
   1780   if (Attr.getParameterName()->isStr("byref"))
   1781     type = BlocksAttr::ByRef;
   1782   else {
   1783     S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
   1784       << "blocks" << Attr.getParameterName();
   1785     return;
   1786   }
   1787 
   1788   D->addAttr(::new (S.Context) BlocksAttr(Attr.getRange(), S.Context, type));
   1789 }
   1790 
   1791 static void handleSentinelAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1792   // check the attribute arguments.
   1793   if (Attr.getNumArgs() > 2) {
   1794     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 2;
   1795     return;
   1796   }
   1797 
   1798   unsigned sentinel = 0;
   1799   if (Attr.getNumArgs() > 0) {
   1800     Expr *E = Attr.getArg(0);
   1801     llvm::APSInt Idx(32);
   1802     if (E->isTypeDependent() || E->isValueDependent() ||
   1803         !E->isIntegerConstantExpr(Idx, S.Context)) {
   1804       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
   1805        << "sentinel" << 1 << E->getSourceRange();
   1806       return;
   1807     }
   1808 
   1809     if (Idx.isSigned() && Idx.isNegative()) {
   1810       S.Diag(Attr.getLoc(), diag::err_attribute_sentinel_less_than_zero)
   1811         << E->getSourceRange();
   1812       return;
   1813     }
   1814 
   1815     sentinel = Idx.getZExtValue();
   1816   }
   1817 
   1818   unsigned nullPos = 0;
   1819   if (Attr.getNumArgs() > 1) {
   1820     Expr *E = Attr.getArg(1);
   1821     llvm::APSInt Idx(32);
   1822     if (E->isTypeDependent() || E->isValueDependent() ||
   1823         !E->isIntegerConstantExpr(Idx, S.Context)) {
   1824       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
   1825         << "sentinel" << 2 << E->getSourceRange();
   1826       return;
   1827     }
   1828     nullPos = Idx.getZExtValue();
   1829 
   1830     if ((Idx.isSigned() && Idx.isNegative()) || nullPos > 1) {
   1831       // FIXME: This error message could be improved, it would be nice
   1832       // to say what the bounds actually are.
   1833       S.Diag(Attr.getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
   1834         << E->getSourceRange();
   1835       return;
   1836     }
   1837   }
   1838 
   1839   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
   1840     const FunctionType *FT = FD->getType()->castAs<FunctionType>();
   1841     if (isa<FunctionNoProtoType>(FT)) {
   1842       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_named_arguments);
   1843       return;
   1844     }
   1845 
   1846     if (!cast<FunctionProtoType>(FT)->isVariadic()) {
   1847       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
   1848       return;
   1849     }
   1850   } else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
   1851     if (!MD->isVariadic()) {
   1852       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
   1853       return;
   1854     }
   1855   } else if (isa<BlockDecl>(D)) {
   1856     // Note! BlockDecl is typeless. Variadic diagnostics will be issued by the
   1857     // caller.
   1858     ;
   1859   } else if (const VarDecl *V = dyn_cast<VarDecl>(D)) {
   1860     QualType Ty = V->getType();
   1861     if (Ty->isBlockPointerType() || Ty->isFunctionPointerType()) {
   1862       const FunctionType *FT = Ty->isFunctionPointerType() ? getFunctionType(D)
   1863        : Ty->getAs<BlockPointerType>()->getPointeeType()->getAs<FunctionType>();
   1864       if (!cast<FunctionProtoType>(FT)->isVariadic()) {
   1865         int m = Ty->isFunctionPointerType() ? 0 : 1;
   1866         S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
   1867         return;
   1868       }
   1869     } else {
   1870       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1871         << Attr.getName() << ExpectedFunctionMethodOrBlock;
   1872       return;
   1873     }
   1874   } else {
   1875     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1876       << Attr.getName() << ExpectedFunctionMethodOrBlock;
   1877     return;
   1878   }
   1879   D->addAttr(::new (S.Context) SentinelAttr(Attr.getRange(), S.Context, sentinel,
   1880                                             nullPos));
   1881 }
   1882 
   1883 static void handleWarnUnusedResult(Sema &S, Decl *D, const AttributeList &Attr) {
   1884   // check the attribute arguments.
   1885   if (!checkAttributeNumArgs(S, Attr, 0))
   1886     return;
   1887 
   1888   if (!isFunction(D) && !isa<ObjCMethodDecl>(D)) {
   1889     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1890       << Attr.getName() << ExpectedFunctionOrMethod;
   1891     return;
   1892   }
   1893 
   1894   if (isFunction(D) && getFunctionType(D)->getResultType()->isVoidType()) {
   1895     S.Diag(Attr.getLoc(), diag::warn_attribute_void_function_method)
   1896       << Attr.getName() << 0;
   1897     return;
   1898   }
   1899   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
   1900     if (MD->getResultType()->isVoidType()) {
   1901       S.Diag(Attr.getLoc(), diag::warn_attribute_void_function_method)
   1902       << Attr.getName() << 1;
   1903       return;
   1904     }
   1905 
   1906   D->addAttr(::new (S.Context) WarnUnusedResultAttr(Attr.getRange(), S.Context));
   1907 }
   1908 
   1909 static void handleWeakAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1910   // check the attribute arguments.
   1911   if (Attr.hasParameterOrArguments()) {
   1912     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   1913     return;
   1914   }
   1915 
   1916   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) {
   1917     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1918       << Attr.getName() << ExpectedVariableOrFunction;
   1919     return;
   1920   }
   1921 
   1922   NamedDecl *nd = cast<NamedDecl>(D);
   1923 
   1924   // 'weak' only applies to declarations with external linkage.
   1925   if (hasEffectivelyInternalLinkage(nd)) {
   1926     S.Diag(Attr.getLoc(), diag::err_attribute_weak_static);
   1927     return;
   1928   }
   1929 
   1930   nd->addAttr(::new (S.Context) WeakAttr(Attr.getRange(), S.Context));
   1931 }
   1932 
   1933 static void handleWeakImportAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1934   // check the attribute arguments.
   1935   if (!checkAttributeNumArgs(S, Attr, 0))
   1936     return;
   1937 
   1938 
   1939   // weak_import only applies to variable & function declarations.
   1940   bool isDef = false;
   1941   if (!D->canBeWeakImported(isDef)) {
   1942     if (isDef)
   1943       S.Diag(Attr.getLoc(),
   1944              diag::warn_attribute_weak_import_invalid_on_definition)
   1945         << "weak_import" << 2 /*variable and function*/;
   1946     else if (isa<ObjCPropertyDecl>(D) || isa<ObjCMethodDecl>(D) ||
   1947              (S.Context.getTargetInfo().getTriple().isOSDarwin() &&
   1948               isa<ObjCInterfaceDecl>(D))) {
   1949       // Nothing to warn about here.
   1950     } else
   1951       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   1952         << Attr.getName() << ExpectedVariableOrFunction;
   1953 
   1954     return;
   1955   }
   1956 
   1957   D->addAttr(::new (S.Context) WeakImportAttr(Attr.getRange(), S.Context));
   1958 }
   1959 
   1960 static void handleReqdWorkGroupSize(Sema &S, Decl *D,
   1961                                     const AttributeList &Attr) {
   1962   // Attribute has 3 arguments.
   1963   if (!checkAttributeNumArgs(S, Attr, 3))
   1964     return;
   1965 
   1966   unsigned WGSize[3];
   1967   for (unsigned i = 0; i < 3; ++i) {
   1968     Expr *E = Attr.getArg(i);
   1969     llvm::APSInt ArgNum(32);
   1970     if (E->isTypeDependent() || E->isValueDependent() ||
   1971         !E->isIntegerConstantExpr(ArgNum, S.Context)) {
   1972       S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
   1973         << "reqd_work_group_size" << E->getSourceRange();
   1974       return;
   1975     }
   1976     WGSize[i] = (unsigned) ArgNum.getZExtValue();
   1977   }
   1978   D->addAttr(::new (S.Context) ReqdWorkGroupSizeAttr(Attr.getRange(), S.Context,
   1979                                                      WGSize[0], WGSize[1],
   1980                                                      WGSize[2]));
   1981 }
   1982 
   1983 static void handleSectionAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   1984   // Attribute has no arguments.
   1985   if (!checkAttributeNumArgs(S, Attr, 1))
   1986     return;
   1987 
   1988   // Make sure that there is a string literal as the sections's single
   1989   // argument.
   1990   Expr *ArgExpr = Attr.getArg(0);
   1991   StringLiteral *SE = dyn_cast<StringLiteral>(ArgExpr);
   1992   if (!SE) {
   1993     S.Diag(ArgExpr->getLocStart(), diag::err_attribute_not_string) << "section";
   1994     return;
   1995   }
   1996 
   1997   // If the target wants to validate the section specifier, make it happen.
   1998   std::string Error = S.Context.getTargetInfo().isValidSectionSpecifier(SE->getString());
   1999   if (!Error.empty()) {
   2000     S.Diag(SE->getLocStart(), diag::err_attribute_section_invalid_for_target)
   2001     << Error;
   2002     return;
   2003   }
   2004 
   2005   // This attribute cannot be applied to local variables.
   2006   if (isa<VarDecl>(D) && cast<VarDecl>(D)->hasLocalStorage()) {
   2007     S.Diag(SE->getLocStart(), diag::err_attribute_section_local_variable);
   2008     return;
   2009   }
   2010 
   2011   D->addAttr(::new (S.Context) SectionAttr(Attr.getRange(), S.Context,
   2012                                            SE->getString()));
   2013 }
   2014 
   2015 
   2016 static void handleNothrowAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2017   // check the attribute arguments.
   2018   if (Attr.hasParameterOrArguments()) {
   2019     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   2020     return;
   2021   }
   2022 
   2023   if (NoThrowAttr *Existing = D->getAttr<NoThrowAttr>()) {
   2024     if (Existing->getLocation().isInvalid())
   2025       Existing->setRange(Attr.getRange());
   2026   } else {
   2027     D->addAttr(::new (S.Context) NoThrowAttr(Attr.getRange(), S.Context));
   2028   }
   2029 }
   2030 
   2031 static void handleConstAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2032   // check the attribute arguments.
   2033   if (Attr.hasParameterOrArguments()) {
   2034     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   2035     return;
   2036   }
   2037 
   2038   if (ConstAttr *Existing = D->getAttr<ConstAttr>()) {
   2039    if (Existing->getLocation().isInvalid())
   2040      Existing->setRange(Attr.getRange());
   2041   } else {
   2042     D->addAttr(::new (S.Context) ConstAttr(Attr.getRange(), S.Context));
   2043   }
   2044 }
   2045 
   2046 static void handlePureAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2047   // check the attribute arguments.
   2048   if (!checkAttributeNumArgs(S, Attr, 0))
   2049     return;
   2050 
   2051   D->addAttr(::new (S.Context) PureAttr(Attr.getRange(), S.Context));
   2052 }
   2053 
   2054 static void handleCleanupAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2055   if (!Attr.getParameterName()) {
   2056     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   2057     return;
   2058   }
   2059 
   2060   if (Attr.getNumArgs() != 0) {
   2061     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   2062     return;
   2063   }
   2064 
   2065   VarDecl *VD = dyn_cast<VarDecl>(D);
   2066 
   2067   if (!VD || !VD->hasLocalStorage()) {
   2068     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "cleanup";
   2069     return;
   2070   }
   2071 
   2072   // Look up the function
   2073   // FIXME: Lookup probably isn't looking in the right place
   2074   NamedDecl *CleanupDecl
   2075     = S.LookupSingleName(S.TUScope, Attr.getParameterName(),
   2076                          Attr.getParameterLoc(), Sema::LookupOrdinaryName);
   2077   if (!CleanupDecl) {
   2078     S.Diag(Attr.getParameterLoc(), diag::err_attribute_cleanup_arg_not_found) <<
   2079       Attr.getParameterName();
   2080     return;
   2081   }
   2082 
   2083   FunctionDecl *FD = dyn_cast<FunctionDecl>(CleanupDecl);
   2084   if (!FD) {
   2085     S.Diag(Attr.getParameterLoc(),
   2086            diag::err_attribute_cleanup_arg_not_function)
   2087       << Attr.getParameterName();
   2088     return;
   2089   }
   2090 
   2091   if (FD->getNumParams() != 1) {
   2092     S.Diag(Attr.getParameterLoc(),
   2093            diag::err_attribute_cleanup_func_must_take_one_arg)
   2094       << Attr.getParameterName();
   2095     return;
   2096   }
   2097 
   2098   // We're currently more strict than GCC about what function types we accept.
   2099   // If this ever proves to be a problem it should be easy to fix.
   2100   QualType Ty = S.Context.getPointerType(VD->getType());
   2101   QualType ParamTy = FD->getParamDecl(0)->getType();
   2102   if (S.CheckAssignmentConstraints(FD->getParamDecl(0)->getLocation(),
   2103                                    ParamTy, Ty) != Sema::Compatible) {
   2104     S.Diag(Attr.getParameterLoc(),
   2105            diag::err_attribute_cleanup_func_arg_incompatible_type) <<
   2106       Attr.getParameterName() << ParamTy << Ty;
   2107     return;
   2108   }
   2109 
   2110   D->addAttr(::new (S.Context) CleanupAttr(Attr.getRange(), S.Context, FD));
   2111   S.MarkDeclarationReferenced(Attr.getParameterLoc(), FD);
   2112 }
   2113 
   2114 /// Handle __attribute__((format_arg((idx)))) attribute based on
   2115 /// http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
   2116 static void handleFormatArgAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2117   if (!checkAttributeNumArgs(S, Attr, 1))
   2118     return;
   2119 
   2120   if (!isFunctionOrMethod(D) || !hasFunctionProto(D)) {
   2121     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2122       << Attr.getName() << ExpectedFunction;
   2123     return;
   2124   }
   2125 
   2126   // In C++ the implicit 'this' function parameter also counts, and they are
   2127   // counted from one.
   2128   bool HasImplicitThisParam = isInstanceMethod(D);
   2129   unsigned NumArgs  = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
   2130   unsigned FirstIdx = 1;
   2131 
   2132   // checks for the 2nd argument
   2133   Expr *IdxExpr = Attr.getArg(0);
   2134   llvm::APSInt Idx(32);
   2135   if (IdxExpr->isTypeDependent() || IdxExpr->isValueDependent() ||
   2136       !IdxExpr->isIntegerConstantExpr(Idx, S.Context)) {
   2137     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
   2138     << "format" << 2 << IdxExpr->getSourceRange();
   2139     return;
   2140   }
   2141 
   2142   if (Idx.getZExtValue() < FirstIdx || Idx.getZExtValue() > NumArgs) {
   2143     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
   2144     << "format" << 2 << IdxExpr->getSourceRange();
   2145     return;
   2146   }
   2147 
   2148   unsigned ArgIdx = Idx.getZExtValue() - 1;
   2149 
   2150   if (HasImplicitThisParam) {
   2151     if (ArgIdx == 0) {
   2152       S.Diag(Attr.getLoc(), diag::err_attribute_invalid_implicit_this_argument)
   2153         << "format_arg" << IdxExpr->getSourceRange();
   2154       return;
   2155     }
   2156     ArgIdx--;
   2157   }
   2158 
   2159   // make sure the format string is really a string
   2160   QualType Ty = getFunctionOrMethodArgType(D, ArgIdx);
   2161 
   2162   bool not_nsstring_type = !isNSStringType(Ty, S.Context);
   2163   if (not_nsstring_type &&
   2164       !isCFStringType(Ty, S.Context) &&
   2165       (!Ty->isPointerType() ||
   2166        !Ty->getAs<PointerType>()->getPointeeType()->isCharType())) {
   2167     // FIXME: Should highlight the actual expression that has the wrong type.
   2168     S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
   2169     << (not_nsstring_type ? "a string type" : "an NSString")
   2170        << IdxExpr->getSourceRange();
   2171     return;
   2172   }
   2173   Ty = getFunctionOrMethodResultType(D);
   2174   if (!isNSStringType(Ty, S.Context) &&
   2175       !isCFStringType(Ty, S.Context) &&
   2176       (!Ty->isPointerType() ||
   2177        !Ty->getAs<PointerType>()->getPointeeType()->isCharType())) {
   2178     // FIXME: Should highlight the actual expression that has the wrong type.
   2179     S.Diag(Attr.getLoc(), diag::err_format_attribute_result_not)
   2180     << (not_nsstring_type ? "string type" : "NSString")
   2181        << IdxExpr->getSourceRange();
   2182     return;
   2183   }
   2184 
   2185   D->addAttr(::new (S.Context) FormatArgAttr(Attr.getRange(), S.Context,
   2186                                              Idx.getZExtValue()));
   2187 }
   2188 
   2189 enum FormatAttrKind {
   2190   CFStringFormat,
   2191   NSStringFormat,
   2192   StrftimeFormat,
   2193   SupportedFormat,
   2194   IgnoredFormat,
   2195   InvalidFormat
   2196 };
   2197 
   2198 /// getFormatAttrKind - Map from format attribute names to supported format
   2199 /// types.
   2200 static FormatAttrKind getFormatAttrKind(StringRef Format) {
   2201   // Check for formats that get handled specially.
   2202   if (Format == "NSString")
   2203     return NSStringFormat;
   2204   if (Format == "CFString")
   2205     return CFStringFormat;
   2206   if (Format == "strftime")
   2207     return StrftimeFormat;
   2208 
   2209   // Otherwise, check for supported formats.
   2210   if (Format == "scanf" || Format == "printf" || Format == "printf0" ||
   2211       Format == "strfmon" || Format == "cmn_err" || Format == "strftime" ||
   2212       Format == "NSString" || Format == "CFString" || Format == "vcmn_err" ||
   2213       Format == "zcmn_err" ||
   2214       Format == "kprintf")  // OpenBSD.
   2215     return SupportedFormat;
   2216 
   2217   if (Format == "gcc_diag" || Format == "gcc_cdiag" ||
   2218       Format == "gcc_cxxdiag" || Format == "gcc_tdiag")
   2219     return IgnoredFormat;
   2220 
   2221   return InvalidFormat;
   2222 }
   2223 
   2224 /// Handle __attribute__((init_priority(priority))) attributes based on
   2225 /// http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
   2226 static void handleInitPriorityAttr(Sema &S, Decl *D,
   2227                                    const AttributeList &Attr) {
   2228   if (!S.getLangOptions().CPlusPlus) {
   2229     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
   2230     return;
   2231   }
   2232 
   2233   if (!isa<VarDecl>(D) || S.getCurFunctionOrMethodDecl()) {
   2234     S.Diag(Attr.getLoc(), diag::err_init_priority_object_attr);
   2235     Attr.setInvalid();
   2236     return;
   2237   }
   2238   QualType T = dyn_cast<VarDecl>(D)->getType();
   2239   if (S.Context.getAsArrayType(T))
   2240     T = S.Context.getBaseElementType(T);
   2241   if (!T->getAs<RecordType>()) {
   2242     S.Diag(Attr.getLoc(), diag::err_init_priority_object_attr);
   2243     Attr.setInvalid();
   2244     return;
   2245   }
   2246 
   2247   if (Attr.getNumArgs() != 1) {
   2248     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   2249     Attr.setInvalid();
   2250     return;
   2251   }
   2252   Expr *priorityExpr = Attr.getArg(0);
   2253 
   2254   llvm::APSInt priority(32);
   2255   if (priorityExpr->isTypeDependent() || priorityExpr->isValueDependent() ||
   2256       !priorityExpr->isIntegerConstantExpr(priority, S.Context)) {
   2257     S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
   2258     << "init_priority" << priorityExpr->getSourceRange();
   2259     Attr.setInvalid();
   2260     return;
   2261   }
   2262   unsigned prioritynum = priority.getZExtValue();
   2263   if (prioritynum < 101 || prioritynum > 65535) {
   2264     S.Diag(Attr.getLoc(), diag::err_attribute_argument_outof_range)
   2265     <<  priorityExpr->getSourceRange();
   2266     Attr.setInvalid();
   2267     return;
   2268   }
   2269   D->addAttr(::new (S.Context) InitPriorityAttr(Attr.getRange(), S.Context,
   2270                                                 prioritynum));
   2271 }
   2272 
   2273 /// Handle __attribute__((format(type,idx,firstarg))) attributes based on
   2274 /// http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
   2275 static void handleFormatAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2276 
   2277   if (!Attr.getParameterName()) {
   2278     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
   2279       << "format" << 1;
   2280     return;
   2281   }
   2282 
   2283   if (Attr.getNumArgs() != 2) {
   2284     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 3;
   2285     return;
   2286   }
   2287 
   2288   if (!isFunctionOrMethodOrBlock(D) || !hasFunctionProto(D)) {
   2289     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2290       << Attr.getName() << ExpectedFunction;
   2291     return;
   2292   }
   2293 
   2294   // In C++ the implicit 'this' function parameter also counts, and they are
   2295   // counted from one.
   2296   bool HasImplicitThisParam = isInstanceMethod(D);
   2297   unsigned NumArgs  = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
   2298   unsigned FirstIdx = 1;
   2299 
   2300   StringRef Format = Attr.getParameterName()->getName();
   2301 
   2302   // Normalize the argument, __foo__ becomes foo.
   2303   if (Format.startswith("__") && Format.endswith("__"))
   2304     Format = Format.substr(2, Format.size() - 4);
   2305 
   2306   // Check for supported formats.
   2307   FormatAttrKind Kind = getFormatAttrKind(Format);
   2308 
   2309   if (Kind == IgnoredFormat)
   2310     return;
   2311 
   2312   if (Kind == InvalidFormat) {
   2313     S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
   2314       << "format" << Attr.getParameterName()->getName();
   2315     return;
   2316   }
   2317 
   2318   // checks for the 2nd argument
   2319   Expr *IdxExpr = Attr.getArg(0);
   2320   llvm::APSInt Idx(32);
   2321   if (IdxExpr->isTypeDependent() || IdxExpr->isValueDependent() ||
   2322       !IdxExpr->isIntegerConstantExpr(Idx, S.Context)) {
   2323     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
   2324       << "format" << 2 << IdxExpr->getSourceRange();
   2325     return;
   2326   }
   2327 
   2328   if (Idx.getZExtValue() < FirstIdx || Idx.getZExtValue() > NumArgs) {
   2329     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
   2330       << "format" << 2 << IdxExpr->getSourceRange();
   2331     return;
   2332   }
   2333 
   2334   // FIXME: Do we need to bounds check?
   2335   unsigned ArgIdx = Idx.getZExtValue() - 1;
   2336 
   2337   if (HasImplicitThisParam) {
   2338     if (ArgIdx == 0) {
   2339       S.Diag(Attr.getLoc(),
   2340              diag::err_format_attribute_implicit_this_format_string)
   2341         << IdxExpr->getSourceRange();
   2342       return;
   2343     }
   2344     ArgIdx--;
   2345   }
   2346 
   2347   // make sure the format string is really a string
   2348   QualType Ty = getFunctionOrMethodArgType(D, ArgIdx);
   2349 
   2350   if (Kind == CFStringFormat) {
   2351     if (!isCFStringType(Ty, S.Context)) {
   2352       S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
   2353         << "a CFString" << IdxExpr->getSourceRange();
   2354       return;
   2355     }
   2356   } else if (Kind == NSStringFormat) {
   2357     // FIXME: do we need to check if the type is NSString*?  What are the
   2358     // semantics?
   2359     if (!isNSStringType(Ty, S.Context)) {
   2360       // FIXME: Should highlight the actual expression that has the wrong type.
   2361       S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
   2362         << "an NSString" << IdxExpr->getSourceRange();
   2363       return;
   2364     }
   2365   } else if (!Ty->isPointerType() ||
   2366              !Ty->getAs<PointerType>()->getPointeeType()->isCharType()) {
   2367     // FIXME: Should highlight the actual expression that has the wrong type.
   2368     S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
   2369       << "a string type" << IdxExpr->getSourceRange();
   2370     return;
   2371   }
   2372 
   2373   // check the 3rd argument
   2374   Expr *FirstArgExpr = Attr.getArg(1);
   2375   llvm::APSInt FirstArg(32);
   2376   if (FirstArgExpr->isTypeDependent() || FirstArgExpr->isValueDependent() ||
   2377       !FirstArgExpr->isIntegerConstantExpr(FirstArg, S.Context)) {
   2378     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
   2379       << "format" << 3 << FirstArgExpr->getSourceRange();
   2380     return;
   2381   }
   2382 
   2383   // check if the function is variadic if the 3rd argument non-zero
   2384   if (FirstArg != 0) {
   2385     if (isFunctionOrMethodVariadic(D)) {
   2386       ++NumArgs; // +1 for ...
   2387     } else {
   2388       S.Diag(D->getLocation(), diag::err_format_attribute_requires_variadic);
   2389       return;
   2390     }
   2391   }
   2392 
   2393   // strftime requires FirstArg to be 0 because it doesn't read from any
   2394   // variable the input is just the current time + the format string.
   2395   if (Kind == StrftimeFormat) {
   2396     if (FirstArg != 0) {
   2397       S.Diag(Attr.getLoc(), diag::err_format_strftime_third_parameter)
   2398         << FirstArgExpr->getSourceRange();
   2399       return;
   2400     }
   2401   // if 0 it disables parameter checking (to use with e.g. va_list)
   2402   } else if (FirstArg != 0 && FirstArg != NumArgs) {
   2403     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
   2404       << "format" << 3 << FirstArgExpr->getSourceRange();
   2405     return;
   2406   }
   2407 
   2408   // Check whether we already have an equivalent format attribute.
   2409   for (specific_attr_iterator<FormatAttr>
   2410          i = D->specific_attr_begin<FormatAttr>(),
   2411          e = D->specific_attr_end<FormatAttr>();
   2412        i != e ; ++i) {
   2413     FormatAttr *f = *i;
   2414     if (f->getType() == Format &&
   2415         f->getFormatIdx() == (int)Idx.getZExtValue() &&
   2416         f->getFirstArg() == (int)FirstArg.getZExtValue()) {
   2417       // If we don't have a valid location for this attribute, adopt the
   2418       // location.
   2419       if (f->getLocation().isInvalid())
   2420         f->setRange(Attr.getRange());
   2421       return;
   2422     }
   2423   }
   2424 
   2425   D->addAttr(::new (S.Context) FormatAttr(Attr.getRange(), S.Context, Format,
   2426                                           Idx.getZExtValue(),
   2427                                           FirstArg.getZExtValue()));
   2428 }
   2429 
   2430 static void handleTransparentUnionAttr(Sema &S, Decl *D,
   2431                                        const AttributeList &Attr) {
   2432   // check the attribute arguments.
   2433   if (!checkAttributeNumArgs(S, Attr, 0))
   2434     return;
   2435 
   2436 
   2437   // Try to find the underlying union declaration.
   2438   RecordDecl *RD = 0;
   2439   TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D);
   2440   if (TD && TD->getUnderlyingType()->isUnionType())
   2441     RD = TD->getUnderlyingType()->getAsUnionType()->getDecl();
   2442   else
   2443     RD = dyn_cast<RecordDecl>(D);
   2444 
   2445   if (!RD || !RD->isUnion()) {
   2446     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2447       << Attr.getName() << ExpectedUnion;
   2448     return;
   2449   }
   2450 
   2451   if (!RD->isCompleteDefinition()) {
   2452     S.Diag(Attr.getLoc(),
   2453         diag::warn_transparent_union_attribute_not_definition);
   2454     return;
   2455   }
   2456 
   2457   RecordDecl::field_iterator Field = RD->field_begin(),
   2458                           FieldEnd = RD->field_end();
   2459   if (Field == FieldEnd) {
   2460     S.Diag(Attr.getLoc(), diag::warn_transparent_union_attribute_zero_fields);
   2461     return;
   2462   }
   2463 
   2464   FieldDecl *FirstField = *Field;
   2465   QualType FirstType = FirstField->getType();
   2466   if (FirstType->hasFloatingRepresentation() || FirstType->isVectorType()) {
   2467     S.Diag(FirstField->getLocation(),
   2468            diag::warn_transparent_union_attribute_floating)
   2469       << FirstType->isVectorType() << FirstType;
   2470     return;
   2471   }
   2472 
   2473   uint64_t FirstSize = S.Context.getTypeSize(FirstType);
   2474   uint64_t FirstAlign = S.Context.getTypeAlign(FirstType);
   2475   for (; Field != FieldEnd; ++Field) {
   2476     QualType FieldType = Field->getType();
   2477     if (S.Context.getTypeSize(FieldType) != FirstSize ||
   2478         S.Context.getTypeAlign(FieldType) != FirstAlign) {
   2479       // Warn if we drop the attribute.
   2480       bool isSize = S.Context.getTypeSize(FieldType) != FirstSize;
   2481       unsigned FieldBits = isSize? S.Context.getTypeSize(FieldType)
   2482                                  : S.Context.getTypeAlign(FieldType);
   2483       S.Diag(Field->getLocation(),
   2484           diag::warn_transparent_union_attribute_field_size_align)
   2485         << isSize << Field->getDeclName() << FieldBits;
   2486       unsigned FirstBits = isSize? FirstSize : FirstAlign;
   2487       S.Diag(FirstField->getLocation(),
   2488              diag::note_transparent_union_first_field_size_align)
   2489         << isSize << FirstBits;
   2490       return;
   2491     }
   2492   }
   2493 
   2494   RD->addAttr(::new (S.Context) TransparentUnionAttr(Attr.getRange(), S.Context));
   2495 }
   2496 
   2497 static void handleAnnotateAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2498   // check the attribute arguments.
   2499   if (!checkAttributeNumArgs(S, Attr, 1))
   2500     return;
   2501 
   2502   Expr *ArgExpr = Attr.getArg(0);
   2503   StringLiteral *SE = dyn_cast<StringLiteral>(ArgExpr);
   2504 
   2505   // Make sure that there is a string literal as the annotation's single
   2506   // argument.
   2507   if (!SE) {
   2508     S.Diag(ArgExpr->getLocStart(), diag::err_attribute_not_string) <<"annotate";
   2509     return;
   2510   }
   2511 
   2512   // Don't duplicate annotations that are already set.
   2513   for (specific_attr_iterator<AnnotateAttr>
   2514        i = D->specific_attr_begin<AnnotateAttr>(),
   2515        e = D->specific_attr_end<AnnotateAttr>(); i != e; ++i) {
   2516       if ((*i)->getAnnotation() == SE->getString())
   2517           return;
   2518   }
   2519   D->addAttr(::new (S.Context) AnnotateAttr(Attr.getRange(), S.Context,
   2520                                             SE->getString()));
   2521 }
   2522 
   2523 static void handleAlignedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2524   // check the attribute arguments.
   2525   if (Attr.getNumArgs() > 1) {
   2526     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   2527     return;
   2528   }
   2529 
   2530   //FIXME: The C++0x version of this attribute has more limited applicabilty
   2531   //       than GNU's, and should error out when it is used to specify a
   2532   //       weaker alignment, rather than being silently ignored.
   2533 
   2534   if (Attr.getNumArgs() == 0) {
   2535     D->addAttr(::new (S.Context) AlignedAttr(Attr.getRange(), S.Context, true, 0));
   2536     return;
   2537   }
   2538 
   2539   S.AddAlignedAttr(Attr.getRange(), D, Attr.getArg(0));
   2540 }
   2541 
   2542 void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, Expr *E) {
   2543   if (E->isTypeDependent() || E->isValueDependent()) {
   2544     // Save dependent expressions in the AST to be instantiated.
   2545     D->addAttr(::new (Context) AlignedAttr(AttrRange, Context, true, E));
   2546     return;
   2547   }
   2548 
   2549   SourceLocation AttrLoc = AttrRange.getBegin();
   2550   // FIXME: Cache the number on the Attr object?
   2551   llvm::APSInt Alignment(32);
   2552   if (!E->isIntegerConstantExpr(Alignment, Context)) {
   2553     Diag(AttrLoc, diag::err_attribute_argument_not_int)
   2554       << "aligned" << E->getSourceRange();
   2555     return;
   2556   }
   2557   if (!llvm::isPowerOf2_64(Alignment.getZExtValue())) {
   2558     Diag(AttrLoc, diag::err_attribute_aligned_not_power_of_two)
   2559       << E->getSourceRange();
   2560     return;
   2561   }
   2562 
   2563   D->addAttr(::new (Context) AlignedAttr(AttrRange, Context, true, E));
   2564 }
   2565 
   2566 void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, TypeSourceInfo *TS) {
   2567   // FIXME: Cache the number on the Attr object if non-dependent?
   2568   // FIXME: Perform checking of type validity
   2569   D->addAttr(::new (Context) AlignedAttr(AttrRange, Context, false, TS));
   2570   return;
   2571 }
   2572 
   2573 /// handleModeAttr - This attribute modifies the width of a decl with primitive
   2574 /// type.
   2575 ///
   2576 /// Despite what would be logical, the mode attribute is a decl attribute, not a
   2577 /// type attribute: 'int ** __attribute((mode(HI))) *G;' tries to make 'G' be
   2578 /// HImode, not an intermediate pointer.
   2579 static void handleModeAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2580   // This attribute isn't documented, but glibc uses it.  It changes
   2581   // the width of an int or unsigned int to the specified size.
   2582 
   2583   // Check that there aren't any arguments
   2584   if (!checkAttributeNumArgs(S, Attr, 0))
   2585     return;
   2586 
   2587 
   2588   IdentifierInfo *Name = Attr.getParameterName();
   2589   if (!Name) {
   2590     S.Diag(Attr.getLoc(), diag::err_attribute_missing_parameter_name);
   2591     return;
   2592   }
   2593 
   2594   StringRef Str = Attr.getParameterName()->getName();
   2595 
   2596   // Normalize the attribute name, __foo__ becomes foo.
   2597   if (Str.startswith("__") && Str.endswith("__"))
   2598     Str = Str.substr(2, Str.size() - 4);
   2599 
   2600   unsigned DestWidth = 0;
   2601   bool IntegerMode = true;
   2602   bool ComplexMode = false;
   2603   switch (Str.size()) {
   2604   case 2:
   2605     switch (Str[0]) {
   2606     case 'Q': DestWidth = 8; break;
   2607     case 'H': DestWidth = 16; break;
   2608     case 'S': DestWidth = 32; break;
   2609     case 'D': DestWidth = 64; break;
   2610     case 'X': DestWidth = 96; break;
   2611     case 'T': DestWidth = 128; break;
   2612     }
   2613     if (Str[1] == 'F') {
   2614       IntegerMode = false;
   2615     } else if (Str[1] == 'C') {
   2616       IntegerMode = false;
   2617       ComplexMode = true;
   2618     } else if (Str[1] != 'I') {
   2619       DestWidth = 0;
   2620     }
   2621     break;
   2622   case 4:
   2623     // FIXME: glibc uses 'word' to define register_t; this is narrower than a
   2624     // pointer on PIC16 and other embedded platforms.
   2625     if (Str == "word")
   2626       DestWidth = S.Context.getTargetInfo().getPointerWidth(0);
   2627     else if (Str == "byte")
   2628       DestWidth = S.Context.getTargetInfo().getCharWidth();
   2629     break;
   2630   case 7:
   2631     if (Str == "pointer")
   2632       DestWidth = S.Context.getTargetInfo().getPointerWidth(0);
   2633     break;
   2634   }
   2635 
   2636   QualType OldTy;
   2637   if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D))
   2638     OldTy = TD->getUnderlyingType();
   2639   else if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
   2640     OldTy = VD->getType();
   2641   else {
   2642     S.Diag(D->getLocation(), diag::err_attr_wrong_decl)
   2643       << "mode" << Attr.getRange();
   2644     return;
   2645   }
   2646 
   2647   if (!OldTy->getAs<BuiltinType>() && !OldTy->isComplexType())
   2648     S.Diag(Attr.getLoc(), diag::err_mode_not_primitive);
   2649   else if (IntegerMode) {
   2650     if (!OldTy->isIntegralOrEnumerationType())
   2651       S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
   2652   } else if (ComplexMode) {
   2653     if (!OldTy->isComplexType())
   2654       S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
   2655   } else {
   2656     if (!OldTy->isFloatingType())
   2657       S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
   2658   }
   2659 
   2660   // FIXME: Sync this with InitializePredefinedMacros; we need to match int8_t
   2661   // and friends, at least with glibc.
   2662   // FIXME: Make sure 32/64-bit integers don't get defined to types of the wrong
   2663   // width on unusual platforms.
   2664   // FIXME: Make sure floating-point mappings are accurate
   2665   // FIXME: Support XF and TF types
   2666   QualType NewTy;
   2667   switch (DestWidth) {
   2668   case 0:
   2669     S.Diag(Attr.getLoc(), diag::err_unknown_machine_mode) << Name;
   2670     return;
   2671   default:
   2672     S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
   2673     return;
   2674   case 8:
   2675     if (!IntegerMode) {
   2676       S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
   2677       return;
   2678     }
   2679     if (OldTy->isSignedIntegerType())
   2680       NewTy = S.Context.SignedCharTy;
   2681     else
   2682       NewTy = S.Context.UnsignedCharTy;
   2683     break;
   2684   case 16:
   2685     if (!IntegerMode) {
   2686       S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
   2687       return;
   2688     }
   2689     if (OldTy->isSignedIntegerType())
   2690       NewTy = S.Context.ShortTy;
   2691     else
   2692       NewTy = S.Context.UnsignedShortTy;
   2693     break;
   2694   case 32:
   2695     if (!IntegerMode)
   2696       NewTy = S.Context.FloatTy;
   2697     else if (OldTy->isSignedIntegerType())
   2698       NewTy = S.Context.IntTy;
   2699     else
   2700       NewTy = S.Context.UnsignedIntTy;
   2701     break;
   2702   case 64:
   2703     if (!IntegerMode)
   2704       NewTy = S.Context.DoubleTy;
   2705     else if (OldTy->isSignedIntegerType())
   2706       if (S.Context.getTargetInfo().getLongWidth() == 64)
   2707         NewTy = S.Context.LongTy;
   2708       else
   2709         NewTy = S.Context.LongLongTy;
   2710     else
   2711       if (S.Context.getTargetInfo().getLongWidth() == 64)
   2712         NewTy = S.Context.UnsignedLongTy;
   2713       else
   2714         NewTy = S.Context.UnsignedLongLongTy;
   2715     break;
   2716   case 96:
   2717     NewTy = S.Context.LongDoubleTy;
   2718     break;
   2719   case 128:
   2720     if (!IntegerMode) {
   2721       S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
   2722       return;
   2723     }
   2724     if (OldTy->isSignedIntegerType())
   2725       NewTy = S.Context.Int128Ty;
   2726     else
   2727       NewTy = S.Context.UnsignedInt128Ty;
   2728     break;
   2729   }
   2730 
   2731   if (ComplexMode) {
   2732     NewTy = S.Context.getComplexType(NewTy);
   2733   }
   2734 
   2735   // Install the new type.
   2736   if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D)) {
   2737     // FIXME: preserve existing source info.
   2738     TD->setTypeSourceInfo(S.Context.getTrivialTypeSourceInfo(NewTy));
   2739   } else
   2740     cast<ValueDecl>(D)->setType(NewTy);
   2741 }
   2742 
   2743 static void handleNoDebugAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2744   // check the attribute arguments.
   2745   if (!checkAttributeNumArgs(S, Attr, 0))
   2746     return;
   2747 
   2748   if (!isFunctionOrMethod(D)) {
   2749     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2750       << Attr.getName() << ExpectedFunction;
   2751     return;
   2752   }
   2753 
   2754   D->addAttr(::new (S.Context) NoDebugAttr(Attr.getRange(), S.Context));
   2755 }
   2756 
   2757 static void handleNoInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2758   // check the attribute arguments.
   2759   if (!checkAttributeNumArgs(S, Attr, 0))
   2760     return;
   2761 
   2762 
   2763   if (!isa<FunctionDecl>(D)) {
   2764     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2765       << Attr.getName() << ExpectedFunction;
   2766     return;
   2767   }
   2768 
   2769   D->addAttr(::new (S.Context) NoInlineAttr(Attr.getRange(), S.Context));
   2770 }
   2771 
   2772 static void handleNoInstrumentFunctionAttr(Sema &S, Decl *D,
   2773                                            const AttributeList &Attr) {
   2774   // check the attribute arguments.
   2775   if (!checkAttributeNumArgs(S, Attr, 0))
   2776     return;
   2777 
   2778 
   2779   if (!isa<FunctionDecl>(D)) {
   2780     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2781       << Attr.getName() << ExpectedFunction;
   2782     return;
   2783   }
   2784 
   2785   D->addAttr(::new (S.Context) NoInstrumentFunctionAttr(Attr.getRange(),
   2786                                                         S.Context));
   2787 }
   2788 
   2789 static void handleConstantAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2790   if (S.LangOpts.CUDA) {
   2791     // check the attribute arguments.
   2792     if (Attr.hasParameterOrArguments()) {
   2793       S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   2794       return;
   2795     }
   2796 
   2797     if (!isa<VarDecl>(D)) {
   2798       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2799         << Attr.getName() << ExpectedVariable;
   2800       return;
   2801     }
   2802 
   2803     D->addAttr(::new (S.Context) CUDAConstantAttr(Attr.getRange(), S.Context));
   2804   } else {
   2805     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "constant";
   2806   }
   2807 }
   2808 
   2809 static void handleDeviceAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2810   if (S.LangOpts.CUDA) {
   2811     // check the attribute arguments.
   2812     if (Attr.getNumArgs() != 0) {
   2813       S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   2814       return;
   2815     }
   2816 
   2817     if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D)) {
   2818       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2819         << Attr.getName() << ExpectedVariableOrFunction;
   2820       return;
   2821     }
   2822 
   2823     D->addAttr(::new (S.Context) CUDADeviceAttr(Attr.getRange(), S.Context));
   2824   } else {
   2825     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "device";
   2826   }
   2827 }
   2828 
   2829 static void handleGlobalAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2830   if (S.LangOpts.CUDA) {
   2831     // check the attribute arguments.
   2832     if (!checkAttributeNumArgs(S, Attr, 0))
   2833       return;
   2834 
   2835     if (!isa<FunctionDecl>(D)) {
   2836       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2837         << Attr.getName() << ExpectedFunction;
   2838       return;
   2839     }
   2840 
   2841     FunctionDecl *FD = cast<FunctionDecl>(D);
   2842     if (!FD->getResultType()->isVoidType()) {
   2843       TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc().IgnoreParens();
   2844       if (FunctionTypeLoc* FTL = dyn_cast<FunctionTypeLoc>(&TL)) {
   2845         S.Diag(FD->getTypeSpecStartLoc(), diag::err_kern_type_not_void_return)
   2846           << FD->getType()
   2847           << FixItHint::CreateReplacement(FTL->getResultLoc().getSourceRange(),
   2848                                           "void");
   2849       } else {
   2850         S.Diag(FD->getTypeSpecStartLoc(), diag::err_kern_type_not_void_return)
   2851           << FD->getType();
   2852       }
   2853       return;
   2854     }
   2855 
   2856     D->addAttr(::new (S.Context) CUDAGlobalAttr(Attr.getRange(), S.Context));
   2857   } else {
   2858     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "global";
   2859   }
   2860 }
   2861 
   2862 static void handleHostAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2863   if (S.LangOpts.CUDA) {
   2864     // check the attribute arguments.
   2865     if (!checkAttributeNumArgs(S, Attr, 0))
   2866       return;
   2867 
   2868 
   2869     if (!isa<FunctionDecl>(D)) {
   2870       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2871         << Attr.getName() << ExpectedFunction;
   2872       return;
   2873     }
   2874 
   2875     D->addAttr(::new (S.Context) CUDAHostAttr(Attr.getRange(), S.Context));
   2876   } else {
   2877     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "host";
   2878   }
   2879 }
   2880 
   2881 static void handleSharedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2882   if (S.LangOpts.CUDA) {
   2883     // check the attribute arguments.
   2884     if (!checkAttributeNumArgs(S, Attr, 0))
   2885       return;
   2886 
   2887 
   2888     if (!isa<VarDecl>(D)) {
   2889       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2890         << Attr.getName() << ExpectedVariable;
   2891       return;
   2892     }
   2893 
   2894     D->addAttr(::new (S.Context) CUDASharedAttr(Attr.getRange(), S.Context));
   2895   } else {
   2896     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "shared";
   2897   }
   2898 }
   2899 
   2900 static void handleGNUInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2901   // check the attribute arguments.
   2902   if (!checkAttributeNumArgs(S, Attr, 0))
   2903     return;
   2904 
   2905   FunctionDecl *Fn = dyn_cast<FunctionDecl>(D);
   2906   if (Fn == 0) {
   2907     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2908       << Attr.getName() << ExpectedFunction;
   2909     return;
   2910   }
   2911 
   2912   if (!Fn->isInlineSpecified()) {
   2913     S.Diag(Attr.getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
   2914     return;
   2915   }
   2916 
   2917   D->addAttr(::new (S.Context) GNUInlineAttr(Attr.getRange(), S.Context));
   2918 }
   2919 
   2920 static void handleCallConvAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   2921   if (hasDeclarator(D)) return;
   2922 
   2923   // Diagnostic is emitted elsewhere: here we store the (valid) Attr
   2924   // in the Decl node for syntactic reasoning, e.g., pretty-printing.
   2925   CallingConv CC;
   2926   if (S.CheckCallingConvAttr(Attr, CC))
   2927     return;
   2928 
   2929   if (!isa<ObjCMethodDecl>(D)) {
   2930     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   2931       << Attr.getName() << ExpectedFunctionOrMethod;
   2932     return;
   2933   }
   2934 
   2935   switch (Attr.getKind()) {
   2936   case AttributeList::AT_fastcall:
   2937     D->addAttr(::new (S.Context) FastCallAttr(Attr.getRange(), S.Context));
   2938     return;
   2939   case AttributeList::AT_stdcall:
   2940     D->addAttr(::new (S.Context) StdCallAttr(Attr.getRange(), S.Context));
   2941     return;
   2942   case AttributeList::AT_thiscall:
   2943     D->addAttr(::new (S.Context) ThisCallAttr(Attr.getRange(), S.Context));
   2944     return;
   2945   case AttributeList::AT_cdecl:
   2946     D->addAttr(::new (S.Context) CDeclAttr(Attr.getRange(), S.Context));
   2947     return;
   2948   case AttributeList::AT_pascal:
   2949     D->addAttr(::new (S.Context) PascalAttr(Attr.getRange(), S.Context));
   2950     return;
   2951   case AttributeList::AT_pcs: {
   2952     Expr *Arg = Attr.getArg(0);
   2953     StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   2954     if (!Str || !Str->isAscii()) {
   2955       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
   2956         << "pcs" << 1;
   2957       Attr.setInvalid();
   2958       return;
   2959     }
   2960 
   2961     StringRef StrRef = Str->getString();
   2962     PcsAttr::PCSType PCS;
   2963     if (StrRef == "aapcs")
   2964       PCS = PcsAttr::AAPCS;
   2965     else if (StrRef == "aapcs-vfp")
   2966       PCS = PcsAttr::AAPCS_VFP;
   2967     else {
   2968       S.Diag(Attr.getLoc(), diag::err_invalid_pcs);
   2969       Attr.setInvalid();
   2970       return;
   2971     }
   2972 
   2973     D->addAttr(::new (S.Context) PcsAttr(Attr.getRange(), S.Context, PCS));
   2974   }
   2975   default:
   2976     llvm_unreachable("unexpected attribute kind");
   2977     return;
   2978   }
   2979 }
   2980 
   2981 static void handleOpenCLKernelAttr(Sema &S, Decl *D, const AttributeList &Attr){
   2982   assert(!Attr.isInvalid());
   2983   D->addAttr(::new (S.Context) OpenCLKernelAttr(Attr.getRange(), S.Context));
   2984 }
   2985 
   2986 bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC) {
   2987   if (attr.isInvalid())
   2988     return true;
   2989 
   2990   if ((attr.getNumArgs() != 0 &&
   2991       !(attr.getKind() == AttributeList::AT_pcs && attr.getNumArgs() == 1)) ||
   2992       attr.getParameterName()) {
   2993     Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
   2994     attr.setInvalid();
   2995     return true;
   2996   }
   2997 
   2998   // TODO: diagnose uses of these conventions on the wrong target. Or, better
   2999   // move to TargetAttributesSema one day.
   3000   switch (attr.getKind()) {
   3001   case AttributeList::AT_cdecl: CC = CC_C; break;
   3002   case AttributeList::AT_fastcall: CC = CC_X86FastCall; break;
   3003   case AttributeList::AT_stdcall: CC = CC_X86StdCall; break;
   3004   case AttributeList::AT_thiscall: CC = CC_X86ThisCall; break;
   3005   case AttributeList::AT_pascal: CC = CC_X86Pascal; break;
   3006   case AttributeList::AT_pcs: {
   3007     Expr *Arg = attr.getArg(0);
   3008     StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   3009     if (!Str || !Str->isAscii()) {
   3010       Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string)
   3011         << "pcs" << 1;
   3012       attr.setInvalid();
   3013       return true;
   3014     }
   3015 
   3016     StringRef StrRef = Str->getString();
   3017     if (StrRef == "aapcs") {
   3018       CC = CC_AAPCS;
   3019       break;
   3020     } else if (StrRef == "aapcs-vfp") {
   3021       CC = CC_AAPCS_VFP;
   3022       break;
   3023     }
   3024     // FALLS THROUGH
   3025   }
   3026   default: llvm_unreachable("unexpected attribute kind"); return true;
   3027   }
   3028 
   3029   return false;
   3030 }
   3031 
   3032 static void handleRegparmAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3033   if (hasDeclarator(D)) return;
   3034 
   3035   unsigned numParams;
   3036   if (S.CheckRegparmAttr(Attr, numParams))
   3037     return;
   3038 
   3039   if (!isa<ObjCMethodDecl>(D)) {
   3040     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3041       << Attr.getName() << ExpectedFunctionOrMethod;
   3042     return;
   3043   }
   3044 
   3045   D->addAttr(::new (S.Context) RegparmAttr(Attr.getRange(), S.Context, numParams));
   3046 }
   3047 
   3048 /// Checks a regparm attribute, returning true if it is ill-formed and
   3049 /// otherwise setting numParams to the appropriate value.
   3050 bool Sema::CheckRegparmAttr(const AttributeList &Attr, unsigned &numParams) {
   3051   if (Attr.isInvalid())
   3052     return true;
   3053 
   3054   if (Attr.getNumArgs() != 1) {
   3055     Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
   3056     Attr.setInvalid();
   3057     return true;
   3058   }
   3059 
   3060   Expr *NumParamsExpr = Attr.getArg(0);
   3061   llvm::APSInt NumParams(32);
   3062   if (NumParamsExpr->isTypeDependent() || NumParamsExpr->isValueDependent() ||
   3063       !NumParamsExpr->isIntegerConstantExpr(NumParams, Context)) {
   3064     Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
   3065       << "regparm" << NumParamsExpr->getSourceRange();
   3066     Attr.setInvalid();
   3067     return true;
   3068   }
   3069 
   3070   if (Context.getTargetInfo().getRegParmMax() == 0) {
   3071     Diag(Attr.getLoc(), diag::err_attribute_regparm_wrong_platform)
   3072       << NumParamsExpr->getSourceRange();
   3073     Attr.setInvalid();
   3074     return true;
   3075   }
   3076 
   3077   numParams = NumParams.getZExtValue();
   3078   if (numParams > Context.getTargetInfo().getRegParmMax()) {
   3079     Diag(Attr.getLoc(), diag::err_attribute_regparm_invalid_number)
   3080       << Context.getTargetInfo().getRegParmMax() << NumParamsExpr->getSourceRange();
   3081     Attr.setInvalid();
   3082     return true;
   3083   }
   3084 
   3085   return false;
   3086 }
   3087 
   3088 static void handleLaunchBoundsAttr(Sema &S, Decl *D, const AttributeList &Attr){
   3089   if (S.LangOpts.CUDA) {
   3090     // check the attribute arguments.
   3091     if (Attr.getNumArgs() != 1 && Attr.getNumArgs() != 2) {
   3092       // FIXME: 0 is not okay.
   3093       S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 2;
   3094       return;
   3095     }
   3096 
   3097     if (!isFunctionOrMethod(D)) {
   3098       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
   3099         << Attr.getName() << ExpectedFunctionOrMethod;
   3100       return;
   3101     }
   3102 
   3103     Expr *MaxThreadsExpr = Attr.getArg(0);
   3104     llvm::APSInt MaxThreads(32);
   3105     if (MaxThreadsExpr->isTypeDependent() ||
   3106         MaxThreadsExpr->isValueDependent() ||
   3107         !MaxThreadsExpr->isIntegerConstantExpr(MaxThreads, S.Context)) {
   3108       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
   3109         << "launch_bounds" << 1 << MaxThreadsExpr->getSourceRange();
   3110       return;
   3111     }
   3112 
   3113     llvm::APSInt MinBlocks(32);
   3114     if (Attr.getNumArgs() > 1) {
   3115       Expr *MinBlocksExpr = Attr.getArg(1);
   3116       if (MinBlocksExpr->isTypeDependent() ||
   3117           MinBlocksExpr->isValueDependent() ||
   3118           !MinBlocksExpr->isIntegerConstantExpr(MinBlocks, S.Context)) {
   3119         S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
   3120           << "launch_bounds" << 2 << MinBlocksExpr->getSourceRange();
   3121         return;
   3122       }
   3123     }
   3124 
   3125     D->addAttr(::new (S.Context) CUDALaunchBoundsAttr(Attr.getRange(), S.Context,
   3126                                                       MaxThreads.getZExtValue(),
   3127                                                      MinBlocks.getZExtValue()));
   3128   } else {
   3129     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "launch_bounds";
   3130   }
   3131 }
   3132 
   3133 //===----------------------------------------------------------------------===//
   3134 // Checker-specific attribute handlers.
   3135 //===----------------------------------------------------------------------===//
   3136 
   3137 static bool isValidSubjectOfNSAttribute(Sema &S, QualType type) {
   3138   return type->isDependentType() ||
   3139          type->isObjCObjectPointerType() ||
   3140          S.Context.isObjCNSObjectType(type);
   3141 }
   3142 static bool isValidSubjectOfCFAttribute(Sema &S, QualType type) {
   3143   return type->isDependentType() ||
   3144          type->isPointerType() ||
   3145          isValidSubjectOfNSAttribute(S, type);
   3146 }
   3147 
   3148 static void handleNSConsumedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3149   ParmVarDecl *param = dyn_cast<ParmVarDecl>(D);
   3150   if (!param) {
   3151     S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
   3152       << Attr.getRange() << Attr.getName() << ExpectedParameter;
   3153     return;
   3154   }
   3155 
   3156   bool typeOK, cf;
   3157   if (Attr.getKind() == AttributeList::AT_ns_consumed) {
   3158     typeOK = isValidSubjectOfNSAttribute(S, param->getType());
   3159     cf = false;
   3160   } else {
   3161     typeOK = isValidSubjectOfCFAttribute(S, param->getType());
   3162     cf = true;
   3163   }
   3164 
   3165   if (!typeOK) {
   3166     S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_parameter_type)
   3167       << Attr.getRange() << Attr.getName() << cf;
   3168     return;
   3169   }
   3170 
   3171   if (cf)
   3172     param->addAttr(::new (S.Context) CFConsumedAttr(Attr.getRange(), S.Context));
   3173   else
   3174     param->addAttr(::new (S.Context) NSConsumedAttr(Attr.getRange(), S.Context));
   3175 }
   3176 
   3177 static void handleNSConsumesSelfAttr(Sema &S, Decl *D,
   3178                                      const AttributeList &Attr) {
   3179   if (!isa<ObjCMethodDecl>(D)) {
   3180     S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
   3181       << Attr.getRange() << Attr.getName() << ExpectedMethod;
   3182     return;
   3183   }
   3184 
   3185   D->addAttr(::new (S.Context) NSConsumesSelfAttr(Attr.getRange(), S.Context));
   3186 }
   3187 
   3188 static void handleNSReturnsRetainedAttr(Sema &S, Decl *D,
   3189                                         const AttributeList &Attr) {
   3190 
   3191   QualType returnType;
   3192 
   3193   if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
   3194     returnType = MD->getResultType();
   3195   else if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
   3196     returnType = PD->getType();
   3197   else if (S.getLangOptions().ObjCAutoRefCount && hasDeclarator(D) &&
   3198            (Attr.getKind() == AttributeList::AT_ns_returns_retained))
   3199     return; // ignore: was handled as a type attribute
   3200   else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
   3201     returnType = FD->getResultType();
   3202   else {
   3203     S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
   3204         << Attr.getRange() << Attr.getName()
   3205         << ExpectedFunctionOrMethod;
   3206     return;
   3207   }
   3208 
   3209   bool typeOK;
   3210   bool cf;
   3211   switch (Attr.getKind()) {
   3212   default: llvm_unreachable("invalid ownership attribute"); return;
   3213   case AttributeList::AT_ns_returns_autoreleased:
   3214   case AttributeList::AT_ns_returns_retained:
   3215   case AttributeList::AT_ns_returns_not_retained:
   3216     typeOK = isValidSubjectOfNSAttribute(S, returnType);
   3217     cf = false;
   3218     break;
   3219 
   3220   case AttributeList::AT_cf_returns_retained:
   3221   case AttributeList::AT_cf_returns_not_retained:
   3222     typeOK = isValidSubjectOfCFAttribute(S, returnType);
   3223     cf = true;
   3224     break;
   3225   }
   3226 
   3227   if (!typeOK) {
   3228     S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
   3229       << Attr.getRange() << Attr.getName() << isa<ObjCMethodDecl>(D) << cf;
   3230     return;
   3231   }
   3232 
   3233   switch (Attr.getKind()) {
   3234     default:
   3235       llvm_unreachable("invalid ownership attribute");
   3236     case AttributeList::AT_ns_returns_autoreleased:
   3237       D->addAttr(::new (S.Context) NSReturnsAutoreleasedAttr(Attr.getRange(),
   3238                                                              S.Context));
   3239       return;
   3240     case AttributeList::AT_cf_returns_not_retained:
   3241       D->addAttr(::new (S.Context) CFReturnsNotRetainedAttr(Attr.getRange(),
   3242                                                             S.Context));
   3243       return;
   3244     case AttributeList::AT_ns_returns_not_retained:
   3245       D->addAttr(::new (S.Context) NSReturnsNotRetainedAttr(Attr.getRange(),
   3246                                                             S.Context));
   3247       return;
   3248     case AttributeList::AT_cf_returns_retained:
   3249       D->addAttr(::new (S.Context) CFReturnsRetainedAttr(Attr.getRange(),
   3250                                                          S.Context));
   3251       return;
   3252     case AttributeList::AT_ns_returns_retained:
   3253       D->addAttr(::new (S.Context) NSReturnsRetainedAttr(Attr.getRange(),
   3254                                                          S.Context));
   3255       return;
   3256   };
   3257 }
   3258 
   3259 static void handleObjCReturnsInnerPointerAttr(Sema &S, Decl *D,
   3260                                               const AttributeList &attr) {
   3261   SourceLocation loc = attr.getLoc();
   3262 
   3263   ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(D);
   3264 
   3265   if (!isa<ObjCMethodDecl>(method)) {
   3266     S.Diag(method->getLocStart(), diag::err_attribute_wrong_decl_type)
   3267       << SourceRange(loc, loc) << attr.getName() << 13 /* methods */;
   3268     return;
   3269   }
   3270 
   3271   // Check that the method returns a normal pointer.
   3272   QualType resultType = method->getResultType();
   3273 
   3274   if (!resultType->isReferenceType() &&
   3275       (!resultType->isPointerType() || resultType->isObjCRetainableType())) {
   3276     S.Diag(method->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
   3277       << SourceRange(loc)
   3278       << attr.getName() << /*method*/ 1 << /*non-retainable pointer*/ 2;
   3279 
   3280     // Drop the attribute.
   3281     return;
   3282   }
   3283 
   3284   method->addAttr(
   3285     ::new (S.Context) ObjCReturnsInnerPointerAttr(attr.getRange(), S.Context));
   3286 }
   3287 
   3288 /// Handle cf_audited_transfer and cf_unknown_transfer.
   3289 static void handleCFTransferAttr(Sema &S, Decl *D, const AttributeList &A) {
   3290   if (!isa<FunctionDecl>(D)) {
   3291     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   3292       << A.getRange() << A.getName() << 0 /*function*/;
   3293     return;
   3294   }
   3295 
   3296   bool IsAudited = (A.getKind() == AttributeList::AT_cf_audited_transfer);
   3297 
   3298   // Check whether there's a conflicting attribute already present.
   3299   Attr *Existing;
   3300   if (IsAudited) {
   3301     Existing = D->getAttr<CFUnknownTransferAttr>();
   3302   } else {
   3303     Existing = D->getAttr<CFAuditedTransferAttr>();
   3304   }
   3305   if (Existing) {
   3306     S.Diag(D->getLocStart(), diag::err_attributes_are_not_compatible)
   3307       << A.getName()
   3308       << (IsAudited ? "cf_unknown_transfer" : "cf_audited_transfer")
   3309       << A.getRange() << Existing->getRange();
   3310     return;
   3311   }
   3312 
   3313   // All clear;  add the attribute.
   3314   if (IsAudited) {
   3315     D->addAttr(
   3316       ::new (S.Context) CFAuditedTransferAttr(A.getRange(), S.Context));
   3317   } else {
   3318     D->addAttr(
   3319       ::new (S.Context) CFUnknownTransferAttr(A.getRange(), S.Context));
   3320   }
   3321 }
   3322 
   3323 static void handleNSBridgedAttr(Sema &S, Scope *Sc, Decl *D,
   3324                                 const AttributeList &Attr) {
   3325   RecordDecl *RD = dyn_cast<RecordDecl>(D);
   3326   if (!RD || RD->isUnion()) {
   3327     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   3328       << Attr.getRange() << Attr.getName() << 14 /*struct */;
   3329   }
   3330 
   3331   IdentifierInfo *ParmName = Attr.getParameterName();
   3332 
   3333   // In Objective-C, verify that the type names an Objective-C type.
   3334   // We don't want to check this outside of ObjC because people sometimes
   3335   // do crazy C declarations of Objective-C types.
   3336   if (ParmName && S.getLangOptions().ObjC1) {
   3337     // Check for an existing type with this name.
   3338     LookupResult R(S, DeclarationName(ParmName), Attr.getParameterLoc(),
   3339                    Sema::LookupOrdinaryName);
   3340     if (S.LookupName(R, Sc)) {
   3341       NamedDecl *Target = R.getFoundDecl();
   3342       if (Target && !isa<ObjCInterfaceDecl>(Target)) {
   3343         S.Diag(D->getLocStart(), diag::err_ns_bridged_not_interface);
   3344         S.Diag(Target->getLocStart(), diag::note_declared_at);
   3345       }
   3346     }
   3347   }
   3348 
   3349   D->addAttr(::new (S.Context) NSBridgedAttr(Attr.getRange(), S.Context,
   3350                                              ParmName));
   3351 }
   3352 
   3353 static void handleObjCOwnershipAttr(Sema &S, Decl *D,
   3354                                     const AttributeList &Attr) {
   3355   if (hasDeclarator(D)) return;
   3356 
   3357   S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   3358     << Attr.getRange() << Attr.getName() << 12 /* variable */;
   3359 }
   3360 
   3361 static void handleObjCPreciseLifetimeAttr(Sema &S, Decl *D,
   3362                                           const AttributeList &Attr) {
   3363   if (!isa<VarDecl>(D) && !isa<FieldDecl>(D)) {
   3364     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
   3365       << Attr.getRange() << Attr.getName() << 12 /* variable */;
   3366     return;
   3367   }
   3368 
   3369   ValueDecl *vd = cast<ValueDecl>(D);
   3370   QualType type = vd->getType();
   3371 
   3372   if (!type->isDependentType() &&
   3373       !type->isObjCLifetimeType()) {
   3374     S.Diag(Attr.getLoc(), diag::err_objc_precise_lifetime_bad_type)
   3375       << type;
   3376     return;
   3377   }
   3378 
   3379   Qualifiers::ObjCLifetime lifetime = type.getObjCLifetime();
   3380 
   3381   // If we have no lifetime yet, check the lifetime we're presumably
   3382   // going to infer.
   3383   if (lifetime == Qualifiers::OCL_None && !type->isDependentType())
   3384     lifetime = type->getObjCARCImplicitLifetime();
   3385 
   3386   switch (lifetime) {
   3387   case Qualifiers::OCL_None:
   3388     assert(type->isDependentType() &&
   3389            "didn't infer lifetime for non-dependent type?");
   3390     break;
   3391 
   3392   case Qualifiers::OCL_Weak:   // meaningful
   3393   case Qualifiers::OCL_Strong: // meaningful
   3394     break;
   3395 
   3396   case Qualifiers::OCL_ExplicitNone:
   3397   case Qualifiers::OCL_Autoreleasing:
   3398     S.Diag(Attr.getLoc(), diag::warn_objc_precise_lifetime_meaningless)
   3399       << (lifetime == Qualifiers::OCL_Autoreleasing);
   3400     break;
   3401   }
   3402 
   3403   D->addAttr(::new (S.Context)
   3404                  ObjCPreciseLifetimeAttr(Attr.getRange(), S.Context));
   3405 }
   3406 
   3407 static bool isKnownDeclSpecAttr(const AttributeList &Attr) {
   3408   return Attr.getKind() == AttributeList::AT_dllimport ||
   3409          Attr.getKind() == AttributeList::AT_dllexport ||
   3410          Attr.getKind() == AttributeList::AT_uuid;
   3411 }
   3412 
   3413 //===----------------------------------------------------------------------===//
   3414 // Microsoft specific attribute handlers.
   3415 //===----------------------------------------------------------------------===//
   3416 
   3417 static void handleUuidAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   3418   if (S.LangOpts.MicrosoftExt || S.LangOpts.Borland) {
   3419     // check the attribute arguments.
   3420     if (!checkAttributeNumArgs(S, Attr, 1))
   3421       return;
   3422 
   3423     Expr *Arg = Attr.getArg(0);
   3424     StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
   3425     if (!Str || !Str->isAscii()) {
   3426       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
   3427         << "uuid" << 1;
   3428       return;
   3429     }
   3430 
   3431     StringRef StrRef = Str->getString();
   3432 
   3433     bool IsCurly = StrRef.size() > 1 && StrRef.front() == '{' &&
   3434                    StrRef.back() == '}';
   3435 
   3436     // Validate GUID length.
   3437     if (IsCurly && StrRef.size() != 38) {
   3438       S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
   3439       return;
   3440     }
   3441     if (!IsCurly && StrRef.size() != 36) {
   3442       S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
   3443       return;
   3444     }
   3445 
   3446     // GUID format is "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" or
   3447     // "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
   3448     StringRef::iterator I = StrRef.begin();
   3449     if (IsCurly) // Skip the optional '{'
   3450        ++I;
   3451 
   3452     for (int i = 0; i < 36; ++i) {
   3453       if (i == 8 || i == 13 || i == 18 || i == 23) {
   3454         if (*I != '-') {
   3455           S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
   3456           return;
   3457         }
   3458       } else if (!isxdigit(*I)) {
   3459         S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
   3460         return;
   3461       }
   3462       I++;
   3463     }
   3464 
   3465     D->addAttr(::new (S.Context) UuidAttr(Attr.getRange(), S.Context,
   3466                                           Str->getString()));
   3467   } else
   3468     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "uuid";
   3469 }
   3470 
   3471 //===----------------------------------------------------------------------===//
   3472 // Top Level Sema Entry Points
   3473 //===----------------------------------------------------------------------===//
   3474 
   3475 static void ProcessNonInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
   3476                                           const AttributeList &Attr) {
   3477   switch (Attr.getKind()) {
   3478   case AttributeList::AT_device:      handleDeviceAttr      (S, D, Attr); break;
   3479   case AttributeList::AT_host:        handleHostAttr        (S, D, Attr); break;
   3480   case AttributeList::AT_overloadable:handleOverloadableAttr(S, D, Attr); break;
   3481   default:
   3482     break;
   3483   }
   3484 }
   3485 
   3486 static void ProcessInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
   3487                                        const AttributeList &Attr) {
   3488   switch (Attr.getKind()) {
   3489   case AttributeList::AT_IBAction:            handleIBAction(S, D, Attr); break;
   3490     case AttributeList::AT_IBOutlet:          handleIBOutlet(S, D, Attr); break;
   3491   case AttributeList::AT_IBOutletCollection:
   3492       handleIBOutletCollection(S, D, Attr); break;
   3493   case AttributeList::AT_address_space:
   3494   case AttributeList::AT_opencl_image_access:
   3495   case AttributeList::AT_objc_gc:
   3496   case AttributeList::AT_vector_size:
   3497   case AttributeList::AT_neon_vector_type:
   3498   case AttributeList::AT_neon_polyvector_type:
   3499     // Ignore these, these are type attributes, handled by
   3500     // ProcessTypeAttributes.
   3501     break;
   3502   case AttributeList::AT_device:
   3503   case AttributeList::AT_host:
   3504   case AttributeList::AT_overloadable:
   3505     // Ignore, this is a non-inheritable attribute, handled
   3506     // by ProcessNonInheritableDeclAttr.
   3507     break;
   3508   case AttributeList::AT_alias:       handleAliasAttr       (S, D, Attr); break;
   3509   case AttributeList::AT_aligned:     handleAlignedAttr     (S, D, Attr); break;
   3510   case AttributeList::AT_always_inline:
   3511     handleAlwaysInlineAttr  (S, D, Attr); break;
   3512   case AttributeList::AT_analyzer_noreturn:
   3513     handleAnalyzerNoReturnAttr  (S, D, Attr); break;
   3514   case AttributeList::AT_annotate:    handleAnnotateAttr    (S, D, Attr); break;
   3515   case AttributeList::AT_availability:handleAvailabilityAttr(S, D, Attr); break;
   3516   case AttributeList::AT_carries_dependency:
   3517                                       handleDependencyAttr  (S, D, Attr); break;
   3518   case AttributeList::AT_common:      handleCommonAttr      (S, D, Attr); break;
   3519   case AttributeList::AT_constant:    handleConstantAttr    (S, D, Attr); break;
   3520   case AttributeList::AT_constructor: handleConstructorAttr (S, D, Attr); break;
   3521   case AttributeList::AT_deprecated:  handleDeprecatedAttr  (S, D, Attr); break;
   3522   case AttributeList::AT_destructor:  handleDestructorAttr  (S, D, Attr); break;
   3523   case AttributeList::AT_ext_vector_type:
   3524     handleExtVectorTypeAttr(S, scope, D, Attr);
   3525     break;
   3526   case AttributeList::AT_format:      handleFormatAttr      (S, D, Attr); break;
   3527   case AttributeList::AT_format_arg:  handleFormatArgAttr   (S, D, Attr); break;
   3528   case AttributeList::AT_global:      handleGlobalAttr      (S, D, Attr); break;
   3529   case AttributeList::AT_gnu_inline:  handleGNUInlineAttr   (S, D, Attr); break;
   3530   case AttributeList::AT_launch_bounds:
   3531     handleLaunchBoundsAttr(S, D, Attr);
   3532     break;
   3533   case AttributeList::AT_mode:        handleModeAttr        (S, D, Attr); break;
   3534   case AttributeList::AT_malloc:      handleMallocAttr      (S, D, Attr); break;
   3535   case AttributeList::AT_may_alias:   handleMayAliasAttr    (S, D, Attr); break;
   3536   case AttributeList::AT_nocommon:    handleNoCommonAttr    (S, D, Attr); break;
   3537   case AttributeList::AT_nonnull:     handleNonNullAttr     (S, D, Attr); break;
   3538   case AttributeList::AT_ownership_returns:
   3539   case AttributeList::AT_ownership_takes:
   3540   case AttributeList::AT_ownership_holds:
   3541       handleOwnershipAttr     (S, D, Attr); break;
   3542   case AttributeList::AT_naked:       handleNakedAttr       (S, D, Attr); break;
   3543   case AttributeList::AT_noreturn:    handleNoReturnAttr    (S, D, Attr); break;
   3544   case AttributeList::AT_nothrow:     handleNothrowAttr     (S, D, Attr); break;
   3545   case AttributeList::AT_shared:      handleSharedAttr      (S, D, Attr); break;
   3546   case AttributeList::AT_vecreturn:   handleVecReturnAttr   (S, D, Attr); break;
   3547 
   3548   case AttributeList::AT_objc_ownership:
   3549     handleObjCOwnershipAttr(S, D, Attr); break;
   3550   case AttributeList::AT_objc_precise_lifetime:
   3551     handleObjCPreciseLifetimeAttr(S, D, Attr); break;
   3552 
   3553   case AttributeList::AT_objc_returns_inner_pointer:
   3554     handleObjCReturnsInnerPointerAttr(S, D, Attr); break;
   3555 
   3556   case AttributeList::AT_ns_bridged:
   3557     handleNSBridgedAttr(S, scope, D, Attr); break;
   3558 
   3559   case AttributeList::AT_cf_audited_transfer:
   3560   case AttributeList::AT_cf_unknown_transfer:
   3561     handleCFTransferAttr(S, D, Attr); break;
   3562 
   3563   // Checker-specific.
   3564   case AttributeList::AT_cf_consumed:
   3565   case AttributeList::AT_ns_consumed: handleNSConsumedAttr  (S, D, Attr); break;
   3566   case AttributeList::AT_ns_consumes_self:
   3567     handleNSConsumesSelfAttr(S, D, Attr); break;
   3568 
   3569   case AttributeList::AT_ns_returns_autoreleased:
   3570   case AttributeList::AT_ns_returns_not_retained:
   3571   case AttributeList::AT_cf_returns_not_retained:
   3572   case AttributeList::AT_ns_returns_retained:
   3573   case AttributeList::AT_cf_returns_retained:
   3574     handleNSReturnsRetainedAttr(S, D, Attr); break;
   3575 
   3576   case AttributeList::AT_reqd_wg_size:
   3577     handleReqdWorkGroupSize(S, D, Attr); break;
   3578 
   3579   case AttributeList::AT_init_priority:
   3580       handleInitPriorityAttr(S, D, Attr); break;
   3581 
   3582   case AttributeList::AT_packed:      handlePackedAttr      (S, D, Attr); break;
   3583   case AttributeList::AT_MsStruct:    handleMsStructAttr    (S, D, Attr); break;
   3584   case AttributeList::AT_section:     handleSectionAttr     (S, D, Attr); break;
   3585   case AttributeList::AT_unavailable: handleUnavailableAttr (S, D, Attr); break;
   3586   case AttributeList::AT_arc_weakref_unavailable:
   3587     handleArcWeakrefUnavailableAttr (S, D, Attr);
   3588     break;
   3589   case AttributeList::AT_unused:      handleUnusedAttr      (S, D, Attr); break;
   3590   case AttributeList::AT_returns_twice:
   3591     handleReturnsTwiceAttr(S, D, Attr);
   3592     break;
   3593   case AttributeList::AT_used:        handleUsedAttr        (S, D, Attr); break;
   3594   case AttributeList::AT_visibility:  handleVisibilityAttr  (S, D, Attr); break;
   3595   case AttributeList::AT_warn_unused_result: handleWarnUnusedResult(S, D, Attr);
   3596     break;
   3597   case AttributeList::AT_weak:        handleWeakAttr        (S, D, Attr); break;
   3598   case AttributeList::AT_weakref:     handleWeakRefAttr     (S, D, Attr); break;
   3599   case AttributeList::AT_weak_import: handleWeakImportAttr  (S, D, Attr); break;
   3600   case AttributeList::AT_transparent_union:
   3601     handleTransparentUnionAttr(S, D, Attr);
   3602     break;
   3603   case AttributeList::AT_objc_exception:
   3604     handleObjCExceptionAttr(S, D, Attr);
   3605     break;
   3606   case AttributeList::AT_objc_method_family:
   3607     handleObjCMethodFamilyAttr(S, D, Attr);
   3608     break;
   3609   case AttributeList::AT_nsobject:    handleObjCNSObject    (S, D, Attr); break;
   3610   case AttributeList::AT_blocks:      handleBlocksAttr      (S, D, Attr); break;
   3611   case AttributeList::AT_sentinel:    handleSentinelAttr    (S, D, Attr); break;
   3612   case AttributeList::AT_const:       handleConstAttr       (S, D, Attr); break;
   3613   case AttributeList::AT_pure:        handlePureAttr        (S, D, Attr); break;
   3614   case AttributeList::AT_cleanup:     handleCleanupAttr     (S, D, Attr); break;
   3615   case AttributeList::AT_nodebug:     handleNoDebugAttr     (S, D, Attr); break;
   3616   case AttributeList::AT_noinline:    handleNoInlineAttr    (S, D, Attr); break;
   3617   case AttributeList::AT_regparm:     handleRegparmAttr     (S, D, Attr); break;
   3618   case AttributeList::IgnoredAttribute:
   3619     // Just ignore
   3620     break;
   3621   case AttributeList::AT_no_instrument_function:  // Interacts with -pg.
   3622     handleNoInstrumentFunctionAttr(S, D, Attr);
   3623     break;
   3624   case AttributeList::AT_stdcall:
   3625   case AttributeList::AT_cdecl:
   3626   case AttributeList::AT_fastcall:
   3627   case AttributeList::AT_thiscall:
   3628   case AttributeList::AT_pascal:
   3629   case AttributeList::AT_pcs:
   3630     handleCallConvAttr(S, D, Attr);
   3631     break;
   3632   case AttributeList::AT_opencl_kernel_function:
   3633     handleOpenCLKernelAttr(S, D, Attr);
   3634     break;
   3635   case AttributeList::AT_uuid:
   3636     handleUuidAttr(S, D, Attr);
   3637     break;
   3638 
   3639   // Thread safety attributes:
   3640   case AttributeList::AT_guarded_var:
   3641     handleGuardedVarAttr(S, D, Attr);
   3642     break;
   3643   case AttributeList::AT_pt_guarded_var:
   3644     handleGuardedVarAttr(S, D, Attr, /*pointer = */true);
   3645     break;
   3646   case AttributeList::AT_scoped_lockable:
   3647     handleLockableAttr(S, D, Attr, /*scoped = */true);
   3648     break;
   3649   case AttributeList::AT_no_thread_safety_analysis:
   3650     handleNoThreadSafetyAttr(S, D, Attr);
   3651     break;
   3652   case AttributeList::AT_lockable:
   3653     handleLockableAttr(S, D, Attr);
   3654     break;
   3655   case AttributeList::AT_guarded_by:
   3656     handleGuardedByAttr(S, D, Attr);
   3657     break;
   3658   case AttributeList::AT_pt_guarded_by:
   3659     handleGuardedByAttr(S, D, Attr, /*pointer = */true);
   3660     break;
   3661   case AttributeList::AT_exclusive_lock_function:
   3662     handleLockFunAttr(S, D, Attr, /*exclusive = */true);
   3663     break;
   3664   case AttributeList::AT_exclusive_locks_required:
   3665     handleLocksRequiredAttr(S, D, Attr, /*exclusive = */true);
   3666     break;
   3667   case AttributeList::AT_exclusive_trylock_function:
   3668     handleTrylockFunAttr(S, D, Attr, /*exclusive = */true);
   3669     break;
   3670   case AttributeList::AT_lock_returned:
   3671     handleLockReturnedAttr(S, D, Attr);
   3672     break;
   3673   case AttributeList::AT_locks_excluded:
   3674     handleLocksExcludedAttr(S, D, Attr);
   3675     break;
   3676   case AttributeList::AT_shared_lock_function:
   3677     handleLockFunAttr(S, D, Attr);
   3678     break;
   3679   case AttributeList::AT_shared_locks_required:
   3680     handleLocksRequiredAttr(S, D, Attr);
   3681     break;
   3682   case AttributeList::AT_shared_trylock_function:
   3683     handleTrylockFunAttr(S, D, Attr);
   3684     break;
   3685   case AttributeList::AT_unlock_function:
   3686     handleUnlockFunAttr(S, D, Attr);
   3687     break;
   3688   case AttributeList::AT_acquired_before:
   3689     handleAcquireOrderAttr(S, D, Attr, /*before = */true);
   3690     break;
   3691   case AttributeList::AT_acquired_after:
   3692     handleAcquireOrderAttr(S, D, Attr, /*before = */false);
   3693     break;
   3694 
   3695   default:
   3696     // Ask target about the attribute.
   3697     const TargetAttributesSema &TargetAttrs = S.getTargetAttributesSema();
   3698     if (!TargetAttrs.ProcessDeclAttribute(scope, D, Attr, S))
   3699       S.Diag(Attr.getLoc(), diag::warn_unknown_attribute_ignored)
   3700         << Attr.getName();
   3701     break;
   3702   }
   3703 }
   3704 
   3705 /// ProcessDeclAttribute - Apply the specific attribute to the specified decl if
   3706 /// the attribute applies to decls.  If the attribute is a type attribute, just
   3707 /// silently ignore it if a GNU attribute. FIXME: Applying a C++0x attribute to
   3708 /// the wrong thing is illegal (C++0x [dcl.attr.grammar]/4).
   3709 static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
   3710                                  const AttributeList &Attr,
   3711                                  bool NonInheritable, bool Inheritable) {
   3712   if (Attr.isInvalid())
   3713     return;
   3714 
   3715   if (Attr.isDeclspecAttribute() && !isKnownDeclSpecAttr(Attr))
   3716     // FIXME: Try to deal with other __declspec attributes!
   3717     return;
   3718 
   3719   if (NonInheritable)
   3720     ProcessNonInheritableDeclAttr(S, scope, D, Attr);
   3721 
   3722   if (Inheritable)
   3723     ProcessInheritableDeclAttr(S, scope, D, Attr);
   3724 }
   3725 
   3726 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
   3727 /// attribute list to the specified decl, ignoring any type attributes.
   3728 void Sema::ProcessDeclAttributeList(Scope *S, Decl *D,
   3729                                     const AttributeList *AttrList,
   3730                                     bool NonInheritable, bool Inheritable) {
   3731   for (const AttributeList* l = AttrList; l; l = l->getNext()) {
   3732     ProcessDeclAttribute(*this, S, D, *l, NonInheritable, Inheritable);
   3733   }
   3734 
   3735   // GCC accepts
   3736   // static int a9 __attribute__((weakref));
   3737   // but that looks really pointless. We reject it.
   3738   if (Inheritable && D->hasAttr<WeakRefAttr>() && !D->hasAttr<AliasAttr>()) {
   3739     Diag(AttrList->getLoc(), diag::err_attribute_weakref_without_alias) <<
   3740     dyn_cast<NamedDecl>(D)->getNameAsString();
   3741     return;
   3742   }
   3743 }
   3744 
   3745 // Annotation attributes are the only attributes allowed after an access
   3746 // specifier.
   3747 bool Sema::ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl,
   3748                                           const AttributeList *AttrList) {
   3749   for (const AttributeList* l = AttrList; l; l = l->getNext()) {
   3750     if (l->getKind() == AttributeList::AT_annotate) {
   3751       handleAnnotateAttr(*this, ASDecl, *l);
   3752     } else {
   3753       Diag(l->getLoc(), diag::err_only_annotate_after_access_spec);
   3754       return true;
   3755     }
   3756   }
   3757 
   3758   return false;
   3759 }
   3760 
   3761 /// checkUnusedDeclAttributes - Check a list of attributes to see if it
   3762 /// contains any decl attributes that we should warn about.
   3763 static void checkUnusedDeclAttributes(Sema &S, const AttributeList *A) {
   3764   for ( ; A; A = A->getNext()) {
   3765     // Only warn if the attribute is an unignored, non-type attribute.
   3766     if (A->isUsedAsTypeAttr()) continue;
   3767     if (A->getKind() == AttributeList::IgnoredAttribute) continue;
   3768 
   3769     if (A->getKind() == AttributeList::UnknownAttribute) {
   3770       S.Diag(A->getLoc(), diag::warn_unknown_attribute_ignored)
   3771         << A->getName() << A->getRange();
   3772     } else {
   3773       S.Diag(A->getLoc(), diag::warn_attribute_not_on_decl)
   3774         << A->getName() << A->getRange();
   3775     }
   3776   }
   3777 }
   3778 
   3779 /// checkUnusedDeclAttributes - Given a declarator which is not being
   3780 /// used to build a declaration, complain about any decl attributes
   3781 /// which might be lying around on it.
   3782 void Sema::checkUnusedDeclAttributes(Declarator &D) {
   3783   ::checkUnusedDeclAttributes(*this, D.getDeclSpec().getAttributes().getList());
   3784   ::checkUnusedDeclAttributes(*this, D.getAttributes());
   3785   for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i)
   3786     ::checkUnusedDeclAttributes(*this, D.getTypeObject(i).getAttrs());
   3787 }
   3788 
   3789 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
   3790 /// #pragma weak needs a non-definition decl and source may not have one
   3791 NamedDecl * Sema::DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II,
   3792                                       SourceLocation Loc) {
   3793   assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
   3794   NamedDecl *NewD = 0;
   3795   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
   3796     FunctionDecl *NewFD;
   3797     // FIXME: Missing call to CheckFunctionDeclaration().
   3798     // FIXME: Mangling?
   3799     // FIXME: Is the qualifier info correct?
   3800     // FIXME: Is the DeclContext correct?
   3801     NewFD = FunctionDecl::Create(FD->getASTContext(), FD->getDeclContext(),
   3802                                  Loc, Loc, DeclarationName(II),
   3803                                  FD->getType(), FD->getTypeSourceInfo(),
   3804                                  SC_None, SC_None,
   3805                                  false/*isInlineSpecified*/,
   3806                                  FD->hasPrototype(),
   3807                                  false/*isConstexprSpecified*/);
   3808     NewD = NewFD;
   3809 
   3810     if (FD->getQualifier())
   3811       NewFD->setQualifierInfo(FD->getQualifierLoc());
   3812 
   3813     // Fake up parameter variables; they are declared as if this were
   3814     // a typedef.
   3815     QualType FDTy = FD->getType();
   3816     if (const FunctionProtoType *FT = FDTy->getAs<FunctionProtoType>()) {
   3817       SmallVector<ParmVarDecl*, 16> Params;
   3818       for (FunctionProtoType::arg_type_iterator AI = FT->arg_type_begin(),
   3819            AE = FT->arg_type_end(); AI != AE; ++AI) {
   3820         ParmVarDecl *Param = BuildParmVarDeclForTypedef(NewFD, Loc, *AI);
   3821         Param->setScopeInfo(0, Params.size());
   3822         Params.push_back(Param);
   3823       }
   3824       NewFD->setParams(Params);
   3825     }
   3826   } else if (VarDecl *VD = dyn_cast<VarDecl>(ND)) {
   3827     NewD = VarDecl::Create(VD->getASTContext(), VD->getDeclContext(),
   3828                            VD->getInnerLocStart(), VD->getLocation(), II,
   3829                            VD->getType(), VD->getTypeSourceInfo(),
   3830                            VD->getStorageClass(),
   3831                            VD->getStorageClassAsWritten());
   3832     if (VD->getQualifier()) {
   3833       VarDecl *NewVD = cast<VarDecl>(NewD);
   3834       NewVD->setQualifierInfo(VD->getQualifierLoc());
   3835     }
   3836   }
   3837   return NewD;
   3838 }
   3839 
   3840 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak
   3841 /// applied to it, possibly with an alias.
   3842 void Sema::DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, WeakInfo &W) {
   3843   if (W.getUsed()) return; // only do this once
   3844   W.setUsed(true);
   3845   if (W.getAlias()) { // clone decl, impersonate __attribute(weak,alias(...))
   3846     IdentifierInfo *NDId = ND->getIdentifier();
   3847     NamedDecl *NewD = DeclClonePragmaWeak(ND, W.getAlias(), W.getLocation());
   3848     NewD->addAttr(::new (Context) AliasAttr(W.getLocation(), Context,
   3849                                             NDId->getName()));
   3850     NewD->addAttr(::new (Context) WeakAttr(W.getLocation(), Context));
   3851     WeakTopLevelDecl.push_back(NewD);
   3852     // FIXME: "hideous" code from Sema::LazilyCreateBuiltin
   3853     // to insert Decl at TU scope, sorry.
   3854     DeclContext *SavedContext = CurContext;
   3855     CurContext = Context.getTranslationUnitDecl();
   3856     PushOnScopeChains(NewD, S);
   3857     CurContext = SavedContext;
   3858   } else { // just add weak to existing
   3859     ND->addAttr(::new (Context) WeakAttr(W.getLocation(), Context));
   3860   }
   3861 }
   3862 
   3863 /// ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in
   3864 /// it, apply them to D.  This is a bit tricky because PD can have attributes
   3865 /// specified in many different places, and we need to find and apply them all.
   3866 void Sema::ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD,
   3867                                  bool NonInheritable, bool Inheritable) {
   3868   // It's valid to "forward-declare" #pragma weak, in which case we
   3869   // have to do this.
   3870   if (Inheritable) {
   3871     LoadExternalWeakUndeclaredIdentifiers();
   3872     if (!WeakUndeclaredIdentifiers.empty()) {
   3873       if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
   3874         if (IdentifierInfo *Id = ND->getIdentifier()) {
   3875           llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator I
   3876             = WeakUndeclaredIdentifiers.find(Id);
   3877           if (I != WeakUndeclaredIdentifiers.end() && ND->hasLinkage()) {
   3878             WeakInfo W = I->second;
   3879             DeclApplyPragmaWeak(S, ND, W);
   3880             WeakUndeclaredIdentifiers[Id] = W;
   3881           }
   3882         }
   3883       }
   3884     }
   3885   }
   3886 
   3887   // Apply decl attributes from the DeclSpec if present.
   3888   if (const AttributeList *Attrs = PD.getDeclSpec().getAttributes().getList())
   3889     ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
   3890 
   3891   // Walk the declarator structure, applying decl attributes that were in a type
   3892   // position to the decl itself.  This handles cases like:
   3893   //   int *__attr__(x)** D;
   3894   // when X is a decl attribute.
   3895   for (unsigned i = 0, e = PD.getNumTypeObjects(); i != e; ++i)
   3896     if (const AttributeList *Attrs = PD.getTypeObject(i).getAttrs())
   3897       ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
   3898 
   3899   // Finally, apply any attributes on the decl itself.
   3900   if (const AttributeList *Attrs = PD.getAttributes())
   3901     ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
   3902 }
   3903 
   3904 /// Is the given declaration allowed to use a forbidden type?
   3905 static bool isForbiddenTypeAllowed(Sema &S, Decl *decl) {
   3906   // Private ivars are always okay.  Unfortunately, people don't
   3907   // always properly make their ivars private, even in system headers.
   3908   // Plus we need to make fields okay, too.
   3909   // Function declarations in sys headers will be marked unavailable.
   3910   if (!isa<FieldDecl>(decl) && !isa<ObjCPropertyDecl>(decl) &&
   3911       !isa<FunctionDecl>(decl))
   3912     return false;
   3913 
   3914   // Require it to be declared in a system header.
   3915   return S.Context.getSourceManager().isInSystemHeader(decl->getLocation());
   3916 }
   3917 
   3918 /// Handle a delayed forbidden-type diagnostic.
   3919 static void handleDelayedForbiddenType(Sema &S, DelayedDiagnostic &diag,
   3920                                        Decl *decl) {
   3921   if (decl && isForbiddenTypeAllowed(S, decl)) {
   3922     decl->addAttr(new (S.Context) UnavailableAttr(diag.Loc, S.Context,
   3923                         "this system declaration uses an unsupported type"));
   3924     return;
   3925   }
   3926   if (S.getLangOptions().ObjCAutoRefCount)
   3927     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(decl)) {
   3928       // FIXME. we may want to supress diagnostics for all
   3929       // kind of forbidden type messages on unavailable functions.
   3930       if (FD->hasAttr<UnavailableAttr>() &&
   3931           diag.getForbiddenTypeDiagnostic() ==
   3932           diag::err_arc_array_param_no_ownership) {
   3933         diag.Triggered = true;
   3934         return;
   3935       }
   3936     }
   3937 
   3938   S.Diag(diag.Loc, diag.getForbiddenTypeDiagnostic())
   3939     << diag.getForbiddenTypeOperand() << diag.getForbiddenTypeArgument();
   3940   diag.Triggered = true;
   3941 }
   3942 
   3943 // This duplicates a vector push_back but hides the need to know the
   3944 // size of the type.
   3945 void Sema::DelayedDiagnostics::add(const DelayedDiagnostic &diag) {
   3946   assert(StackSize <= StackCapacity);
   3947 
   3948   // Grow the stack if necessary.
   3949   if (StackSize == StackCapacity) {
   3950     unsigned newCapacity = 2 * StackCapacity + 2;
   3951     char *newBuffer = new char[newCapacity * sizeof(DelayedDiagnostic)];
   3952     const char *oldBuffer = (const char*) Stack;
   3953 
   3954     if (StackCapacity)
   3955       memcpy(newBuffer, oldBuffer, StackCapacity * sizeof(DelayedDiagnostic));
   3956 
   3957     delete[] oldBuffer;
   3958     Stack = reinterpret_cast<sema::DelayedDiagnostic*>(newBuffer);
   3959     StackCapacity = newCapacity;
   3960   }
   3961 
   3962   assert(StackSize < StackCapacity);
   3963   new (&Stack[StackSize++]) DelayedDiagnostic(diag);
   3964 }
   3965 
   3966 void Sema::DelayedDiagnostics::popParsingDecl(Sema &S, ParsingDeclState state,
   3967                                               Decl *decl) {
   3968   DelayedDiagnostics &DD = S.DelayedDiagnostics;
   3969 
   3970   // Check the invariants.
   3971   assert(DD.StackSize >= state.SavedStackSize);
   3972   assert(state.SavedStackSize >= DD.ActiveStackBase);
   3973   assert(DD.ParsingDepth > 0);
   3974 
   3975   // Drop the parsing depth.
   3976   DD.ParsingDepth--;
   3977 
   3978   // If there are no active diagnostics, we're done.
   3979   if (DD.StackSize == DD.ActiveStackBase)
   3980     return;
   3981 
   3982   // We only want to actually emit delayed diagnostics when we
   3983   // successfully parsed a decl.
   3984   if (decl && !decl->isInvalidDecl()) {
   3985     // We emit all the active diagnostics, not just those starting
   3986     // from the saved state.  The idea is this:  we get one push for a
   3987     // decl spec and another for each declarator;  in a decl group like:
   3988     //   deprecated_typedef foo, *bar, baz();
   3989     // only the declarator pops will be passed decls.  This is correct;
   3990     // we really do need to consider delayed diagnostics from the decl spec
   3991     // for each of the different declarations.
   3992     for (unsigned i = DD.ActiveStackBase, e = DD.StackSize; i != e; ++i) {
   3993       DelayedDiagnostic &diag = DD.Stack[i];
   3994       if (diag.Triggered)
   3995         continue;
   3996 
   3997       switch (diag.Kind) {
   3998       case DelayedDiagnostic::Deprecation:
   3999         S.HandleDelayedDeprecationCheck(diag, decl);
   4000         break;
   4001 
   4002       case DelayedDiagnostic::Access:
   4003         S.HandleDelayedAccessCheck(diag, decl);
   4004         break;
   4005 
   4006       case DelayedDiagnostic::ForbiddenType:
   4007         handleDelayedForbiddenType(S, diag, decl);
   4008         break;
   4009       }
   4010     }
   4011   }
   4012 
   4013   // Destroy all the delayed diagnostics we're about to pop off.
   4014   for (unsigned i = state.SavedStackSize, e = DD.StackSize; i != e; ++i)
   4015     DD.Stack[i].Destroy();
   4016 
   4017   DD.StackSize = state.SavedStackSize;
   4018 }
   4019 
   4020 static bool isDeclDeprecated(Decl *D) {
   4021   do {
   4022     if (D->isDeprecated())
   4023       return true;
   4024     // A category implicitly has the availability of the interface.
   4025     if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(D))
   4026       return CatD->getClassInterface()->isDeprecated();
   4027   } while ((D = cast_or_null<Decl>(D->getDeclContext())));
   4028   return false;
   4029 }
   4030 
   4031 void Sema::HandleDelayedDeprecationCheck(DelayedDiagnostic &DD,
   4032                                          Decl *Ctx) {
   4033   if (isDeclDeprecated(Ctx))
   4034     return;
   4035 
   4036   DD.Triggered = true;
   4037   if (!DD.getDeprecationMessage().empty())
   4038     Diag(DD.Loc, diag::warn_deprecated_message)
   4039       << DD.getDeprecationDecl()->getDeclName()
   4040       << DD.getDeprecationMessage();
   4041   else
   4042     Diag(DD.Loc, diag::warn_deprecated)
   4043       << DD.getDeprecationDecl()->getDeclName();
   4044 }
   4045 
   4046 void Sema::EmitDeprecationWarning(NamedDecl *D, StringRef Message,
   4047                                   SourceLocation Loc,
   4048                                   const ObjCInterfaceDecl *UnknownObjCClass) {
   4049   // Delay if we're currently parsing a declaration.
   4050   if (DelayedDiagnostics.shouldDelayDiagnostics()) {
   4051     DelayedDiagnostics.add(DelayedDiagnostic::makeDeprecation(Loc, D, Message));
   4052     return;
   4053   }
   4054 
   4055   // Otherwise, don't warn if our current context is deprecated.
   4056   if (isDeclDeprecated(cast<Decl>(getCurLexicalContext())))
   4057     return;
   4058   if (!Message.empty())
   4059     Diag(Loc, diag::warn_deprecated_message) << D->getDeclName()
   4060                                              << Message;
   4061   else {
   4062     if (!UnknownObjCClass)
   4063       Diag(Loc, diag::warn_deprecated) << D->getDeclName();
   4064     else {
   4065       Diag(Loc, diag::warn_deprecated_fwdclass_message) << D->getDeclName();
   4066       Diag(UnknownObjCClass->getLocation(), diag::note_forward_class);
   4067     }
   4068   }
   4069 }
   4070