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