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