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