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