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