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   D->addAttr(::new (S.Context) ObjCNSObjectAttr(Attr.getRange(), S.Context));
1750 }
1751 
1752 static void
1753 handleOverloadableAttr(Sema &S, Decl *D, const AttributeList &Attr) {
1754   if (Attr.getNumArgs() != 0) {
1755     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
1756     return;
1757   }
1758 
1759   if (!isa<FunctionDecl>(D)) {
1760     S.Diag(Attr.getLoc(), diag::err_attribute_overloadable_not_function);
1761     return;
1762   }
1763 
1764   D->addAttr(::new (S.Context) OverloadableAttr(Attr.getRange(), S.Context));
1765 }
1766 
1767 static void handleBlocksAttr(Sema &S, Decl *D, const AttributeList &Attr) {
1768   if (!Attr.getParameterName()) {
1769     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
1770       << "blocks" << 1;
1771     return;
1772   }
1773 
1774   if (Attr.getNumArgs() != 0) {
1775     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
1776     return;
1777   }
1778 
1779   BlocksAttr::BlockType type;
1780   if (Attr.getParameterName()->isStr("byref"))
1781     type = BlocksAttr::ByRef;
1782   else {
1783     S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
1784       << "blocks" << Attr.getParameterName();
1785     return;
1786   }
1787 
1788   D->addAttr(::new (S.Context) BlocksAttr(Attr.getRange(), S.Context, type));
1789 }
1790 
1791 static void handleSentinelAttr(Sema &S, Decl *D, const AttributeList &Attr) {
1792   // check the attribute arguments.
1793   if (Attr.getNumArgs() > 2) {
1794     S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 2;
1795     return;
1796   }
1797 
1798   unsigned sentinel = 0;
1799   if (Attr.getNumArgs() > 0) {
1800     Expr *E = Attr.getArg(0);
1801     llvm::APSInt Idx(32);
1802     if (E->isTypeDependent() || E->isValueDependent() ||
1803         !E->isIntegerConstantExpr(Idx, S.Context)) {
1804       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
1805        << "sentinel" << 1 << E->getSourceRange();
1806       return;
1807     }
1808 
1809     if (Idx.isSigned() && Idx.isNegative()) {
1810       S.Diag(Attr.getLoc(), diag::err_attribute_sentinel_less_than_zero)
1811         << E->getSourceRange();
1812       return;
1813     }
1814 
1815     sentinel = Idx.getZExtValue();
1816   }
1817 
1818   unsigned nullPos = 0;
1819   if (Attr.getNumArgs() > 1) {
1820     Expr *E = Attr.getArg(1);
1821     llvm::APSInt Idx(32);
1822     if (E->isTypeDependent() || E->isValueDependent() ||
1823         !E->isIntegerConstantExpr(Idx, S.Context)) {
1824       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
1825         << "sentinel" << 2 << E->getSourceRange();
1826       return;
1827     }
1828     nullPos = Idx.getZExtValue();
1829 
1830     if ((Idx.isSigned() && Idx.isNegative()) || nullPos > 1) {
1831       // FIXME: This error message could be improved, it would be nice
1832       // to say what the bounds actually are.
1833       S.Diag(Attr.getLoc(), diag::err_attribute_sentinel_not_zero_or_one)
1834         << E->getSourceRange();
1835       return;
1836     }
1837   }
1838 
1839   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1840     const FunctionType *FT = FD->getType()->castAs<FunctionType>();
1841     if (isa<FunctionNoProtoType>(FT)) {
1842       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_named_arguments);
1843       return;
1844     }
1845 
1846     if (!cast<FunctionProtoType>(FT)->isVariadic()) {
1847       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
1848       return;
1849     }
1850   } else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) {
1851     if (!MD->isVariadic()) {
1852       S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << 0;
1853       return;
1854     }
1855   } else if (isa<BlockDecl>(D)) {
1856     // Note! BlockDecl is typeless. Variadic diagnostics will be issued by the
1857     // caller.
1858     ;
1859   } else if (const VarDecl *V = dyn_cast<VarDecl>(D)) {
1860     QualType Ty = V->getType();
1861     if (Ty->isBlockPointerType() || Ty->isFunctionPointerType()) {
1862       const FunctionType *FT = Ty->isFunctionPointerType() ? getFunctionType(D)
1863        : Ty->getAs<BlockPointerType>()->getPointeeType()->getAs<FunctionType>();
1864       if (!cast<FunctionProtoType>(FT)->isVariadic()) {
1865         int m = Ty->isFunctionPointerType() ? 0 : 1;
1866         S.Diag(Attr.getLoc(), diag::warn_attribute_sentinel_not_variadic) << m;
1867         return;
1868       }
1869     } else {
1870       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
1871         << Attr.getName() << ExpectedFunctionMethodOrBlock;
1872       return;
1873     }
1874   } else {
1875     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
1876       << Attr.getName() << ExpectedFunctionMethodOrBlock;
1877     return;
1878   }
1879   D->addAttr(::new (S.Context) SentinelAttr(Attr.getRange(), S.Context, sentinel,
1880                                             nullPos));
1881 }
1882 
1883 static void handleWarnUnusedResult(Sema &S, Decl *D, const AttributeList &Attr) {
1884   // check the attribute arguments.
1885   if (!checkAttributeNumArgs(S, Attr, 0))
1886     return;
1887 
1888   if (!isFunction(D) && !isa<ObjCMethodDecl>(D)) {
1889     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
1890       << Attr.getName() << ExpectedFunctionOrMethod;
1891     return;
1892   }
1893 
1894   if (isFunction(D) && getFunctionType(D)->getResultType()->isVoidType()) {
1895     S.Diag(Attr.getLoc(), diag::warn_attribute_void_function_method)
1896       << Attr.getName() << 0;
1897     return;
1898   }
1899   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
1900     if (MD->getResultType()->isVoidType()) {
1901       S.Diag(Attr.getLoc(), diag::warn_attribute_void_function_method)
1902       << Attr.getName() << 1;
1903       return;
1904     }
1905 
1906   D->addAttr(::new (S.Context) WarnUnusedResultAttr(Attr.getRange(), S.Context));
1907 }
1908 
1909 static void handleWeakAttr(Sema &S, Decl *D, const AttributeList &Attr) {
1910   // check the attribute arguments.
1911   if (Attr.hasParameterOrArguments()) {
1912     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
1913     return;
1914   }
1915 
1916   if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) {
1917     if (isa<CXXRecordDecl>(D)) {
1918       D->addAttr(::new (S.Context) WeakAttr(Attr.getRange(), S.Context));
1919       return;
1920     }
1921     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
1922       << Attr.getName() << ExpectedVariableOrFunction;
1923     return;
1924   }
1925 
1926   NamedDecl *nd = cast<NamedDecl>(D);
1927 
1928   // 'weak' only applies to declarations with external linkage.
1929   if (hasEffectivelyInternalLinkage(nd)) {
1930     S.Diag(Attr.getLoc(), diag::err_attribute_weak_static);
1931     return;
1932   }
1933 
1934   nd->addAttr(::new (S.Context) WeakAttr(Attr.getRange(), S.Context));
1935 }
1936 
1937 static void handleWeakImportAttr(Sema &S, Decl *D, const AttributeList &Attr) {
1938   // check the attribute arguments.
1939   if (!checkAttributeNumArgs(S, Attr, 0))
1940     return;
1941 
1942 
1943   // weak_import only applies to variable & function declarations.
1944   bool isDef = false;
1945   if (!D->canBeWeakImported(isDef)) {
1946     if (isDef)
1947       S.Diag(Attr.getLoc(),
1948              diag::warn_attribute_weak_import_invalid_on_definition)
1949         << "weak_import" << 2 /*variable and function*/;
1950     else if (isa<ObjCPropertyDecl>(D) || isa<ObjCMethodDecl>(D) ||
1951              (S.Context.getTargetInfo().getTriple().isOSDarwin() &&
1952               (isa<ObjCInterfaceDecl>(D) || isa<EnumDecl>(D)))) {
1953       // Nothing to warn about here.
1954     } else
1955       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
1956         << Attr.getName() << ExpectedVariableOrFunction;
1957 
1958     return;
1959   }
1960 
1961   D->addAttr(::new (S.Context) WeakImportAttr(Attr.getRange(), S.Context));
1962 }
1963 
1964 static void handleReqdWorkGroupSize(Sema &S, Decl *D,
1965                                     const AttributeList &Attr) {
1966   // Attribute has 3 arguments.
1967   if (!checkAttributeNumArgs(S, Attr, 3))
1968     return;
1969 
1970   unsigned WGSize[3];
1971   for (unsigned i = 0; i < 3; ++i) {
1972     Expr *E = Attr.getArg(i);
1973     llvm::APSInt ArgNum(32);
1974     if (E->isTypeDependent() || E->isValueDependent() ||
1975         !E->isIntegerConstantExpr(ArgNum, S.Context)) {
1976       S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
1977         << "reqd_work_group_size" << E->getSourceRange();
1978       return;
1979     }
1980     WGSize[i] = (unsigned) ArgNum.getZExtValue();
1981   }
1982   D->addAttr(::new (S.Context) ReqdWorkGroupSizeAttr(Attr.getRange(), S.Context,
1983                                                      WGSize[0], WGSize[1],
1984                                                      WGSize[2]));
1985 }
1986 
1987 static void handleSectionAttr(Sema &S, Decl *D, const AttributeList &Attr) {
1988   // Attribute has no arguments.
1989   if (!checkAttributeNumArgs(S, Attr, 1))
1990     return;
1991 
1992   // Make sure that there is a string literal as the sections's single
1993   // argument.
1994   Expr *ArgExpr = Attr.getArg(0);
1995   StringLiteral *SE = dyn_cast<StringLiteral>(ArgExpr);
1996   if (!SE) {
1997     S.Diag(ArgExpr->getLocStart(), diag::err_attribute_not_string) << "section";
1998     return;
1999   }
2000 
2001   // If the target wants to validate the section specifier, make it happen.
2002   std::string Error = S.Context.getTargetInfo().isValidSectionSpecifier(SE->getString());
2003   if (!Error.empty()) {
2004     S.Diag(SE->getLocStart(), diag::err_attribute_section_invalid_for_target)
2005     << Error;
2006     return;
2007   }
2008 
2009   // This attribute cannot be applied to local variables.
2010   if (isa<VarDecl>(D) && cast<VarDecl>(D)->hasLocalStorage()) {
2011     S.Diag(SE->getLocStart(), diag::err_attribute_section_local_variable);
2012     return;
2013   }
2014 
2015   D->addAttr(::new (S.Context) SectionAttr(Attr.getRange(), S.Context,
2016                                            SE->getString()));
2017 }
2018 
2019 
2020 static void handleNothrowAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2021   // check the attribute arguments.
2022   if (Attr.hasParameterOrArguments()) {
2023     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
2024     return;
2025   }
2026 
2027   if (NoThrowAttr *Existing = D->getAttr<NoThrowAttr>()) {
2028     if (Existing->getLocation().isInvalid())
2029       Existing->setRange(Attr.getRange());
2030   } else {
2031     D->addAttr(::new (S.Context) NoThrowAttr(Attr.getRange(), S.Context));
2032   }
2033 }
2034 
2035 static void handleConstAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2036   // check the attribute arguments.
2037   if (Attr.hasParameterOrArguments()) {
2038     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
2039     return;
2040   }
2041 
2042   if (ConstAttr *Existing = D->getAttr<ConstAttr>()) {
2043    if (Existing->getLocation().isInvalid())
2044      Existing->setRange(Attr.getRange());
2045   } else {
2046     D->addAttr(::new (S.Context) ConstAttr(Attr.getRange(), S.Context));
2047   }
2048 }
2049 
2050 static void handlePureAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2051   // check the attribute arguments.
2052   if (!checkAttributeNumArgs(S, Attr, 0))
2053     return;
2054 
2055   D->addAttr(::new (S.Context) PureAttr(Attr.getRange(), S.Context));
2056 }
2057 
2058 static void handleCleanupAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2059   if (!Attr.getParameterName()) {
2060     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
2061     return;
2062   }
2063 
2064   if (Attr.getNumArgs() != 0) {
2065     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
2066     return;
2067   }
2068 
2069   VarDecl *VD = dyn_cast<VarDecl>(D);
2070 
2071   if (!VD || !VD->hasLocalStorage()) {
2072     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "cleanup";
2073     return;
2074   }
2075 
2076   // Look up the function
2077   // FIXME: Lookup probably isn't looking in the right place
2078   NamedDecl *CleanupDecl
2079     = S.LookupSingleName(S.TUScope, Attr.getParameterName(),
2080                          Attr.getParameterLoc(), Sema::LookupOrdinaryName);
2081   if (!CleanupDecl) {
2082     S.Diag(Attr.getParameterLoc(), diag::err_attribute_cleanup_arg_not_found) <<
2083       Attr.getParameterName();
2084     return;
2085   }
2086 
2087   FunctionDecl *FD = dyn_cast<FunctionDecl>(CleanupDecl);
2088   if (!FD) {
2089     S.Diag(Attr.getParameterLoc(),
2090            diag::err_attribute_cleanup_arg_not_function)
2091       << Attr.getParameterName();
2092     return;
2093   }
2094 
2095   if (FD->getNumParams() != 1) {
2096     S.Diag(Attr.getParameterLoc(),
2097            diag::err_attribute_cleanup_func_must_take_one_arg)
2098       << Attr.getParameterName();
2099     return;
2100   }
2101 
2102   // We're currently more strict than GCC about what function types we accept.
2103   // If this ever proves to be a problem it should be easy to fix.
2104   QualType Ty = S.Context.getPointerType(VD->getType());
2105   QualType ParamTy = FD->getParamDecl(0)->getType();
2106   if (S.CheckAssignmentConstraints(FD->getParamDecl(0)->getLocation(),
2107                                    ParamTy, Ty) != Sema::Compatible) {
2108     S.Diag(Attr.getParameterLoc(),
2109            diag::err_attribute_cleanup_func_arg_incompatible_type) <<
2110       Attr.getParameterName() << ParamTy << Ty;
2111     return;
2112   }
2113 
2114   D->addAttr(::new (S.Context) CleanupAttr(Attr.getRange(), S.Context, FD));
2115   S.MarkDeclarationReferenced(Attr.getParameterLoc(), FD);
2116 }
2117 
2118 /// Handle __attribute__((format_arg((idx)))) attribute based on
2119 /// http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
2120 static void handleFormatArgAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2121   if (!checkAttributeNumArgs(S, Attr, 1))
2122     return;
2123 
2124   if (!isFunctionOrMethod(D) || !hasFunctionProto(D)) {
2125     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2126       << Attr.getName() << ExpectedFunction;
2127     return;
2128   }
2129 
2130   // In C++ the implicit 'this' function parameter also counts, and they are
2131   // counted from one.
2132   bool HasImplicitThisParam = isInstanceMethod(D);
2133   unsigned NumArgs  = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
2134   unsigned FirstIdx = 1;
2135 
2136   // checks for the 2nd argument
2137   Expr *IdxExpr = Attr.getArg(0);
2138   llvm::APSInt Idx(32);
2139   if (IdxExpr->isTypeDependent() || IdxExpr->isValueDependent() ||
2140       !IdxExpr->isIntegerConstantExpr(Idx, S.Context)) {
2141     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
2142     << "format" << 2 << IdxExpr->getSourceRange();
2143     return;
2144   }
2145 
2146   if (Idx.getZExtValue() < FirstIdx || Idx.getZExtValue() > NumArgs) {
2147     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
2148     << "format" << 2 << IdxExpr->getSourceRange();
2149     return;
2150   }
2151 
2152   unsigned ArgIdx = Idx.getZExtValue() - 1;
2153 
2154   if (HasImplicitThisParam) {
2155     if (ArgIdx == 0) {
2156       S.Diag(Attr.getLoc(), diag::err_attribute_invalid_implicit_this_argument)
2157         << "format_arg" << IdxExpr->getSourceRange();
2158       return;
2159     }
2160     ArgIdx--;
2161   }
2162 
2163   // make sure the format string is really a string
2164   QualType Ty = getFunctionOrMethodArgType(D, ArgIdx);
2165 
2166   bool not_nsstring_type = !isNSStringType(Ty, S.Context);
2167   if (not_nsstring_type &&
2168       !isCFStringType(Ty, S.Context) &&
2169       (!Ty->isPointerType() ||
2170        !Ty->getAs<PointerType>()->getPointeeType()->isCharType())) {
2171     // FIXME: Should highlight the actual expression that has the wrong type.
2172     S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
2173     << (not_nsstring_type ? "a string type" : "an NSString")
2174        << IdxExpr->getSourceRange();
2175     return;
2176   }
2177   Ty = getFunctionOrMethodResultType(D);
2178   if (!isNSStringType(Ty, S.Context) &&
2179       !isCFStringType(Ty, S.Context) &&
2180       (!Ty->isPointerType() ||
2181        !Ty->getAs<PointerType>()->getPointeeType()->isCharType())) {
2182     // FIXME: Should highlight the actual expression that has the wrong type.
2183     S.Diag(Attr.getLoc(), diag::err_format_attribute_result_not)
2184     << (not_nsstring_type ? "string type" : "NSString")
2185        << IdxExpr->getSourceRange();
2186     return;
2187   }
2188 
2189   D->addAttr(::new (S.Context) FormatArgAttr(Attr.getRange(), S.Context,
2190                                              Idx.getZExtValue()));
2191 }
2192 
2193 enum FormatAttrKind {
2194   CFStringFormat,
2195   NSStringFormat,
2196   StrftimeFormat,
2197   SupportedFormat,
2198   IgnoredFormat,
2199   InvalidFormat
2200 };
2201 
2202 /// getFormatAttrKind - Map from format attribute names to supported format
2203 /// types.
2204 static FormatAttrKind getFormatAttrKind(StringRef Format) {
2205   // Check for formats that get handled specially.
2206   if (Format == "NSString")
2207     return NSStringFormat;
2208   if (Format == "CFString")
2209     return CFStringFormat;
2210   if (Format == "strftime")
2211     return StrftimeFormat;
2212 
2213   // Otherwise, check for supported formats.
2214   if (Format == "scanf" || Format == "printf" || Format == "printf0" ||
2215       Format == "strfmon" || Format == "cmn_err" || Format == "strftime" ||
2216       Format == "NSString" || Format == "CFString" || Format == "vcmn_err" ||
2217       Format == "zcmn_err" ||
2218       Format == "kprintf")  // OpenBSD.
2219     return SupportedFormat;
2220 
2221   if (Format == "gcc_diag" || Format == "gcc_cdiag" ||
2222       Format == "gcc_cxxdiag" || Format == "gcc_tdiag")
2223     return IgnoredFormat;
2224 
2225   return InvalidFormat;
2226 }
2227 
2228 /// Handle __attribute__((init_priority(priority))) attributes based on
2229 /// http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
2230 static void handleInitPriorityAttr(Sema &S, Decl *D,
2231                                    const AttributeList &Attr) {
2232   if (!S.getLangOptions().CPlusPlus) {
2233     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
2234     return;
2235   }
2236 
2237   if (!isa<VarDecl>(D) || S.getCurFunctionOrMethodDecl()) {
2238     S.Diag(Attr.getLoc(), diag::err_init_priority_object_attr);
2239     Attr.setInvalid();
2240     return;
2241   }
2242   QualType T = dyn_cast<VarDecl>(D)->getType();
2243   if (S.Context.getAsArrayType(T))
2244     T = S.Context.getBaseElementType(T);
2245   if (!T->getAs<RecordType>()) {
2246     S.Diag(Attr.getLoc(), diag::err_init_priority_object_attr);
2247     Attr.setInvalid();
2248     return;
2249   }
2250 
2251   if (Attr.getNumArgs() != 1) {
2252     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
2253     Attr.setInvalid();
2254     return;
2255   }
2256   Expr *priorityExpr = Attr.getArg(0);
2257 
2258   llvm::APSInt priority(32);
2259   if (priorityExpr->isTypeDependent() || priorityExpr->isValueDependent() ||
2260       !priorityExpr->isIntegerConstantExpr(priority, S.Context)) {
2261     S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
2262     << "init_priority" << priorityExpr->getSourceRange();
2263     Attr.setInvalid();
2264     return;
2265   }
2266   unsigned prioritynum = priority.getZExtValue();
2267   if (prioritynum < 101 || prioritynum > 65535) {
2268     S.Diag(Attr.getLoc(), diag::err_attribute_argument_outof_range)
2269     <<  priorityExpr->getSourceRange();
2270     Attr.setInvalid();
2271     return;
2272   }
2273   D->addAttr(::new (S.Context) InitPriorityAttr(Attr.getRange(), S.Context,
2274                                                 prioritynum));
2275 }
2276 
2277 /// Handle __attribute__((format(type,idx,firstarg))) attributes based on
2278 /// http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
2279 static void handleFormatAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2280 
2281   if (!Attr.getParameterName()) {
2282     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
2283       << "format" << 1;
2284     return;
2285   }
2286 
2287   if (Attr.getNumArgs() != 2) {
2288     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 3;
2289     return;
2290   }
2291 
2292   if (!isFunctionOrMethodOrBlock(D) || !hasFunctionProto(D)) {
2293     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2294       << Attr.getName() << ExpectedFunction;
2295     return;
2296   }
2297 
2298   // In C++ the implicit 'this' function parameter also counts, and they are
2299   // counted from one.
2300   bool HasImplicitThisParam = isInstanceMethod(D);
2301   unsigned NumArgs  = getFunctionOrMethodNumArgs(D) + HasImplicitThisParam;
2302   unsigned FirstIdx = 1;
2303 
2304   StringRef Format = Attr.getParameterName()->getName();
2305 
2306   // Normalize the argument, __foo__ becomes foo.
2307   if (Format.startswith("__") && Format.endswith("__"))
2308     Format = Format.substr(2, Format.size() - 4);
2309 
2310   // Check for supported formats.
2311   FormatAttrKind Kind = getFormatAttrKind(Format);
2312 
2313   if (Kind == IgnoredFormat)
2314     return;
2315 
2316   if (Kind == InvalidFormat) {
2317     S.Diag(Attr.getLoc(), diag::warn_attribute_type_not_supported)
2318       << "format" << Attr.getParameterName()->getName();
2319     return;
2320   }
2321 
2322   // checks for the 2nd argument
2323   Expr *IdxExpr = Attr.getArg(0);
2324   llvm::APSInt Idx(32);
2325   if (IdxExpr->isTypeDependent() || IdxExpr->isValueDependent() ||
2326       !IdxExpr->isIntegerConstantExpr(Idx, S.Context)) {
2327     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
2328       << "format" << 2 << IdxExpr->getSourceRange();
2329     return;
2330   }
2331 
2332   if (Idx.getZExtValue() < FirstIdx || Idx.getZExtValue() > NumArgs) {
2333     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
2334       << "format" << 2 << IdxExpr->getSourceRange();
2335     return;
2336   }
2337 
2338   // FIXME: Do we need to bounds check?
2339   unsigned ArgIdx = Idx.getZExtValue() - 1;
2340 
2341   if (HasImplicitThisParam) {
2342     if (ArgIdx == 0) {
2343       S.Diag(Attr.getLoc(),
2344              diag::err_format_attribute_implicit_this_format_string)
2345         << IdxExpr->getSourceRange();
2346       return;
2347     }
2348     ArgIdx--;
2349   }
2350 
2351   // make sure the format string is really a string
2352   QualType Ty = getFunctionOrMethodArgType(D, ArgIdx);
2353 
2354   if (Kind == CFStringFormat) {
2355     if (!isCFStringType(Ty, S.Context)) {
2356       S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
2357         << "a CFString" << IdxExpr->getSourceRange();
2358       return;
2359     }
2360   } else if (Kind == NSStringFormat) {
2361     // FIXME: do we need to check if the type is NSString*?  What are the
2362     // semantics?
2363     if (!isNSStringType(Ty, S.Context)) {
2364       // FIXME: Should highlight the actual expression that has the wrong type.
2365       S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
2366         << "an NSString" << IdxExpr->getSourceRange();
2367       return;
2368     }
2369   } else if (!Ty->isPointerType() ||
2370              !Ty->getAs<PointerType>()->getPointeeType()->isCharType()) {
2371     // FIXME: Should highlight the actual expression that has the wrong type.
2372     S.Diag(Attr.getLoc(), diag::err_format_attribute_not)
2373       << "a string type" << IdxExpr->getSourceRange();
2374     return;
2375   }
2376 
2377   // check the 3rd argument
2378   Expr *FirstArgExpr = Attr.getArg(1);
2379   llvm::APSInt FirstArg(32);
2380   if (FirstArgExpr->isTypeDependent() || FirstArgExpr->isValueDependent() ||
2381       !FirstArgExpr->isIntegerConstantExpr(FirstArg, S.Context)) {
2382     S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
2383       << "format" << 3 << FirstArgExpr->getSourceRange();
2384     return;
2385   }
2386 
2387   // check if the function is variadic if the 3rd argument non-zero
2388   if (FirstArg != 0) {
2389     if (isFunctionOrMethodVariadic(D)) {
2390       ++NumArgs; // +1 for ...
2391     } else {
2392       S.Diag(D->getLocation(), diag::err_format_attribute_requires_variadic);
2393       return;
2394     }
2395   }
2396 
2397   // strftime requires FirstArg to be 0 because it doesn't read from any
2398   // variable the input is just the current time + the format string.
2399   if (Kind == StrftimeFormat) {
2400     if (FirstArg != 0) {
2401       S.Diag(Attr.getLoc(), diag::err_format_strftime_third_parameter)
2402         << FirstArgExpr->getSourceRange();
2403       return;
2404     }
2405   // if 0 it disables parameter checking (to use with e.g. va_list)
2406   } else if (FirstArg != 0 && FirstArg != NumArgs) {
2407     S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
2408       << "format" << 3 << FirstArgExpr->getSourceRange();
2409     return;
2410   }
2411 
2412   // Check whether we already have an equivalent format attribute.
2413   for (specific_attr_iterator<FormatAttr>
2414          i = D->specific_attr_begin<FormatAttr>(),
2415          e = D->specific_attr_end<FormatAttr>();
2416        i != e ; ++i) {
2417     FormatAttr *f = *i;
2418     if (f->getType() == Format &&
2419         f->getFormatIdx() == (int)Idx.getZExtValue() &&
2420         f->getFirstArg() == (int)FirstArg.getZExtValue()) {
2421       // If we don't have a valid location for this attribute, adopt the
2422       // location.
2423       if (f->getLocation().isInvalid())
2424         f->setRange(Attr.getRange());
2425       return;
2426     }
2427   }
2428 
2429   D->addAttr(::new (S.Context) FormatAttr(Attr.getRange(), S.Context, Format,
2430                                           Idx.getZExtValue(),
2431                                           FirstArg.getZExtValue()));
2432 }
2433 
2434 static void handleTransparentUnionAttr(Sema &S, Decl *D,
2435                                        const AttributeList &Attr) {
2436   // check the attribute arguments.
2437   if (!checkAttributeNumArgs(S, Attr, 0))
2438     return;
2439 
2440 
2441   // Try to find the underlying union declaration.
2442   RecordDecl *RD = 0;
2443   TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D);
2444   if (TD && TD->getUnderlyingType()->isUnionType())
2445     RD = TD->getUnderlyingType()->getAsUnionType()->getDecl();
2446   else
2447     RD = dyn_cast<RecordDecl>(D);
2448 
2449   if (!RD || !RD->isUnion()) {
2450     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2451       << Attr.getName() << ExpectedUnion;
2452     return;
2453   }
2454 
2455   if (!RD->isCompleteDefinition()) {
2456     S.Diag(Attr.getLoc(),
2457         diag::warn_transparent_union_attribute_not_definition);
2458     return;
2459   }
2460 
2461   RecordDecl::field_iterator Field = RD->field_begin(),
2462                           FieldEnd = RD->field_end();
2463   if (Field == FieldEnd) {
2464     S.Diag(Attr.getLoc(), diag::warn_transparent_union_attribute_zero_fields);
2465     return;
2466   }
2467 
2468   FieldDecl *FirstField = *Field;
2469   QualType FirstType = FirstField->getType();
2470   if (FirstType->hasFloatingRepresentation() || FirstType->isVectorType()) {
2471     S.Diag(FirstField->getLocation(),
2472            diag::warn_transparent_union_attribute_floating)
2473       << FirstType->isVectorType() << FirstType;
2474     return;
2475   }
2476 
2477   uint64_t FirstSize = S.Context.getTypeSize(FirstType);
2478   uint64_t FirstAlign = S.Context.getTypeAlign(FirstType);
2479   for (; Field != FieldEnd; ++Field) {
2480     QualType FieldType = Field->getType();
2481     if (S.Context.getTypeSize(FieldType) != FirstSize ||
2482         S.Context.getTypeAlign(FieldType) != FirstAlign) {
2483       // Warn if we drop the attribute.
2484       bool isSize = S.Context.getTypeSize(FieldType) != FirstSize;
2485       unsigned FieldBits = isSize? S.Context.getTypeSize(FieldType)
2486                                  : S.Context.getTypeAlign(FieldType);
2487       S.Diag(Field->getLocation(),
2488           diag::warn_transparent_union_attribute_field_size_align)
2489         << isSize << Field->getDeclName() << FieldBits;
2490       unsigned FirstBits = isSize? FirstSize : FirstAlign;
2491       S.Diag(FirstField->getLocation(),
2492              diag::note_transparent_union_first_field_size_align)
2493         << isSize << FirstBits;
2494       return;
2495     }
2496   }
2497 
2498   RD->addAttr(::new (S.Context) TransparentUnionAttr(Attr.getRange(), S.Context));
2499 }
2500 
2501 static void handleAnnotateAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2502   // check the attribute arguments.
2503   if (!checkAttributeNumArgs(S, Attr, 1))
2504     return;
2505 
2506   Expr *ArgExpr = Attr.getArg(0);
2507   StringLiteral *SE = dyn_cast<StringLiteral>(ArgExpr);
2508 
2509   // Make sure that there is a string literal as the annotation's single
2510   // argument.
2511   if (!SE) {
2512     S.Diag(ArgExpr->getLocStart(), diag::err_attribute_not_string) <<"annotate";
2513     return;
2514   }
2515 
2516   // Don't duplicate annotations that are already set.
2517   for (specific_attr_iterator<AnnotateAttr>
2518        i = D->specific_attr_begin<AnnotateAttr>(),
2519        e = D->specific_attr_end<AnnotateAttr>(); i != e; ++i) {
2520       if ((*i)->getAnnotation() == SE->getString())
2521           return;
2522   }
2523   D->addAttr(::new (S.Context) AnnotateAttr(Attr.getRange(), S.Context,
2524                                             SE->getString()));
2525 }
2526 
2527 static void handleAlignedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2528   // check the attribute arguments.
2529   if (Attr.getNumArgs() > 1) {
2530     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
2531     return;
2532   }
2533 
2534   //FIXME: The C++0x version of this attribute has more limited applicabilty
2535   //       than GNU's, and should error out when it is used to specify a
2536   //       weaker alignment, rather than being silently ignored.
2537 
2538   if (Attr.getNumArgs() == 0) {
2539     D->addAttr(::new (S.Context) AlignedAttr(Attr.getRange(), S.Context, true, 0));
2540     return;
2541   }
2542 
2543   S.AddAlignedAttr(Attr.getRange(), D, Attr.getArg(0));
2544 }
2545 
2546 void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, Expr *E) {
2547   // FIXME: Handle pack-expansions here.
2548   if (DiagnoseUnexpandedParameterPack(E))
2549     return;
2550 
2551   if (E->isTypeDependent() || E->isValueDependent()) {
2552     // Save dependent expressions in the AST to be instantiated.
2553     D->addAttr(::new (Context) AlignedAttr(AttrRange, Context, true, E));
2554     return;
2555   }
2556 
2557   SourceLocation AttrLoc = AttrRange.getBegin();
2558   // FIXME: Cache the number on the Attr object?
2559   llvm::APSInt Alignment(32);
2560   if (!E->isIntegerConstantExpr(Alignment, Context)) {
2561     Diag(AttrLoc, diag::err_attribute_argument_not_int)
2562       << "aligned" << E->getSourceRange();
2563     return;
2564   }
2565   if (!llvm::isPowerOf2_64(Alignment.getZExtValue())) {
2566     Diag(AttrLoc, diag::err_attribute_aligned_not_power_of_two)
2567       << E->getSourceRange();
2568     return;
2569   }
2570 
2571   D->addAttr(::new (Context) AlignedAttr(AttrRange, Context, true, E));
2572 }
2573 
2574 void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, TypeSourceInfo *TS) {
2575   // FIXME: Cache the number on the Attr object if non-dependent?
2576   // FIXME: Perform checking of type validity
2577   D->addAttr(::new (Context) AlignedAttr(AttrRange, Context, false, TS));
2578   return;
2579 }
2580 
2581 /// handleModeAttr - This attribute modifies the width of a decl with primitive
2582 /// type.
2583 ///
2584 /// Despite what would be logical, the mode attribute is a decl attribute, not a
2585 /// type attribute: 'int ** __attribute((mode(HI))) *G;' tries to make 'G' be
2586 /// HImode, not an intermediate pointer.
2587 static void handleModeAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2588   // This attribute isn't documented, but glibc uses it.  It changes
2589   // the width of an int or unsigned int to the specified size.
2590 
2591   // Check that there aren't any arguments
2592   if (!checkAttributeNumArgs(S, Attr, 0))
2593     return;
2594 
2595 
2596   IdentifierInfo *Name = Attr.getParameterName();
2597   if (!Name) {
2598     S.Diag(Attr.getLoc(), diag::err_attribute_missing_parameter_name);
2599     return;
2600   }
2601 
2602   StringRef Str = Attr.getParameterName()->getName();
2603 
2604   // Normalize the attribute name, __foo__ becomes foo.
2605   if (Str.startswith("__") && Str.endswith("__"))
2606     Str = Str.substr(2, Str.size() - 4);
2607 
2608   unsigned DestWidth = 0;
2609   bool IntegerMode = true;
2610   bool ComplexMode = false;
2611   switch (Str.size()) {
2612   case 2:
2613     switch (Str[0]) {
2614     case 'Q': DestWidth = 8; break;
2615     case 'H': DestWidth = 16; break;
2616     case 'S': DestWidth = 32; break;
2617     case 'D': DestWidth = 64; break;
2618     case 'X': DestWidth = 96; break;
2619     case 'T': DestWidth = 128; break;
2620     }
2621     if (Str[1] == 'F') {
2622       IntegerMode = false;
2623     } else if (Str[1] == 'C') {
2624       IntegerMode = false;
2625       ComplexMode = true;
2626     } else if (Str[1] != 'I') {
2627       DestWidth = 0;
2628     }
2629     break;
2630   case 4:
2631     // FIXME: glibc uses 'word' to define register_t; this is narrower than a
2632     // pointer on PIC16 and other embedded platforms.
2633     if (Str == "word")
2634       DestWidth = S.Context.getTargetInfo().getPointerWidth(0);
2635     else if (Str == "byte")
2636       DestWidth = S.Context.getTargetInfo().getCharWidth();
2637     break;
2638   case 7:
2639     if (Str == "pointer")
2640       DestWidth = S.Context.getTargetInfo().getPointerWidth(0);
2641     break;
2642   }
2643 
2644   QualType OldTy;
2645   if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D))
2646     OldTy = TD->getUnderlyingType();
2647   else if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
2648     OldTy = VD->getType();
2649   else {
2650     S.Diag(D->getLocation(), diag::err_attr_wrong_decl)
2651       << "mode" << Attr.getRange();
2652     return;
2653   }
2654 
2655   if (!OldTy->getAs<BuiltinType>() && !OldTy->isComplexType())
2656     S.Diag(Attr.getLoc(), diag::err_mode_not_primitive);
2657   else if (IntegerMode) {
2658     if (!OldTy->isIntegralOrEnumerationType())
2659       S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
2660   } else if (ComplexMode) {
2661     if (!OldTy->isComplexType())
2662       S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
2663   } else {
2664     if (!OldTy->isFloatingType())
2665       S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
2666   }
2667 
2668   // FIXME: Sync this with InitializePredefinedMacros; we need to match int8_t
2669   // and friends, at least with glibc.
2670   // FIXME: Make sure 32/64-bit integers don't get defined to types of the wrong
2671   // width on unusual platforms.
2672   // FIXME: Make sure floating-point mappings are accurate
2673   // FIXME: Support XF and TF types
2674   QualType NewTy;
2675   switch (DestWidth) {
2676   case 0:
2677     S.Diag(Attr.getLoc(), diag::err_unknown_machine_mode) << Name;
2678     return;
2679   default:
2680     S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
2681     return;
2682   case 8:
2683     if (!IntegerMode) {
2684       S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
2685       return;
2686     }
2687     if (OldTy->isSignedIntegerType())
2688       NewTy = S.Context.SignedCharTy;
2689     else
2690       NewTy = S.Context.UnsignedCharTy;
2691     break;
2692   case 16:
2693     if (!IntegerMode) {
2694       S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
2695       return;
2696     }
2697     if (OldTy->isSignedIntegerType())
2698       NewTy = S.Context.ShortTy;
2699     else
2700       NewTy = S.Context.UnsignedShortTy;
2701     break;
2702   case 32:
2703     if (!IntegerMode)
2704       NewTy = S.Context.FloatTy;
2705     else if (OldTy->isSignedIntegerType())
2706       NewTy = S.Context.IntTy;
2707     else
2708       NewTy = S.Context.UnsignedIntTy;
2709     break;
2710   case 64:
2711     if (!IntegerMode)
2712       NewTy = S.Context.DoubleTy;
2713     else if (OldTy->isSignedIntegerType())
2714       if (S.Context.getTargetInfo().getLongWidth() == 64)
2715         NewTy = S.Context.LongTy;
2716       else
2717         NewTy = S.Context.LongLongTy;
2718     else
2719       if (S.Context.getTargetInfo().getLongWidth() == 64)
2720         NewTy = S.Context.UnsignedLongTy;
2721       else
2722         NewTy = S.Context.UnsignedLongLongTy;
2723     break;
2724   case 96:
2725     NewTy = S.Context.LongDoubleTy;
2726     break;
2727   case 128:
2728     if (!IntegerMode) {
2729       S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
2730       return;
2731     }
2732     if (OldTy->isSignedIntegerType())
2733       NewTy = S.Context.Int128Ty;
2734     else
2735       NewTy = S.Context.UnsignedInt128Ty;
2736     break;
2737   }
2738 
2739   if (ComplexMode) {
2740     NewTy = S.Context.getComplexType(NewTy);
2741   }
2742 
2743   // Install the new type.
2744   if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D)) {
2745     // FIXME: preserve existing source info.
2746     TD->setTypeSourceInfo(S.Context.getTrivialTypeSourceInfo(NewTy));
2747   } else
2748     cast<ValueDecl>(D)->setType(NewTy);
2749 }
2750 
2751 static void handleNoDebugAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2752   // check the attribute arguments.
2753   if (!checkAttributeNumArgs(S, Attr, 0))
2754     return;
2755 
2756   if (!isFunctionOrMethod(D)) {
2757     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2758       << Attr.getName() << ExpectedFunction;
2759     return;
2760   }
2761 
2762   D->addAttr(::new (S.Context) NoDebugAttr(Attr.getRange(), S.Context));
2763 }
2764 
2765 static void handleNoInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2766   // check the attribute arguments.
2767   if (!checkAttributeNumArgs(S, Attr, 0))
2768     return;
2769 
2770 
2771   if (!isa<FunctionDecl>(D)) {
2772     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2773       << Attr.getName() << ExpectedFunction;
2774     return;
2775   }
2776 
2777   D->addAttr(::new (S.Context) NoInlineAttr(Attr.getRange(), S.Context));
2778 }
2779 
2780 static void handleNoInstrumentFunctionAttr(Sema &S, Decl *D,
2781                                            const AttributeList &Attr) {
2782   // check the attribute arguments.
2783   if (!checkAttributeNumArgs(S, Attr, 0))
2784     return;
2785 
2786 
2787   if (!isa<FunctionDecl>(D)) {
2788     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2789       << Attr.getName() << ExpectedFunction;
2790     return;
2791   }
2792 
2793   D->addAttr(::new (S.Context) NoInstrumentFunctionAttr(Attr.getRange(),
2794                                                         S.Context));
2795 }
2796 
2797 static void handleConstantAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2798   if (S.LangOpts.CUDA) {
2799     // check the attribute arguments.
2800     if (Attr.hasParameterOrArguments()) {
2801       S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
2802       return;
2803     }
2804 
2805     if (!isa<VarDecl>(D)) {
2806       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2807         << Attr.getName() << ExpectedVariable;
2808       return;
2809     }
2810 
2811     D->addAttr(::new (S.Context) CUDAConstantAttr(Attr.getRange(), S.Context));
2812   } else {
2813     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "constant";
2814   }
2815 }
2816 
2817 static void handleDeviceAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2818   if (S.LangOpts.CUDA) {
2819     // check the attribute arguments.
2820     if (Attr.getNumArgs() != 0) {
2821       S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
2822       return;
2823     }
2824 
2825     if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D)) {
2826       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2827         << Attr.getName() << ExpectedVariableOrFunction;
2828       return;
2829     }
2830 
2831     D->addAttr(::new (S.Context) CUDADeviceAttr(Attr.getRange(), S.Context));
2832   } else {
2833     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "device";
2834   }
2835 }
2836 
2837 static void handleGlobalAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2838   if (S.LangOpts.CUDA) {
2839     // check the attribute arguments.
2840     if (!checkAttributeNumArgs(S, Attr, 0))
2841       return;
2842 
2843     if (!isa<FunctionDecl>(D)) {
2844       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2845         << Attr.getName() << ExpectedFunction;
2846       return;
2847     }
2848 
2849     FunctionDecl *FD = cast<FunctionDecl>(D);
2850     if (!FD->getResultType()->isVoidType()) {
2851       TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc().IgnoreParens();
2852       if (FunctionTypeLoc* FTL = dyn_cast<FunctionTypeLoc>(&TL)) {
2853         S.Diag(FD->getTypeSpecStartLoc(), diag::err_kern_type_not_void_return)
2854           << FD->getType()
2855           << FixItHint::CreateReplacement(FTL->getResultLoc().getSourceRange(),
2856                                           "void");
2857       } else {
2858         S.Diag(FD->getTypeSpecStartLoc(), diag::err_kern_type_not_void_return)
2859           << FD->getType();
2860       }
2861       return;
2862     }
2863 
2864     D->addAttr(::new (S.Context) CUDAGlobalAttr(Attr.getRange(), S.Context));
2865   } else {
2866     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "global";
2867   }
2868 }
2869 
2870 static void handleHostAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2871   if (S.LangOpts.CUDA) {
2872     // check the attribute arguments.
2873     if (!checkAttributeNumArgs(S, Attr, 0))
2874       return;
2875 
2876 
2877     if (!isa<FunctionDecl>(D)) {
2878       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2879         << Attr.getName() << ExpectedFunction;
2880       return;
2881     }
2882 
2883     D->addAttr(::new (S.Context) CUDAHostAttr(Attr.getRange(), S.Context));
2884   } else {
2885     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "host";
2886   }
2887 }
2888 
2889 static void handleSharedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2890   if (S.LangOpts.CUDA) {
2891     // check the attribute arguments.
2892     if (!checkAttributeNumArgs(S, Attr, 0))
2893       return;
2894 
2895 
2896     if (!isa<VarDecl>(D)) {
2897       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2898         << Attr.getName() << ExpectedVariable;
2899       return;
2900     }
2901 
2902     D->addAttr(::new (S.Context) CUDASharedAttr(Attr.getRange(), S.Context));
2903   } else {
2904     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "shared";
2905   }
2906 }
2907 
2908 static void handleGNUInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2909   // check the attribute arguments.
2910   if (!checkAttributeNumArgs(S, Attr, 0))
2911     return;
2912 
2913   FunctionDecl *Fn = dyn_cast<FunctionDecl>(D);
2914   if (Fn == 0) {
2915     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2916       << Attr.getName() << ExpectedFunction;
2917     return;
2918   }
2919 
2920   if (!Fn->isInlineSpecified()) {
2921     S.Diag(Attr.getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
2922     return;
2923   }
2924 
2925   D->addAttr(::new (S.Context) GNUInlineAttr(Attr.getRange(), S.Context));
2926 }
2927 
2928 static void handleCallConvAttr(Sema &S, Decl *D, const AttributeList &Attr) {
2929   if (hasDeclarator(D)) return;
2930 
2931   // Diagnostic is emitted elsewhere: here we store the (valid) Attr
2932   // in the Decl node for syntactic reasoning, e.g., pretty-printing.
2933   CallingConv CC;
2934   if (S.CheckCallingConvAttr(Attr, CC))
2935     return;
2936 
2937   if (!isa<ObjCMethodDecl>(D)) {
2938     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
2939       << Attr.getName() << ExpectedFunctionOrMethod;
2940     return;
2941   }
2942 
2943   switch (Attr.getKind()) {
2944   case AttributeList::AT_fastcall:
2945     D->addAttr(::new (S.Context) FastCallAttr(Attr.getRange(), S.Context));
2946     return;
2947   case AttributeList::AT_stdcall:
2948     D->addAttr(::new (S.Context) StdCallAttr(Attr.getRange(), S.Context));
2949     return;
2950   case AttributeList::AT_thiscall:
2951     D->addAttr(::new (S.Context) ThisCallAttr(Attr.getRange(), S.Context));
2952     return;
2953   case AttributeList::AT_cdecl:
2954     D->addAttr(::new (S.Context) CDeclAttr(Attr.getRange(), S.Context));
2955     return;
2956   case AttributeList::AT_pascal:
2957     D->addAttr(::new (S.Context) PascalAttr(Attr.getRange(), S.Context));
2958     return;
2959   case AttributeList::AT_pcs: {
2960     Expr *Arg = Attr.getArg(0);
2961     StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
2962     if (!Str || !Str->isAscii()) {
2963       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
2964         << "pcs" << 1;
2965       Attr.setInvalid();
2966       return;
2967     }
2968 
2969     StringRef StrRef = Str->getString();
2970     PcsAttr::PCSType PCS;
2971     if (StrRef == "aapcs")
2972       PCS = PcsAttr::AAPCS;
2973     else if (StrRef == "aapcs-vfp")
2974       PCS = PcsAttr::AAPCS_VFP;
2975     else {
2976       S.Diag(Attr.getLoc(), diag::err_invalid_pcs);
2977       Attr.setInvalid();
2978       return;
2979     }
2980 
2981     D->addAttr(::new (S.Context) PcsAttr(Attr.getRange(), S.Context, PCS));
2982   }
2983   default:
2984     llvm_unreachable("unexpected attribute kind");
2985     return;
2986   }
2987 }
2988 
2989 static void handleOpenCLKernelAttr(Sema &S, Decl *D, const AttributeList &Attr){
2990   assert(!Attr.isInvalid());
2991   D->addAttr(::new (S.Context) OpenCLKernelAttr(Attr.getRange(), S.Context));
2992 }
2993 
2994 bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC) {
2995   if (attr.isInvalid())
2996     return true;
2997 
2998   if ((attr.getNumArgs() != 0 &&
2999       !(attr.getKind() == AttributeList::AT_pcs && attr.getNumArgs() == 1)) ||
3000       attr.getParameterName()) {
3001     Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
3002     attr.setInvalid();
3003     return true;
3004   }
3005 
3006   // TODO: diagnose uses of these conventions on the wrong target. Or, better
3007   // move to TargetAttributesSema one day.
3008   switch (attr.getKind()) {
3009   case AttributeList::AT_cdecl: CC = CC_C; break;
3010   case AttributeList::AT_fastcall: CC = CC_X86FastCall; break;
3011   case AttributeList::AT_stdcall: CC = CC_X86StdCall; break;
3012   case AttributeList::AT_thiscall: CC = CC_X86ThisCall; break;
3013   case AttributeList::AT_pascal: CC = CC_X86Pascal; break;
3014   case AttributeList::AT_pcs: {
3015     Expr *Arg = attr.getArg(0);
3016     StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
3017     if (!Str || !Str->isAscii()) {
3018       Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string)
3019         << "pcs" << 1;
3020       attr.setInvalid();
3021       return true;
3022     }
3023 
3024     StringRef StrRef = Str->getString();
3025     if (StrRef == "aapcs") {
3026       CC = CC_AAPCS;
3027       break;
3028     } else if (StrRef == "aapcs-vfp") {
3029       CC = CC_AAPCS_VFP;
3030       break;
3031     }
3032     // FALLS THROUGH
3033   }
3034   default: llvm_unreachable("unexpected attribute kind"); return true;
3035   }
3036 
3037   return false;
3038 }
3039 
3040 static void handleRegparmAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3041   if (hasDeclarator(D)) return;
3042 
3043   unsigned numParams;
3044   if (S.CheckRegparmAttr(Attr, numParams))
3045     return;
3046 
3047   if (!isa<ObjCMethodDecl>(D)) {
3048     S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3049       << Attr.getName() << ExpectedFunctionOrMethod;
3050     return;
3051   }
3052 
3053   D->addAttr(::new (S.Context) RegparmAttr(Attr.getRange(), S.Context, numParams));
3054 }
3055 
3056 /// Checks a regparm attribute, returning true if it is ill-formed and
3057 /// otherwise setting numParams to the appropriate value.
3058 bool Sema::CheckRegparmAttr(const AttributeList &Attr, unsigned &numParams) {
3059   if (Attr.isInvalid())
3060     return true;
3061 
3062   if (Attr.getNumArgs() != 1) {
3063     Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
3064     Attr.setInvalid();
3065     return true;
3066   }
3067 
3068   Expr *NumParamsExpr = Attr.getArg(0);
3069   llvm::APSInt NumParams(32);
3070   if (NumParamsExpr->isTypeDependent() || NumParamsExpr->isValueDependent() ||
3071       !NumParamsExpr->isIntegerConstantExpr(NumParams, Context)) {
3072     Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
3073       << "regparm" << NumParamsExpr->getSourceRange();
3074     Attr.setInvalid();
3075     return true;
3076   }
3077 
3078   if (Context.getTargetInfo().getRegParmMax() == 0) {
3079     Diag(Attr.getLoc(), diag::err_attribute_regparm_wrong_platform)
3080       << NumParamsExpr->getSourceRange();
3081     Attr.setInvalid();
3082     return true;
3083   }
3084 
3085   numParams = NumParams.getZExtValue();
3086   if (numParams > Context.getTargetInfo().getRegParmMax()) {
3087     Diag(Attr.getLoc(), diag::err_attribute_regparm_invalid_number)
3088       << Context.getTargetInfo().getRegParmMax() << NumParamsExpr->getSourceRange();
3089     Attr.setInvalid();
3090     return true;
3091   }
3092 
3093   return false;
3094 }
3095 
3096 static void handleLaunchBoundsAttr(Sema &S, Decl *D, const AttributeList &Attr){
3097   if (S.LangOpts.CUDA) {
3098     // check the attribute arguments.
3099     if (Attr.getNumArgs() != 1 && Attr.getNumArgs() != 2) {
3100       // FIXME: 0 is not okay.
3101       S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 2;
3102       return;
3103     }
3104 
3105     if (!isFunctionOrMethod(D)) {
3106       S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3107         << Attr.getName() << ExpectedFunctionOrMethod;
3108       return;
3109     }
3110 
3111     Expr *MaxThreadsExpr = Attr.getArg(0);
3112     llvm::APSInt MaxThreads(32);
3113     if (MaxThreadsExpr->isTypeDependent() ||
3114         MaxThreadsExpr->isValueDependent() ||
3115         !MaxThreadsExpr->isIntegerConstantExpr(MaxThreads, S.Context)) {
3116       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
3117         << "launch_bounds" << 1 << MaxThreadsExpr->getSourceRange();
3118       return;
3119     }
3120 
3121     llvm::APSInt MinBlocks(32);
3122     if (Attr.getNumArgs() > 1) {
3123       Expr *MinBlocksExpr = Attr.getArg(1);
3124       if (MinBlocksExpr->isTypeDependent() ||
3125           MinBlocksExpr->isValueDependent() ||
3126           !MinBlocksExpr->isIntegerConstantExpr(MinBlocks, S.Context)) {
3127         S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
3128           << "launch_bounds" << 2 << MinBlocksExpr->getSourceRange();
3129         return;
3130       }
3131     }
3132 
3133     D->addAttr(::new (S.Context) CUDALaunchBoundsAttr(Attr.getRange(), S.Context,
3134                                                       MaxThreads.getZExtValue(),
3135                                                      MinBlocks.getZExtValue()));
3136   } else {
3137     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "launch_bounds";
3138   }
3139 }
3140 
3141 //===----------------------------------------------------------------------===//
3142 // Checker-specific attribute handlers.
3143 //===----------------------------------------------------------------------===//
3144 
3145 static bool isValidSubjectOfNSAttribute(Sema &S, QualType type) {
3146   return type->isDependentType() ||
3147          type->isObjCObjectPointerType() ||
3148          S.Context.isObjCNSObjectType(type);
3149 }
3150 static bool isValidSubjectOfCFAttribute(Sema &S, QualType type) {
3151   return type->isDependentType() ||
3152          type->isPointerType() ||
3153          isValidSubjectOfNSAttribute(S, type);
3154 }
3155 
3156 static void handleNSConsumedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3157   ParmVarDecl *param = dyn_cast<ParmVarDecl>(D);
3158   if (!param) {
3159     S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
3160       << Attr.getRange() << Attr.getName() << ExpectedParameter;
3161     return;
3162   }
3163 
3164   bool typeOK, cf;
3165   if (Attr.getKind() == AttributeList::AT_ns_consumed) {
3166     typeOK = isValidSubjectOfNSAttribute(S, param->getType());
3167     cf = false;
3168   } else {
3169     typeOK = isValidSubjectOfCFAttribute(S, param->getType());
3170     cf = true;
3171   }
3172 
3173   if (!typeOK) {
3174     S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_parameter_type)
3175       << Attr.getRange() << Attr.getName() << cf;
3176     return;
3177   }
3178 
3179   if (cf)
3180     param->addAttr(::new (S.Context) CFConsumedAttr(Attr.getRange(), S.Context));
3181   else
3182     param->addAttr(::new (S.Context) NSConsumedAttr(Attr.getRange(), S.Context));
3183 }
3184 
3185 static void handleNSConsumesSelfAttr(Sema &S, Decl *D,
3186                                      const AttributeList &Attr) {
3187   if (!isa<ObjCMethodDecl>(D)) {
3188     S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
3189       << Attr.getRange() << Attr.getName() << ExpectedMethod;
3190     return;
3191   }
3192 
3193   D->addAttr(::new (S.Context) NSConsumesSelfAttr(Attr.getRange(), S.Context));
3194 }
3195 
3196 static void handleNSReturnsRetainedAttr(Sema &S, Decl *D,
3197                                         const AttributeList &Attr) {
3198 
3199   QualType returnType;
3200 
3201   if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
3202     returnType = MD->getResultType();
3203   else if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
3204     returnType = PD->getType();
3205   else if (S.getLangOptions().ObjCAutoRefCount && hasDeclarator(D) &&
3206            (Attr.getKind() == AttributeList::AT_ns_returns_retained))
3207     return; // ignore: was handled as a type attribute
3208   else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
3209     returnType = FD->getResultType();
3210   else {
3211     S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
3212         << Attr.getRange() << Attr.getName()
3213         << ExpectedFunctionOrMethod;
3214     return;
3215   }
3216 
3217   bool typeOK;
3218   bool cf;
3219   switch (Attr.getKind()) {
3220   default: llvm_unreachable("invalid ownership attribute"); return;
3221   case AttributeList::AT_ns_returns_autoreleased:
3222   case AttributeList::AT_ns_returns_retained:
3223   case AttributeList::AT_ns_returns_not_retained:
3224     typeOK = isValidSubjectOfNSAttribute(S, returnType);
3225     cf = false;
3226     break;
3227 
3228   case AttributeList::AT_cf_returns_retained:
3229   case AttributeList::AT_cf_returns_not_retained:
3230     typeOK = isValidSubjectOfCFAttribute(S, returnType);
3231     cf = true;
3232     break;
3233   }
3234 
3235   if (!typeOK) {
3236     S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
3237       << Attr.getRange() << Attr.getName() << isa<ObjCMethodDecl>(D) << cf;
3238     return;
3239   }
3240 
3241   switch (Attr.getKind()) {
3242     default:
3243       llvm_unreachable("invalid ownership attribute");
3244     case AttributeList::AT_ns_returns_autoreleased:
3245       D->addAttr(::new (S.Context) NSReturnsAutoreleasedAttr(Attr.getRange(),
3246                                                              S.Context));
3247       return;
3248     case AttributeList::AT_cf_returns_not_retained:
3249       D->addAttr(::new (S.Context) CFReturnsNotRetainedAttr(Attr.getRange(),
3250                                                             S.Context));
3251       return;
3252     case AttributeList::AT_ns_returns_not_retained:
3253       D->addAttr(::new (S.Context) NSReturnsNotRetainedAttr(Attr.getRange(),
3254                                                             S.Context));
3255       return;
3256     case AttributeList::AT_cf_returns_retained:
3257       D->addAttr(::new (S.Context) CFReturnsRetainedAttr(Attr.getRange(),
3258                                                          S.Context));
3259       return;
3260     case AttributeList::AT_ns_returns_retained:
3261       D->addAttr(::new (S.Context) NSReturnsRetainedAttr(Attr.getRange(),
3262                                                          S.Context));
3263       return;
3264   };
3265 }
3266 
3267 static void handleObjCReturnsInnerPointerAttr(Sema &S, Decl *D,
3268                                               const AttributeList &attr) {
3269   SourceLocation loc = attr.getLoc();
3270 
3271   ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(D);
3272 
3273   if (!isa<ObjCMethodDecl>(method)) {
3274     S.Diag(method->getLocStart(), diag::err_attribute_wrong_decl_type)
3275       << SourceRange(loc, loc) << attr.getName() << 13 /* methods */;
3276     return;
3277   }
3278 
3279   // Check that the method returns a normal pointer.
3280   QualType resultType = method->getResultType();
3281 
3282   if (!resultType->isReferenceType() &&
3283       (!resultType->isPointerType() || resultType->isObjCRetainableType())) {
3284     S.Diag(method->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
3285       << SourceRange(loc)
3286       << attr.getName() << /*method*/ 1 << /*non-retainable pointer*/ 2;
3287 
3288     // Drop the attribute.
3289     return;
3290   }
3291 
3292   method->addAttr(
3293     ::new (S.Context) ObjCReturnsInnerPointerAttr(attr.getRange(), S.Context));
3294 }
3295 
3296 /// Handle cf_audited_transfer and cf_unknown_transfer.
3297 static void handleCFTransferAttr(Sema &S, Decl *D, const AttributeList &A) {
3298   if (!isa<FunctionDecl>(D)) {
3299     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
3300       << A.getRange() << A.getName() << 0 /*function*/;
3301     return;
3302   }
3303 
3304   bool IsAudited = (A.getKind() == AttributeList::AT_cf_audited_transfer);
3305 
3306   // Check whether there's a conflicting attribute already present.
3307   Attr *Existing;
3308   if (IsAudited) {
3309     Existing = D->getAttr<CFUnknownTransferAttr>();
3310   } else {
3311     Existing = D->getAttr<CFAuditedTransferAttr>();
3312   }
3313   if (Existing) {
3314     S.Diag(D->getLocStart(), diag::err_attributes_are_not_compatible)
3315       << A.getName()
3316       << (IsAudited ? "cf_unknown_transfer" : "cf_audited_transfer")
3317       << A.getRange() << Existing->getRange();
3318     return;
3319   }
3320 
3321   // All clear;  add the attribute.
3322   if (IsAudited) {
3323     D->addAttr(
3324       ::new (S.Context) CFAuditedTransferAttr(A.getRange(), S.Context));
3325   } else {
3326     D->addAttr(
3327       ::new (S.Context) CFUnknownTransferAttr(A.getRange(), S.Context));
3328   }
3329 }
3330 
3331 static void handleNSBridgedAttr(Sema &S, Scope *Sc, Decl *D,
3332                                 const AttributeList &Attr) {
3333   RecordDecl *RD = dyn_cast<RecordDecl>(D);
3334   if (!RD || RD->isUnion()) {
3335     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
3336       << Attr.getRange() << Attr.getName() << 14 /*struct */;
3337   }
3338 
3339   IdentifierInfo *ParmName = Attr.getParameterName();
3340 
3341   // In Objective-C, verify that the type names an Objective-C type.
3342   // We don't want to check this outside of ObjC because people sometimes
3343   // do crazy C declarations of Objective-C types.
3344   if (ParmName && S.getLangOptions().ObjC1) {
3345     // Check for an existing type with this name.
3346     LookupResult R(S, DeclarationName(ParmName), Attr.getParameterLoc(),
3347                    Sema::LookupOrdinaryName);
3348     if (S.LookupName(R, Sc)) {
3349       NamedDecl *Target = R.getFoundDecl();
3350       if (Target && !isa<ObjCInterfaceDecl>(Target)) {
3351         S.Diag(D->getLocStart(), diag::err_ns_bridged_not_interface);
3352         S.Diag(Target->getLocStart(), diag::note_declared_at);
3353       }
3354     }
3355   }
3356 
3357   D->addAttr(::new (S.Context) NSBridgedAttr(Attr.getRange(), S.Context,
3358                                              ParmName));
3359 }
3360 
3361 static void handleObjCOwnershipAttr(Sema &S, Decl *D,
3362                                     const AttributeList &Attr) {
3363   if (hasDeclarator(D)) return;
3364 
3365   S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
3366     << Attr.getRange() << Attr.getName() << 12 /* variable */;
3367 }
3368 
3369 static void handleObjCPreciseLifetimeAttr(Sema &S, Decl *D,
3370                                           const AttributeList &Attr) {
3371   if (!isa<VarDecl>(D) && !isa<FieldDecl>(D)) {
3372     S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
3373       << Attr.getRange() << Attr.getName() << 12 /* variable */;
3374     return;
3375   }
3376 
3377   ValueDecl *vd = cast<ValueDecl>(D);
3378   QualType type = vd->getType();
3379 
3380   if (!type->isDependentType() &&
3381       !type->isObjCLifetimeType()) {
3382     S.Diag(Attr.getLoc(), diag::err_objc_precise_lifetime_bad_type)
3383       << type;
3384     return;
3385   }
3386 
3387   Qualifiers::ObjCLifetime lifetime = type.getObjCLifetime();
3388 
3389   // If we have no lifetime yet, check the lifetime we're presumably
3390   // going to infer.
3391   if (lifetime == Qualifiers::OCL_None && !type->isDependentType())
3392     lifetime = type->getObjCARCImplicitLifetime();
3393 
3394   switch (lifetime) {
3395   case Qualifiers::OCL_None:
3396     assert(type->isDependentType() &&
3397            "didn't infer lifetime for non-dependent type?");
3398     break;
3399 
3400   case Qualifiers::OCL_Weak:   // meaningful
3401   case Qualifiers::OCL_Strong: // meaningful
3402     break;
3403 
3404   case Qualifiers::OCL_ExplicitNone:
3405   case Qualifiers::OCL_Autoreleasing:
3406     S.Diag(Attr.getLoc(), diag::warn_objc_precise_lifetime_meaningless)
3407       << (lifetime == Qualifiers::OCL_Autoreleasing);
3408     break;
3409   }
3410 
3411   D->addAttr(::new (S.Context)
3412                  ObjCPreciseLifetimeAttr(Attr.getRange(), S.Context));
3413 }
3414 
3415 static bool isKnownDeclSpecAttr(const AttributeList &Attr) {
3416   return Attr.getKind() == AttributeList::AT_dllimport ||
3417          Attr.getKind() == AttributeList::AT_dllexport ||
3418          Attr.getKind() == AttributeList::AT_uuid;
3419 }
3420 
3421 //===----------------------------------------------------------------------===//
3422 // Microsoft specific attribute handlers.
3423 //===----------------------------------------------------------------------===//
3424 
3425 static void handleUuidAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3426   if (S.LangOpts.MicrosoftExt || S.LangOpts.Borland) {
3427     // check the attribute arguments.
3428     if (!checkAttributeNumArgs(S, Attr, 1))
3429       return;
3430 
3431     Expr *Arg = Attr.getArg(0);
3432     StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
3433     if (!Str || !Str->isAscii()) {
3434       S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
3435         << "uuid" << 1;
3436       return;
3437     }
3438 
3439     StringRef StrRef = Str->getString();
3440 
3441     bool IsCurly = StrRef.size() > 1 && StrRef.front() == '{' &&
3442                    StrRef.back() == '}';
3443 
3444     // Validate GUID length.
3445     if (IsCurly && StrRef.size() != 38) {
3446       S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
3447       return;
3448     }
3449     if (!IsCurly && StrRef.size() != 36) {
3450       S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
3451       return;
3452     }
3453 
3454     // GUID format is "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" or
3455     // "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
3456     StringRef::iterator I = StrRef.begin();
3457     if (IsCurly) // Skip the optional '{'
3458        ++I;
3459 
3460     for (int i = 0; i < 36; ++i) {
3461       if (i == 8 || i == 13 || i == 18 || i == 23) {
3462         if (*I != '-') {
3463           S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
3464           return;
3465         }
3466       } else if (!isxdigit(*I)) {
3467         S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
3468         return;
3469       }
3470       I++;
3471     }
3472 
3473     D->addAttr(::new (S.Context) UuidAttr(Attr.getRange(), S.Context,
3474                                           Str->getString()));
3475   } else
3476     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "uuid";
3477 }
3478 
3479 //===----------------------------------------------------------------------===//
3480 // Top Level Sema Entry Points
3481 //===----------------------------------------------------------------------===//
3482 
3483 static void ProcessNonInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
3484                                           const AttributeList &Attr) {
3485   switch (Attr.getKind()) {
3486   case AttributeList::AT_device:      handleDeviceAttr      (S, D, Attr); break;
3487   case AttributeList::AT_host:        handleHostAttr        (S, D, Attr); break;
3488   case AttributeList::AT_overloadable:handleOverloadableAttr(S, D, Attr); break;
3489   default:
3490     break;
3491   }
3492 }
3493 
3494 static void ProcessInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
3495                                        const AttributeList &Attr) {
3496   switch (Attr.getKind()) {
3497   case AttributeList::AT_IBAction:            handleIBAction(S, D, Attr); break;
3498     case AttributeList::AT_IBOutlet:          handleIBOutlet(S, D, Attr); break;
3499   case AttributeList::AT_IBOutletCollection:
3500       handleIBOutletCollection(S, D, Attr); break;
3501   case AttributeList::AT_address_space:
3502   case AttributeList::AT_opencl_image_access:
3503   case AttributeList::AT_objc_gc:
3504   case AttributeList::AT_vector_size:
3505   case AttributeList::AT_neon_vector_type:
3506   case AttributeList::AT_neon_polyvector_type:
3507     // Ignore these, these are type attributes, handled by
3508     // ProcessTypeAttributes.
3509     break;
3510   case AttributeList::AT_device:
3511   case AttributeList::AT_host:
3512   case AttributeList::AT_overloadable:
3513     // Ignore, this is a non-inheritable attribute, handled
3514     // by ProcessNonInheritableDeclAttr.
3515     break;
3516   case AttributeList::AT_alias:       handleAliasAttr       (S, D, Attr); break;
3517   case AttributeList::AT_aligned:     handleAlignedAttr     (S, D, Attr); break;
3518   case AttributeList::AT_always_inline:
3519     handleAlwaysInlineAttr  (S, D, Attr); break;
3520   case AttributeList::AT_analyzer_noreturn:
3521     handleAnalyzerNoReturnAttr  (S, D, Attr); break;
3522   case AttributeList::AT_annotate:    handleAnnotateAttr    (S, D, Attr); break;
3523   case AttributeList::AT_availability:handleAvailabilityAttr(S, D, Attr); break;
3524   case AttributeList::AT_carries_dependency:
3525                                       handleDependencyAttr  (S, D, Attr); break;
3526   case AttributeList::AT_common:      handleCommonAttr      (S, D, Attr); break;
3527   case AttributeList::AT_constant:    handleConstantAttr    (S, D, Attr); break;
3528   case AttributeList::AT_constructor: handleConstructorAttr (S, D, Attr); break;
3529   case AttributeList::AT_deprecated:  handleDeprecatedAttr  (S, D, Attr); break;
3530   case AttributeList::AT_destructor:  handleDestructorAttr  (S, D, Attr); break;
3531   case AttributeList::AT_ext_vector_type:
3532     handleExtVectorTypeAttr(S, scope, D, Attr);
3533     break;
3534   case AttributeList::AT_format:      handleFormatAttr      (S, D, Attr); break;
3535   case AttributeList::AT_format_arg:  handleFormatArgAttr   (S, D, Attr); break;
3536   case AttributeList::AT_global:      handleGlobalAttr      (S, D, Attr); break;
3537   case AttributeList::AT_gnu_inline:  handleGNUInlineAttr   (S, D, Attr); break;
3538   case AttributeList::AT_launch_bounds:
3539     handleLaunchBoundsAttr(S, D, Attr);
3540     break;
3541   case AttributeList::AT_mode:        handleModeAttr        (S, D, Attr); break;
3542   case AttributeList::AT_malloc:      handleMallocAttr      (S, D, Attr); break;
3543   case AttributeList::AT_may_alias:   handleMayAliasAttr    (S, D, Attr); break;
3544   case AttributeList::AT_nocommon:    handleNoCommonAttr    (S, D, Attr); break;
3545   case AttributeList::AT_nonnull:     handleNonNullAttr     (S, D, Attr); break;
3546   case AttributeList::AT_ownership_returns:
3547   case AttributeList::AT_ownership_takes:
3548   case AttributeList::AT_ownership_holds:
3549       handleOwnershipAttr     (S, D, Attr); break;
3550   case AttributeList::AT_naked:       handleNakedAttr       (S, D, Attr); break;
3551   case AttributeList::AT_noreturn:    handleNoReturnAttr    (S, D, Attr); break;
3552   case AttributeList::AT_nothrow:     handleNothrowAttr     (S, D, Attr); break;
3553   case AttributeList::AT_shared:      handleSharedAttr      (S, D, Attr); break;
3554   case AttributeList::AT_vecreturn:   handleVecReturnAttr   (S, D, Attr); break;
3555 
3556   case AttributeList::AT_objc_ownership:
3557     handleObjCOwnershipAttr(S, D, Attr); break;
3558   case AttributeList::AT_objc_precise_lifetime:
3559     handleObjCPreciseLifetimeAttr(S, D, Attr); break;
3560 
3561   case AttributeList::AT_objc_returns_inner_pointer:
3562     handleObjCReturnsInnerPointerAttr(S, D, Attr); break;
3563 
3564   case AttributeList::AT_ns_bridged:
3565     handleNSBridgedAttr(S, scope, D, Attr); break;
3566 
3567   case AttributeList::AT_cf_audited_transfer:
3568   case AttributeList::AT_cf_unknown_transfer:
3569     handleCFTransferAttr(S, D, Attr); break;
3570 
3571   // Checker-specific.
3572   case AttributeList::AT_cf_consumed:
3573   case AttributeList::AT_ns_consumed: handleNSConsumedAttr  (S, D, Attr); break;
3574   case AttributeList::AT_ns_consumes_self:
3575     handleNSConsumesSelfAttr(S, D, Attr); break;
3576 
3577   case AttributeList::AT_ns_returns_autoreleased:
3578   case AttributeList::AT_ns_returns_not_retained:
3579   case AttributeList::AT_cf_returns_not_retained:
3580   case AttributeList::AT_ns_returns_retained:
3581   case AttributeList::AT_cf_returns_retained:
3582     handleNSReturnsRetainedAttr(S, D, Attr); break;
3583 
3584   case AttributeList::AT_reqd_wg_size:
3585     handleReqdWorkGroupSize(S, D, Attr); break;
3586 
3587   case AttributeList::AT_init_priority:
3588       handleInitPriorityAttr(S, D, Attr); break;
3589 
3590   case AttributeList::AT_packed:      handlePackedAttr      (S, D, Attr); break;
3591   case AttributeList::AT_MsStruct:    handleMsStructAttr    (S, D, Attr); break;
3592   case AttributeList::AT_section:     handleSectionAttr     (S, D, Attr); break;
3593   case AttributeList::AT_unavailable: handleUnavailableAttr (S, D, Attr); break;
3594   case AttributeList::AT_arc_weakref_unavailable:
3595     handleArcWeakrefUnavailableAttr (S, D, Attr);
3596     break;
3597   case AttributeList::AT_unused:      handleUnusedAttr      (S, D, Attr); break;
3598   case AttributeList::AT_returns_twice:
3599     handleReturnsTwiceAttr(S, D, Attr);
3600     break;
3601   case AttributeList::AT_used:        handleUsedAttr        (S, D, Attr); break;
3602   case AttributeList::AT_visibility:  handleVisibilityAttr  (S, D, Attr); break;
3603   case AttributeList::AT_warn_unused_result: handleWarnUnusedResult(S, D, Attr);
3604     break;
3605   case AttributeList::AT_weak:        handleWeakAttr        (S, D, Attr); break;
3606   case AttributeList::AT_weakref:     handleWeakRefAttr     (S, D, Attr); break;
3607   case AttributeList::AT_weak_import: handleWeakImportAttr  (S, D, Attr); break;
3608   case AttributeList::AT_transparent_union:
3609     handleTransparentUnionAttr(S, D, Attr);
3610     break;
3611   case AttributeList::AT_objc_exception:
3612     handleObjCExceptionAttr(S, D, Attr);
3613     break;
3614   case AttributeList::AT_objc_method_family:
3615     handleObjCMethodFamilyAttr(S, D, Attr);
3616     break;
3617   case AttributeList::AT_nsobject:    handleObjCNSObject    (S, D, Attr); break;
3618   case AttributeList::AT_blocks:      handleBlocksAttr      (S, D, Attr); break;
3619   case AttributeList::AT_sentinel:    handleSentinelAttr    (S, D, Attr); break;
3620   case AttributeList::AT_const:       handleConstAttr       (S, D, Attr); break;
3621   case AttributeList::AT_pure:        handlePureAttr        (S, D, Attr); break;
3622   case AttributeList::AT_cleanup:     handleCleanupAttr     (S, D, Attr); break;
3623   case AttributeList::AT_nodebug:     handleNoDebugAttr     (S, D, Attr); break;
3624   case AttributeList::AT_noinline:    handleNoInlineAttr    (S, D, Attr); break;
3625   case AttributeList::AT_regparm:     handleRegparmAttr     (S, D, Attr); break;
3626   case AttributeList::IgnoredAttribute:
3627     // Just ignore
3628     break;
3629   case AttributeList::AT_no_instrument_function:  // Interacts with -pg.
3630     handleNoInstrumentFunctionAttr(S, D, Attr);
3631     break;
3632   case AttributeList::AT_stdcall:
3633   case AttributeList::AT_cdecl:
3634   case AttributeList::AT_fastcall:
3635   case AttributeList::AT_thiscall:
3636   case AttributeList::AT_pascal:
3637   case AttributeList::AT_pcs:
3638     handleCallConvAttr(S, D, Attr);
3639     break;
3640   case AttributeList::AT_opencl_kernel_function:
3641     handleOpenCLKernelAttr(S, D, Attr);
3642     break;
3643   case AttributeList::AT_uuid:
3644     handleUuidAttr(S, D, Attr);
3645     break;
3646 
3647   // Thread safety attributes:
3648   case AttributeList::AT_guarded_var:
3649     handleGuardedVarAttr(S, D, Attr);
3650     break;
3651   case AttributeList::AT_pt_guarded_var:
3652     handleGuardedVarAttr(S, D, Attr, /*pointer = */true);
3653     break;
3654   case AttributeList::AT_scoped_lockable:
3655     handleLockableAttr(S, D, Attr, /*scoped = */true);
3656     break;
3657   case AttributeList::AT_no_thread_safety_analysis:
3658     handleNoThreadSafetyAttr(S, D, Attr);
3659     break;
3660   case AttributeList::AT_lockable:
3661     handleLockableAttr(S, D, Attr);
3662     break;
3663   case AttributeList::AT_guarded_by:
3664     handleGuardedByAttr(S, D, Attr);
3665     break;
3666   case AttributeList::AT_pt_guarded_by:
3667     handleGuardedByAttr(S, D, Attr, /*pointer = */true);
3668     break;
3669   case AttributeList::AT_exclusive_lock_function:
3670     handleLockFunAttr(S, D, Attr, /*exclusive = */true);
3671     break;
3672   case AttributeList::AT_exclusive_locks_required:
3673     handleLocksRequiredAttr(S, D, Attr, /*exclusive = */true);
3674     break;
3675   case AttributeList::AT_exclusive_trylock_function:
3676     handleTrylockFunAttr(S, D, Attr, /*exclusive = */true);
3677     break;
3678   case AttributeList::AT_lock_returned:
3679     handleLockReturnedAttr(S, D, Attr);
3680     break;
3681   case AttributeList::AT_locks_excluded:
3682     handleLocksExcludedAttr(S, D, Attr);
3683     break;
3684   case AttributeList::AT_shared_lock_function:
3685     handleLockFunAttr(S, D, Attr);
3686     break;
3687   case AttributeList::AT_shared_locks_required:
3688     handleLocksRequiredAttr(S, D, Attr);
3689     break;
3690   case AttributeList::AT_shared_trylock_function:
3691     handleTrylockFunAttr(S, D, Attr);
3692     break;
3693   case AttributeList::AT_unlock_function:
3694     handleUnlockFunAttr(S, D, Attr);
3695     break;
3696   case AttributeList::AT_acquired_before:
3697     handleAcquireOrderAttr(S, D, Attr, /*before = */true);
3698     break;
3699   case AttributeList::AT_acquired_after:
3700     handleAcquireOrderAttr(S, D, Attr, /*before = */false);
3701     break;
3702 
3703   default:
3704     // Ask target about the attribute.
3705     const TargetAttributesSema &TargetAttrs = S.getTargetAttributesSema();
3706     if (!TargetAttrs.ProcessDeclAttribute(scope, D, Attr, S))
3707       S.Diag(Attr.getLoc(), diag::warn_unknown_attribute_ignored)
3708         << Attr.getName();
3709     break;
3710   }
3711 }
3712 
3713 /// ProcessDeclAttribute - Apply the specific attribute to the specified decl if
3714 /// the attribute applies to decls.  If the attribute is a type attribute, just
3715 /// silently ignore it if a GNU attribute. FIXME: Applying a C++0x attribute to
3716 /// the wrong thing is illegal (C++0x [dcl.attr.grammar]/4).
3717 static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
3718                                  const AttributeList &Attr,
3719                                  bool NonInheritable, bool Inheritable) {
3720   if (Attr.isInvalid())
3721     return;
3722 
3723   if (Attr.isDeclspecAttribute() && !isKnownDeclSpecAttr(Attr))
3724     // FIXME: Try to deal with other __declspec attributes!
3725     return;
3726 
3727   if (NonInheritable)
3728     ProcessNonInheritableDeclAttr(S, scope, D, Attr);
3729 
3730   if (Inheritable)
3731     ProcessInheritableDeclAttr(S, scope, D, Attr);
3732 }
3733 
3734 /// ProcessDeclAttributeList - Apply all the decl attributes in the specified
3735 /// attribute list to the specified decl, ignoring any type attributes.
3736 void Sema::ProcessDeclAttributeList(Scope *S, Decl *D,
3737                                     const AttributeList *AttrList,
3738                                     bool NonInheritable, bool Inheritable) {
3739   for (const AttributeList* l = AttrList; l; l = l->getNext()) {
3740     ProcessDeclAttribute(*this, S, D, *l, NonInheritable, Inheritable);
3741   }
3742 
3743   // GCC accepts
3744   // static int a9 __attribute__((weakref));
3745   // but that looks really pointless. We reject it.
3746   if (Inheritable && D->hasAttr<WeakRefAttr>() && !D->hasAttr<AliasAttr>()) {
3747     Diag(AttrList->getLoc(), diag::err_attribute_weakref_without_alias) <<
3748     dyn_cast<NamedDecl>(D)->getNameAsString();
3749     return;
3750   }
3751 }
3752 
3753 // Annotation attributes are the only attributes allowed after an access
3754 // specifier.
3755 bool Sema::ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl,
3756                                           const AttributeList *AttrList) {
3757   for (const AttributeList* l = AttrList; l; l = l->getNext()) {
3758     if (l->getKind() == AttributeList::AT_annotate) {
3759       handleAnnotateAttr(*this, ASDecl, *l);
3760     } else {
3761       Diag(l->getLoc(), diag::err_only_annotate_after_access_spec);
3762       return true;
3763     }
3764   }
3765 
3766   return false;
3767 }
3768 
3769 /// checkUnusedDeclAttributes - Check a list of attributes to see if it
3770 /// contains any decl attributes that we should warn about.
3771 static void checkUnusedDeclAttributes(Sema &S, const AttributeList *A) {
3772   for ( ; A; A = A->getNext()) {
3773     // Only warn if the attribute is an unignored, non-type attribute.
3774     if (A->isUsedAsTypeAttr()) continue;
3775     if (A->getKind() == AttributeList::IgnoredAttribute) continue;
3776 
3777     if (A->getKind() == AttributeList::UnknownAttribute) {
3778       S.Diag(A->getLoc(), diag::warn_unknown_attribute_ignored)
3779         << A->getName() << A->getRange();
3780     } else {
3781       S.Diag(A->getLoc(), diag::warn_attribute_not_on_decl)
3782         << A->getName() << A->getRange();
3783     }
3784   }
3785 }
3786 
3787 /// checkUnusedDeclAttributes - Given a declarator which is not being
3788 /// used to build a declaration, complain about any decl attributes
3789 /// which might be lying around on it.
3790 void Sema::checkUnusedDeclAttributes(Declarator &D) {
3791   ::checkUnusedDeclAttributes(*this, D.getDeclSpec().getAttributes().getList());
3792   ::checkUnusedDeclAttributes(*this, D.getAttributes());
3793   for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i)
3794     ::checkUnusedDeclAttributes(*this, D.getTypeObject(i).getAttrs());
3795 }
3796 
3797 /// DeclClonePragmaWeak - clone existing decl (maybe definition),
3798 /// #pragma weak needs a non-definition decl and source may not have one
3799 NamedDecl * Sema::DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II,
3800                                       SourceLocation Loc) {
3801   assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
3802   NamedDecl *NewD = 0;
3803   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
3804     FunctionDecl *NewFD;
3805     // FIXME: Missing call to CheckFunctionDeclaration().
3806     // FIXME: Mangling?
3807     // FIXME: Is the qualifier info correct?
3808     // FIXME: Is the DeclContext correct?
3809     NewFD = FunctionDecl::Create(FD->getASTContext(), FD->getDeclContext(),
3810                                  Loc, Loc, DeclarationName(II),
3811                                  FD->getType(), FD->getTypeSourceInfo(),
3812                                  SC_None, SC_None,
3813                                  false/*isInlineSpecified*/,
3814                                  FD->hasPrototype(),
3815                                  false/*isConstexprSpecified*/);
3816     NewD = NewFD;
3817 
3818     if (FD->getQualifier())
3819       NewFD->setQualifierInfo(FD->getQualifierLoc());
3820 
3821     // Fake up parameter variables; they are declared as if this were
3822     // a typedef.
3823     QualType FDTy = FD->getType();
3824     if (const FunctionProtoType *FT = FDTy->getAs<FunctionProtoType>()) {
3825       SmallVector<ParmVarDecl*, 16> Params;
3826       for (FunctionProtoType::arg_type_iterator AI = FT->arg_type_begin(),
3827            AE = FT->arg_type_end(); AI != AE; ++AI) {
3828         ParmVarDecl *Param = BuildParmVarDeclForTypedef(NewFD, Loc, *AI);
3829         Param->setScopeInfo(0, Params.size());
3830         Params.push_back(Param);
3831       }
3832       NewFD->setParams(Params);
3833     }
3834   } else if (VarDecl *VD = dyn_cast<VarDecl>(ND)) {
3835     NewD = VarDecl::Create(VD->getASTContext(), VD->getDeclContext(),
3836                            VD->getInnerLocStart(), VD->getLocation(), II,
3837                            VD->getType(), VD->getTypeSourceInfo(),
3838                            VD->getStorageClass(),
3839                            VD->getStorageClassAsWritten());
3840     if (VD->getQualifier()) {
3841       VarDecl *NewVD = cast<VarDecl>(NewD);
3842       NewVD->setQualifierInfo(VD->getQualifierLoc());
3843     }
3844   }
3845   return NewD;
3846 }
3847 
3848 /// DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak
3849 /// applied to it, possibly with an alias.
3850 void Sema::DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, WeakInfo &W) {
3851   if (W.getUsed()) return; // only do this once
3852   W.setUsed(true);
3853   if (W.getAlias()) { // clone decl, impersonate __attribute(weak,alias(...))
3854     IdentifierInfo *NDId = ND->getIdentifier();
3855     NamedDecl *NewD = DeclClonePragmaWeak(ND, W.getAlias(), W.getLocation());
3856     NewD->addAttr(::new (Context) AliasAttr(W.getLocation(), Context,
3857                                             NDId->getName()));
3858     NewD->addAttr(::new (Context) WeakAttr(W.getLocation(), Context));
3859     WeakTopLevelDecl.push_back(NewD);
3860     // FIXME: "hideous" code from Sema::LazilyCreateBuiltin
3861     // to insert Decl at TU scope, sorry.
3862     DeclContext *SavedContext = CurContext;
3863     CurContext = Context.getTranslationUnitDecl();
3864     PushOnScopeChains(NewD, S);
3865     CurContext = SavedContext;
3866   } else { // just add weak to existing
3867     ND->addAttr(::new (Context) WeakAttr(W.getLocation(), Context));
3868   }
3869 }
3870 
3871 /// ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in
3872 /// it, apply them to D.  This is a bit tricky because PD can have attributes
3873 /// specified in many different places, and we need to find and apply them all.
3874 void Sema::ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD,
3875                                  bool NonInheritable, bool Inheritable) {
3876   // It's valid to "forward-declare" #pragma weak, in which case we
3877   // have to do this.
3878   if (Inheritable) {
3879     LoadExternalWeakUndeclaredIdentifiers();
3880     if (!WeakUndeclaredIdentifiers.empty()) {
3881       if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
3882         if (IdentifierInfo *Id = ND->getIdentifier()) {
3883           llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator I
3884             = WeakUndeclaredIdentifiers.find(Id);
3885           if (I != WeakUndeclaredIdentifiers.end() && ND->hasLinkage()) {
3886             WeakInfo W = I->second;
3887             DeclApplyPragmaWeak(S, ND, W);
3888             WeakUndeclaredIdentifiers[Id] = W;
3889           }
3890         }
3891       }
3892     }
3893   }
3894 
3895   // Apply decl attributes from the DeclSpec if present.
3896   if (const AttributeList *Attrs = PD.getDeclSpec().getAttributes().getList())
3897     ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
3898 
3899   // Walk the declarator structure, applying decl attributes that were in a type
3900   // position to the decl itself.  This handles cases like:
3901   //   int *__attr__(x)** D;
3902   // when X is a decl attribute.
3903   for (unsigned i = 0, e = PD.getNumTypeObjects(); i != e; ++i)
3904     if (const AttributeList *Attrs = PD.getTypeObject(i).getAttrs())
3905       ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
3906 
3907   // Finally, apply any attributes on the decl itself.
3908   if (const AttributeList *Attrs = PD.getAttributes())
3909     ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
3910 }
3911 
3912 /// Is the given declaration allowed to use a forbidden type?
3913 static bool isForbiddenTypeAllowed(Sema &S, Decl *decl) {
3914   // Private ivars are always okay.  Unfortunately, people don't
3915   // always properly make their ivars private, even in system headers.
3916   // Plus we need to make fields okay, too.
3917   // Function declarations in sys headers will be marked unavailable.
3918   if (!isa<FieldDecl>(decl) && !isa<ObjCPropertyDecl>(decl) &&
3919       !isa<FunctionDecl>(decl))
3920     return false;
3921 
3922   // Require it to be declared in a system header.
3923   return S.Context.getSourceManager().isInSystemHeader(decl->getLocation());
3924 }
3925 
3926 /// Handle a delayed forbidden-type diagnostic.
3927 static void handleDelayedForbiddenType(Sema &S, DelayedDiagnostic &diag,
3928                                        Decl *decl) {
3929   if (decl && isForbiddenTypeAllowed(S, decl)) {
3930     decl->addAttr(new (S.Context) UnavailableAttr(diag.Loc, S.Context,
3931                         "this system declaration uses an unsupported type"));
3932     return;
3933   }
3934   if (S.getLangOptions().ObjCAutoRefCount)
3935     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(decl)) {
3936       // FIXME. we may want to supress diagnostics for all
3937       // kind of forbidden type messages on unavailable functions.
3938       if (FD->hasAttr<UnavailableAttr>() &&
3939           diag.getForbiddenTypeDiagnostic() ==
3940           diag::err_arc_array_param_no_ownership) {
3941         diag.Triggered = true;
3942         return;
3943       }
3944     }
3945 
3946   S.Diag(diag.Loc, diag.getForbiddenTypeDiagnostic())
3947     << diag.getForbiddenTypeOperand() << diag.getForbiddenTypeArgument();
3948   diag.Triggered = true;
3949 }
3950 
3951 // This duplicates a vector push_back but hides the need to know the
3952 // size of the type.
3953 void Sema::DelayedDiagnostics::add(const DelayedDiagnostic &diag) {
3954   assert(StackSize <= StackCapacity);
3955 
3956   // Grow the stack if necessary.
3957   if (StackSize == StackCapacity) {
3958     unsigned newCapacity = 2 * StackCapacity + 2;
3959     char *newBuffer = new char[newCapacity * sizeof(DelayedDiagnostic)];
3960     const char *oldBuffer = (const char*) Stack;
3961 
3962     if (StackCapacity)
3963       memcpy(newBuffer, oldBuffer, StackCapacity * sizeof(DelayedDiagnostic));
3964 
3965     delete[] oldBuffer;
3966     Stack = reinterpret_cast<sema::DelayedDiagnostic*>(newBuffer);
3967     StackCapacity = newCapacity;
3968   }
3969 
3970   assert(StackSize < StackCapacity);
3971   new (&Stack[StackSize++]) DelayedDiagnostic(diag);
3972 }
3973 
3974 void Sema::DelayedDiagnostics::popParsingDecl(Sema &S, ParsingDeclState state,
3975                                               Decl *decl) {
3976   DelayedDiagnostics &DD = S.DelayedDiagnostics;
3977 
3978   // Check the invariants.
3979   assert(DD.StackSize >= state.SavedStackSize);
3980   assert(state.SavedStackSize >= DD.ActiveStackBase);
3981   assert(DD.ParsingDepth > 0);
3982 
3983   // Drop the parsing depth.
3984   DD.ParsingDepth--;
3985 
3986   // If there are no active diagnostics, we're done.
3987   if (DD.StackSize == DD.ActiveStackBase)
3988     return;
3989 
3990   // We only want to actually emit delayed diagnostics when we
3991   // successfully parsed a decl.
3992   if (decl && !decl->isInvalidDecl()) {
3993     // We emit all the active diagnostics, not just those starting
3994     // from the saved state.  The idea is this:  we get one push for a
3995     // decl spec and another for each declarator;  in a decl group like:
3996     //   deprecated_typedef foo, *bar, baz();
3997     // only the declarator pops will be passed decls.  This is correct;
3998     // we really do need to consider delayed diagnostics from the decl spec
3999     // for each of the different declarations.
4000     for (unsigned i = DD.ActiveStackBase, e = DD.StackSize; i != e; ++i) {
4001       DelayedDiagnostic &diag = DD.Stack[i];
4002       if (diag.Triggered)
4003         continue;
4004 
4005       switch (diag.Kind) {
4006       case DelayedDiagnostic::Deprecation:
4007         S.HandleDelayedDeprecationCheck(diag, decl);
4008         break;
4009 
4010       case DelayedDiagnostic::Access:
4011         S.HandleDelayedAccessCheck(diag, decl);
4012         break;
4013 
4014       case DelayedDiagnostic::ForbiddenType:
4015         handleDelayedForbiddenType(S, diag, decl);
4016         break;
4017       }
4018     }
4019   }
4020 
4021   // Destroy all the delayed diagnostics we're about to pop off.
4022   for (unsigned i = state.SavedStackSize, e = DD.StackSize; i != e; ++i)
4023     DD.Stack[i].Destroy();
4024 
4025   DD.StackSize = state.SavedStackSize;
4026 }
4027 
4028 static bool isDeclDeprecated(Decl *D) {
4029   do {
4030     if (D->isDeprecated())
4031       return true;
4032     // A category implicitly has the availability of the interface.
4033     if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(D))
4034       return CatD->getClassInterface()->isDeprecated();
4035   } while ((D = cast_or_null<Decl>(D->getDeclContext())));
4036   return false;
4037 }
4038 
4039 void Sema::HandleDelayedDeprecationCheck(DelayedDiagnostic &DD,
4040                                          Decl *Ctx) {
4041   if (isDeclDeprecated(Ctx))
4042     return;
4043 
4044   DD.Triggered = true;
4045   if (!DD.getDeprecationMessage().empty())
4046     Diag(DD.Loc, diag::warn_deprecated_message)
4047       << DD.getDeprecationDecl()->getDeclName()
4048       << DD.getDeprecationMessage();
4049   else
4050     Diag(DD.Loc, diag::warn_deprecated)
4051       << DD.getDeprecationDecl()->getDeclName();
4052 }
4053 
4054 void Sema::EmitDeprecationWarning(NamedDecl *D, StringRef Message,
4055                                   SourceLocation Loc,
4056                                   const ObjCInterfaceDecl *UnknownObjCClass) {
4057   // Delay if we're currently parsing a declaration.
4058   if (DelayedDiagnostics.shouldDelayDiagnostics()) {
4059     DelayedDiagnostics.add(DelayedDiagnostic::makeDeprecation(Loc, D, Message));
4060     return;
4061   }
4062 
4063   // Otherwise, don't warn if our current context is deprecated.
4064   if (isDeclDeprecated(cast<Decl>(getCurLexicalContext())))
4065     return;
4066   if (!Message.empty())
4067     Diag(Loc, diag::warn_deprecated_message) << D->getDeclName()
4068                                              << Message;
4069   else {
4070     if (!UnknownObjCClass)
4071       Diag(Loc, diag::warn_deprecated) << D->getDeclName();
4072     else {
4073       Diag(Loc, diag::warn_deprecated_fwdclass_message) << D->getDeclName();
4074       Diag(UnknownObjCClass->getLocation(), diag::note_forward_class);
4075     }
4076   }
4077 }
4078