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