SemaDeclAttr.cpp revision 28965bfa833926fd908a902cf2373d07c47b9067
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  // FIXME: The C++11 version of this attribute should error out when it is
3319  //        used to specify a weaker alignment, rather than being silently
3320  //        ignored. This constraint cannot be applied until we have seen
3321  //        all the attributes which apply to the variable.
3322
3323  if (Attr.getNumArgs() == 0) {
3324    D->addAttr(::new (S.Context) AlignedAttr(Attr.getRange(), S.Context,
3325               true, 0, Attr.getAttributeSpellingListIndex()));
3326    return;
3327  }
3328
3329  S.AddAlignedAttr(Attr.getRange(), D, Attr.getArg(0),
3330                   Attr.getAttributeSpellingListIndex());
3331}
3332
3333void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, Expr *E,
3334                          unsigned SpellingListIndex) {
3335  // FIXME: Handle pack-expansions here.
3336  if (DiagnoseUnexpandedParameterPack(E))
3337    return;
3338
3339  AlignedAttr TmpAttr(AttrRange, Context, true, E, SpellingListIndex);
3340  SourceLocation AttrLoc = AttrRange.getBegin();
3341
3342  // C++11 alignas(...) and C11 _Alignas(...) have additional requirements.
3343  if (TmpAttr.isAlignas()) {
3344    // C++11 [dcl.align]p1:
3345    //   An alignment-specifier may be applied to a variable or to a class
3346    //   data member, but it shall not be applied to a bit-field, a function
3347    //   parameter, the formal parameter of a catch clause, or a variable
3348    //   declared with the register storage class specifier. An
3349    //   alignment-specifier may also be applied to the declaration of a class
3350    //   or enumeration type.
3351    // C11 6.7.5/2:
3352    //   An alignment attribute shall not be specified in a declaration of
3353    //   a typedef, or a bit-field, or a function, or a parameter, or an
3354    //   object declared with the register storage-class specifier.
3355    int DiagKind = -1;
3356    if (isa<ParmVarDecl>(D)) {
3357      DiagKind = 0;
3358    } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
3359      if (VD->getStorageClass() == SC_Register)
3360        DiagKind = 1;
3361      if (VD->isExceptionVariable())
3362        DiagKind = 2;
3363    } else if (FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
3364      if (FD->isBitField())
3365        DiagKind = 3;
3366    } else if (!isa<TagDecl>(D)) {
3367      Diag(AttrLoc, diag::err_attribute_wrong_decl_type)
3368        << (TmpAttr.isC11() ? "'_Alignas'" : "'alignas'")
3369        << (TmpAttr.isC11() ? ExpectedVariableOrField
3370                            : ExpectedVariableFieldOrTag);
3371      return;
3372    }
3373    if (DiagKind != -1) {
3374      Diag(AttrLoc, diag::err_alignas_attribute_wrong_decl_type)
3375        << TmpAttr.isC11() << DiagKind;
3376      return;
3377    }
3378  }
3379
3380  if (E->isTypeDependent() || E->isValueDependent()) {
3381    // Save dependent expressions in the AST to be instantiated.
3382    D->addAttr(::new (Context) AlignedAttr(TmpAttr));
3383    return;
3384  }
3385
3386  // FIXME: Cache the number on the Attr object?
3387  llvm::APSInt Alignment(32);
3388  ExprResult ICE
3389    = VerifyIntegerConstantExpression(E, &Alignment,
3390        diag::err_aligned_attribute_argument_not_int,
3391        /*AllowFold*/ false);
3392  if (ICE.isInvalid())
3393    return;
3394
3395  // C++11 [dcl.align]p2:
3396  //   -- if the constant expression evaluates to zero, the alignment
3397  //      specifier shall have no effect
3398  // C11 6.7.5p6:
3399  //   An alignment specification of zero has no effect.
3400  if (!(TmpAttr.isAlignas() && !Alignment) &&
3401      !llvm::isPowerOf2_64(Alignment.getZExtValue())) {
3402    Diag(AttrLoc, diag::err_attribute_aligned_not_power_of_two)
3403      << E->getSourceRange();
3404    return;
3405  }
3406
3407  if (TmpAttr.isDeclspec()) {
3408    // We've already verified it's a power of 2, now let's make sure it's
3409    // 8192 or less.
3410    if (Alignment.getZExtValue() > 8192) {
3411      Diag(AttrLoc, diag::err_attribute_aligned_greater_than_8192)
3412        << E->getSourceRange();
3413      return;
3414    }
3415  }
3416
3417  D->addAttr(::new (Context) AlignedAttr(AttrRange, Context, true,
3418                                         ICE.take(), SpellingListIndex));
3419}
3420
3421void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, TypeSourceInfo *TS,
3422                          unsigned SpellingListIndex) {
3423  // FIXME: Cache the number on the Attr object if non-dependent?
3424  // FIXME: Perform checking of type validity
3425  D->addAttr(::new (Context) AlignedAttr(AttrRange, Context, false, TS,
3426                                         SpellingListIndex));
3427  return;
3428}
3429
3430void Sema::CheckAlignasUnderalignment(Decl *D) {
3431  assert(D->hasAttrs() && "no attributes on decl");
3432
3433  QualType Ty;
3434  if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
3435    Ty = VD->getType();
3436  else
3437    Ty = Context.getTagDeclType(cast<TagDecl>(D));
3438  if (Ty->isDependentType())
3439    return;
3440
3441  // C++11 [dcl.align]p5, C11 6.7.5/4:
3442  //   The combined effect of all alignment attributes in a declaration shall
3443  //   not specify an alignment that is less strict than the alignment that
3444  //   would otherwise be required for the entity being declared.
3445  AlignedAttr *AlignasAttr = 0;
3446  unsigned Align = 0;
3447  for (specific_attr_iterator<AlignedAttr>
3448         I = D->specific_attr_begin<AlignedAttr>(),
3449         E = D->specific_attr_end<AlignedAttr>(); I != E; ++I) {
3450    if (I->isAlignmentDependent())
3451      return;
3452    if (I->isAlignas())
3453      AlignasAttr = *I;
3454    Align = std::max(Align, I->getAlignment(Context));
3455  }
3456
3457  if (AlignasAttr && Align) {
3458    CharUnits RequestedAlign = Context.toCharUnitsFromBits(Align);
3459    CharUnits NaturalAlign = Context.getTypeAlignInChars(Ty);
3460    if (NaturalAlign > RequestedAlign)
3461      Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
3462        << Ty << (unsigned)NaturalAlign.getQuantity();
3463  }
3464}
3465
3466/// handleModeAttr - This attribute modifies the width of a decl with primitive
3467/// type.
3468///
3469/// Despite what would be logical, the mode attribute is a decl attribute, not a
3470/// type attribute: 'int ** __attribute((mode(HI))) *G;' tries to make 'G' be
3471/// HImode, not an intermediate pointer.
3472static void handleModeAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3473  // This attribute isn't documented, but glibc uses it.  It changes
3474  // the width of an int or unsigned int to the specified size.
3475
3476  // Check that there aren't any arguments
3477  if (!checkAttributeNumArgs(S, Attr, 0))
3478    return;
3479
3480
3481  IdentifierInfo *Name = Attr.getParameterName();
3482  if (!Name) {
3483    S.Diag(Attr.getLoc(), diag::err_attribute_missing_parameter_name);
3484    return;
3485  }
3486
3487  StringRef Str = Attr.getParameterName()->getName();
3488
3489  // Normalize the attribute name, __foo__ becomes foo.
3490  if (Str.startswith("__") && Str.endswith("__"))
3491    Str = Str.substr(2, Str.size() - 4);
3492
3493  unsigned DestWidth = 0;
3494  bool IntegerMode = true;
3495  bool ComplexMode = false;
3496  switch (Str.size()) {
3497  case 2:
3498    switch (Str[0]) {
3499    case 'Q': DestWidth = 8; break;
3500    case 'H': DestWidth = 16; break;
3501    case 'S': DestWidth = 32; break;
3502    case 'D': DestWidth = 64; break;
3503    case 'X': DestWidth = 96; break;
3504    case 'T': DestWidth = 128; break;
3505    }
3506    if (Str[1] == 'F') {
3507      IntegerMode = false;
3508    } else if (Str[1] == 'C') {
3509      IntegerMode = false;
3510      ComplexMode = true;
3511    } else if (Str[1] != 'I') {
3512      DestWidth = 0;
3513    }
3514    break;
3515  case 4:
3516    // FIXME: glibc uses 'word' to define register_t; this is narrower than a
3517    // pointer on PIC16 and other embedded platforms.
3518    if (Str == "word")
3519      DestWidth = S.Context.getTargetInfo().getPointerWidth(0);
3520    else if (Str == "byte")
3521      DestWidth = S.Context.getTargetInfo().getCharWidth();
3522    break;
3523  case 7:
3524    if (Str == "pointer")
3525      DestWidth = S.Context.getTargetInfo().getPointerWidth(0);
3526    break;
3527  case 11:
3528    if (Str == "unwind_word")
3529      DestWidth = S.Context.getTargetInfo().getUnwindWordWidth();
3530    break;
3531  }
3532
3533  QualType OldTy;
3534  if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D))
3535    OldTy = TD->getUnderlyingType();
3536  else if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
3537    OldTy = VD->getType();
3538  else {
3539    S.Diag(D->getLocation(), diag::err_attr_wrong_decl)
3540      << "mode" << Attr.getRange();
3541    return;
3542  }
3543
3544  if (!OldTy->getAs<BuiltinType>() && !OldTy->isComplexType())
3545    S.Diag(Attr.getLoc(), diag::err_mode_not_primitive);
3546  else if (IntegerMode) {
3547    if (!OldTy->isIntegralOrEnumerationType())
3548      S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
3549  } else if (ComplexMode) {
3550    if (!OldTy->isComplexType())
3551      S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
3552  } else {
3553    if (!OldTy->isFloatingType())
3554      S.Diag(Attr.getLoc(), diag::err_mode_wrong_type);
3555  }
3556
3557  // FIXME: Sync this with InitializePredefinedMacros; we need to match int8_t
3558  // and friends, at least with glibc.
3559  // FIXME: Make sure 32/64-bit integers don't get defined to types of the wrong
3560  // width on unusual platforms.
3561  // FIXME: Make sure floating-point mappings are accurate
3562  // FIXME: Support XF and TF types
3563  QualType NewTy;
3564  switch (DestWidth) {
3565  case 0:
3566    S.Diag(Attr.getLoc(), diag::err_unknown_machine_mode) << Name;
3567    return;
3568  default:
3569    S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
3570    return;
3571  case 8:
3572    if (!IntegerMode) {
3573      S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
3574      return;
3575    }
3576    if (OldTy->isSignedIntegerType())
3577      NewTy = S.Context.SignedCharTy;
3578    else
3579      NewTy = S.Context.UnsignedCharTy;
3580    break;
3581  case 16:
3582    if (!IntegerMode) {
3583      S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
3584      return;
3585    }
3586    if (OldTy->isSignedIntegerType())
3587      NewTy = S.Context.ShortTy;
3588    else
3589      NewTy = S.Context.UnsignedShortTy;
3590    break;
3591  case 32:
3592    if (!IntegerMode)
3593      NewTy = S.Context.FloatTy;
3594    else if (OldTy->isSignedIntegerType())
3595      NewTy = S.Context.IntTy;
3596    else
3597      NewTy = S.Context.UnsignedIntTy;
3598    break;
3599  case 64:
3600    if (!IntegerMode)
3601      NewTy = S.Context.DoubleTy;
3602    else if (OldTy->isSignedIntegerType())
3603      if (S.Context.getTargetInfo().getLongWidth() == 64)
3604        NewTy = S.Context.LongTy;
3605      else
3606        NewTy = S.Context.LongLongTy;
3607    else
3608      if (S.Context.getTargetInfo().getLongWidth() == 64)
3609        NewTy = S.Context.UnsignedLongTy;
3610      else
3611        NewTy = S.Context.UnsignedLongLongTy;
3612    break;
3613  case 96:
3614    NewTy = S.Context.LongDoubleTy;
3615    break;
3616  case 128:
3617    if (!IntegerMode) {
3618      S.Diag(Attr.getLoc(), diag::err_unsupported_machine_mode) << Name;
3619      return;
3620    }
3621    if (OldTy->isSignedIntegerType())
3622      NewTy = S.Context.Int128Ty;
3623    else
3624      NewTy = S.Context.UnsignedInt128Ty;
3625    break;
3626  }
3627
3628  if (ComplexMode) {
3629    NewTy = S.Context.getComplexType(NewTy);
3630  }
3631
3632  // Install the new type.
3633  if (TypedefNameDecl *TD = dyn_cast<TypedefNameDecl>(D)) {
3634    // FIXME: preserve existing source info.
3635    TD->setTypeSourceInfo(S.Context.getTrivialTypeSourceInfo(NewTy));
3636  } else
3637    cast<ValueDecl>(D)->setType(NewTy);
3638}
3639
3640static void handleNoDebugAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3641  // check the attribute arguments.
3642  if (!checkAttributeNumArgs(S, Attr, 0))
3643    return;
3644
3645  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3646    if (!VD->hasGlobalStorage())
3647      S.Diag(Attr.getLoc(),
3648             diag::warn_attribute_requires_functions_or_static_globals)
3649        << Attr.getName();
3650  } else if (!isFunctionOrMethod(D)) {
3651    S.Diag(Attr.getLoc(),
3652           diag::warn_attribute_requires_functions_or_static_globals)
3653      << Attr.getName();
3654    return;
3655  }
3656
3657  D->addAttr(::new (S.Context)
3658             NoDebugAttr(Attr.getRange(), S.Context,
3659                         Attr.getAttributeSpellingListIndex()));
3660}
3661
3662static void handleNoInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3663  // check the attribute arguments.
3664  if (!checkAttributeNumArgs(S, Attr, 0))
3665    return;
3666
3667
3668  if (!isa<FunctionDecl>(D)) {
3669    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3670      << Attr.getName() << ExpectedFunction;
3671    return;
3672  }
3673
3674  D->addAttr(::new (S.Context)
3675             NoInlineAttr(Attr.getRange(), S.Context,
3676             Attr.getAttributeSpellingListIndex()));
3677}
3678
3679static void handleNoInstrumentFunctionAttr(Sema &S, Decl *D,
3680                                           const AttributeList &Attr) {
3681  // check the attribute arguments.
3682  if (!checkAttributeNumArgs(S, Attr, 0))
3683    return;
3684
3685
3686  if (!isa<FunctionDecl>(D)) {
3687    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3688      << Attr.getName() << ExpectedFunction;
3689    return;
3690  }
3691
3692  D->addAttr(::new (S.Context)
3693             NoInstrumentFunctionAttr(Attr.getRange(), S.Context,
3694                                      Attr.getAttributeSpellingListIndex()));
3695}
3696
3697static void handleConstantAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3698  if (S.LangOpts.CUDA) {
3699    // check the attribute arguments.
3700    if (Attr.hasParameterOrArguments()) {
3701      S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
3702      return;
3703    }
3704
3705    if (!isa<VarDecl>(D)) {
3706      S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3707        << Attr.getName() << ExpectedVariable;
3708      return;
3709    }
3710
3711    D->addAttr(::new (S.Context)
3712               CUDAConstantAttr(Attr.getRange(), S.Context,
3713                                Attr.getAttributeSpellingListIndex()));
3714  } else {
3715    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "constant";
3716  }
3717}
3718
3719static void handleDeviceAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3720  if (S.LangOpts.CUDA) {
3721    // check the attribute arguments.
3722    if (Attr.getNumArgs() != 0) {
3723      S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
3724      return;
3725    }
3726
3727    if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D)) {
3728      S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3729        << Attr.getName() << ExpectedVariableOrFunction;
3730      return;
3731    }
3732
3733    D->addAttr(::new (S.Context)
3734               CUDADeviceAttr(Attr.getRange(), S.Context,
3735                              Attr.getAttributeSpellingListIndex()));
3736  } else {
3737    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "device";
3738  }
3739}
3740
3741static void handleGlobalAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3742  if (S.LangOpts.CUDA) {
3743    // check the attribute arguments.
3744    if (!checkAttributeNumArgs(S, Attr, 0))
3745      return;
3746
3747    if (!isa<FunctionDecl>(D)) {
3748      S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3749        << Attr.getName() << ExpectedFunction;
3750      return;
3751    }
3752
3753    FunctionDecl *FD = cast<FunctionDecl>(D);
3754    if (!FD->getResultType()->isVoidType()) {
3755      TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc().IgnoreParens();
3756      if (FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>()) {
3757        S.Diag(FD->getTypeSpecStartLoc(), diag::err_kern_type_not_void_return)
3758          << FD->getType()
3759          << FixItHint::CreateReplacement(FTL.getResultLoc().getSourceRange(),
3760                                          "void");
3761      } else {
3762        S.Diag(FD->getTypeSpecStartLoc(), diag::err_kern_type_not_void_return)
3763          << FD->getType();
3764      }
3765      return;
3766    }
3767
3768    D->addAttr(::new (S.Context)
3769               CUDAGlobalAttr(Attr.getRange(), S.Context,
3770                              Attr.getAttributeSpellingListIndex()));
3771  } else {
3772    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "global";
3773  }
3774}
3775
3776static void handleHostAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3777  if (S.LangOpts.CUDA) {
3778    // check the attribute arguments.
3779    if (!checkAttributeNumArgs(S, Attr, 0))
3780      return;
3781
3782
3783    if (!isa<FunctionDecl>(D)) {
3784      S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3785        << Attr.getName() << ExpectedFunction;
3786      return;
3787    }
3788
3789    D->addAttr(::new (S.Context)
3790               CUDAHostAttr(Attr.getRange(), S.Context,
3791                            Attr.getAttributeSpellingListIndex()));
3792  } else {
3793    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "host";
3794  }
3795}
3796
3797static void handleSharedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3798  if (S.LangOpts.CUDA) {
3799    // check the attribute arguments.
3800    if (!checkAttributeNumArgs(S, Attr, 0))
3801      return;
3802
3803    if (!isa<VarDecl>(D)) {
3804      S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3805        << Attr.getName() << ExpectedVariable;
3806      return;
3807    }
3808
3809    D->addAttr(::new (S.Context)
3810               CUDASharedAttr(Attr.getRange(), S.Context,
3811                              Attr.getAttributeSpellingListIndex()));
3812  } else {
3813    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "shared";
3814  }
3815}
3816
3817static void handleGNUInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3818  // check the attribute arguments.
3819  if (!checkAttributeNumArgs(S, Attr, 0))
3820    return;
3821
3822  FunctionDecl *Fn = dyn_cast<FunctionDecl>(D);
3823  if (Fn == 0) {
3824    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3825      << Attr.getName() << ExpectedFunction;
3826    return;
3827  }
3828
3829  if (!Fn->isInlineSpecified()) {
3830    S.Diag(Attr.getLoc(), diag::warn_gnu_inline_attribute_requires_inline);
3831    return;
3832  }
3833
3834  D->addAttr(::new (S.Context)
3835             GNUInlineAttr(Attr.getRange(), S.Context,
3836                           Attr.getAttributeSpellingListIndex()));
3837}
3838
3839static void handleCallConvAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3840  if (hasDeclarator(D)) return;
3841
3842  const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
3843  // Diagnostic is emitted elsewhere: here we store the (valid) Attr
3844  // in the Decl node for syntactic reasoning, e.g., pretty-printing.
3845  CallingConv CC;
3846  if (S.CheckCallingConvAttr(Attr, CC, FD))
3847    return;
3848
3849  if (!isa<ObjCMethodDecl>(D)) {
3850    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3851      << Attr.getName() << ExpectedFunctionOrMethod;
3852    return;
3853  }
3854
3855  switch (Attr.getKind()) {
3856  case AttributeList::AT_FastCall:
3857    D->addAttr(::new (S.Context)
3858               FastCallAttr(Attr.getRange(), S.Context,
3859                            Attr.getAttributeSpellingListIndex()));
3860    return;
3861  case AttributeList::AT_StdCall:
3862    D->addAttr(::new (S.Context)
3863               StdCallAttr(Attr.getRange(), S.Context,
3864                           Attr.getAttributeSpellingListIndex()));
3865    return;
3866  case AttributeList::AT_ThisCall:
3867    D->addAttr(::new (S.Context)
3868               ThisCallAttr(Attr.getRange(), S.Context,
3869                            Attr.getAttributeSpellingListIndex()));
3870    return;
3871  case AttributeList::AT_CDecl:
3872    D->addAttr(::new (S.Context)
3873               CDeclAttr(Attr.getRange(), S.Context,
3874                         Attr.getAttributeSpellingListIndex()));
3875    return;
3876  case AttributeList::AT_Pascal:
3877    D->addAttr(::new (S.Context)
3878               PascalAttr(Attr.getRange(), S.Context,
3879                          Attr.getAttributeSpellingListIndex()));
3880    return;
3881  case AttributeList::AT_Pcs: {
3882    PcsAttr::PCSType PCS;
3883    switch (CC) {
3884    case CC_AAPCS:
3885      PCS = PcsAttr::AAPCS;
3886      break;
3887    case CC_AAPCS_VFP:
3888      PCS = PcsAttr::AAPCS_VFP;
3889      break;
3890    default:
3891      llvm_unreachable("unexpected calling convention in pcs attribute");
3892    }
3893
3894    D->addAttr(::new (S.Context)
3895               PcsAttr(Attr.getRange(), S.Context, PCS,
3896                       Attr.getAttributeSpellingListIndex()));
3897    return;
3898  }
3899  case AttributeList::AT_PnaclCall:
3900    D->addAttr(::new (S.Context)
3901               PnaclCallAttr(Attr.getRange(), S.Context,
3902                             Attr.getAttributeSpellingListIndex()));
3903    return;
3904  case AttributeList::AT_IntelOclBicc:
3905    D->addAttr(::new (S.Context)
3906               IntelOclBiccAttr(Attr.getRange(), S.Context,
3907                                Attr.getAttributeSpellingListIndex()));
3908    return;
3909
3910  default:
3911    llvm_unreachable("unexpected attribute kind");
3912  }
3913}
3914
3915static void handleOpenCLKernelAttr(Sema &S, Decl *D, const AttributeList &Attr){
3916  assert(!Attr.isInvalid());
3917  D->addAttr(::new (S.Context) OpenCLKernelAttr(Attr.getRange(), S.Context));
3918}
3919
3920bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC,
3921                                const FunctionDecl *FD) {
3922  if (attr.isInvalid())
3923    return true;
3924
3925  unsigned ReqArgs = attr.getKind() == AttributeList::AT_Pcs ? 1 : 0;
3926  if (attr.getNumArgs() != ReqArgs || attr.getParameterName()) {
3927    Diag(attr.getLoc(), diag::err_attribute_wrong_number_arguments) << ReqArgs;
3928    attr.setInvalid();
3929    return true;
3930  }
3931
3932  // TODO: diagnose uses of these conventions on the wrong target. Or, better
3933  // move to TargetAttributesSema one day.
3934  switch (attr.getKind()) {
3935  case AttributeList::AT_CDecl: CC = CC_C; break;
3936  case AttributeList::AT_FastCall: CC = CC_X86FastCall; break;
3937  case AttributeList::AT_StdCall: CC = CC_X86StdCall; break;
3938  case AttributeList::AT_ThisCall: CC = CC_X86ThisCall; break;
3939  case AttributeList::AT_Pascal: CC = CC_X86Pascal; break;
3940  case AttributeList::AT_Pcs: {
3941    Expr *Arg = attr.getArg(0);
3942    StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
3943    if (!Str || !Str->isAscii()) {
3944      Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string)
3945        << "pcs" << 1;
3946      attr.setInvalid();
3947      return true;
3948    }
3949
3950    StringRef StrRef = Str->getString();
3951    if (StrRef == "aapcs") {
3952      CC = CC_AAPCS;
3953      break;
3954    } else if (StrRef == "aapcs-vfp") {
3955      CC = CC_AAPCS_VFP;
3956      break;
3957    }
3958
3959    attr.setInvalid();
3960    Diag(attr.getLoc(), diag::err_invalid_pcs);
3961    return true;
3962  }
3963  case AttributeList::AT_PnaclCall: CC = CC_PnaclCall; break;
3964  case AttributeList::AT_IntelOclBicc: CC = CC_IntelOclBicc; break;
3965  default: llvm_unreachable("unexpected attribute kind");
3966  }
3967
3968  const TargetInfo &TI = Context.getTargetInfo();
3969  TargetInfo::CallingConvCheckResult A = TI.checkCallingConvention(CC);
3970  if (A == TargetInfo::CCCR_Warning) {
3971    Diag(attr.getLoc(), diag::warn_cconv_ignored) << attr.getName();
3972
3973    TargetInfo::CallingConvMethodType MT = TargetInfo::CCMT_Unknown;
3974    if (FD)
3975      MT = FD->isCXXInstanceMember() ? TargetInfo::CCMT_Member :
3976                                    TargetInfo::CCMT_NonMember;
3977    CC = TI.getDefaultCallingConv(MT);
3978  }
3979
3980  return false;
3981}
3982
3983static void handleRegparmAttr(Sema &S, Decl *D, const AttributeList &Attr) {
3984  if (hasDeclarator(D)) return;
3985
3986  unsigned numParams;
3987  if (S.CheckRegparmAttr(Attr, numParams))
3988    return;
3989
3990  if (!isa<ObjCMethodDecl>(D)) {
3991    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
3992      << Attr.getName() << ExpectedFunctionOrMethod;
3993    return;
3994  }
3995
3996  D->addAttr(::new (S.Context)
3997             RegparmAttr(Attr.getRange(), S.Context, numParams,
3998                         Attr.getAttributeSpellingListIndex()));
3999}
4000
4001/// Checks a regparm attribute, returning true if it is ill-formed and
4002/// otherwise setting numParams to the appropriate value.
4003bool Sema::CheckRegparmAttr(const AttributeList &Attr, unsigned &numParams) {
4004  if (Attr.isInvalid())
4005    return true;
4006
4007  if (Attr.getNumArgs() != 1) {
4008    Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
4009    Attr.setInvalid();
4010    return true;
4011  }
4012
4013  Expr *NumParamsExpr = Attr.getArg(0);
4014  llvm::APSInt NumParams(32);
4015  if (NumParamsExpr->isTypeDependent() || NumParamsExpr->isValueDependent() ||
4016      !NumParamsExpr->isIntegerConstantExpr(NumParams, Context)) {
4017    Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
4018      << "regparm" << NumParamsExpr->getSourceRange();
4019    Attr.setInvalid();
4020    return true;
4021  }
4022
4023  if (Context.getTargetInfo().getRegParmMax() == 0) {
4024    Diag(Attr.getLoc(), diag::err_attribute_regparm_wrong_platform)
4025      << NumParamsExpr->getSourceRange();
4026    Attr.setInvalid();
4027    return true;
4028  }
4029
4030  numParams = NumParams.getZExtValue();
4031  if (numParams > Context.getTargetInfo().getRegParmMax()) {
4032    Diag(Attr.getLoc(), diag::err_attribute_regparm_invalid_number)
4033      << Context.getTargetInfo().getRegParmMax() << NumParamsExpr->getSourceRange();
4034    Attr.setInvalid();
4035    return true;
4036  }
4037
4038  return false;
4039}
4040
4041static void handleLaunchBoundsAttr(Sema &S, Decl *D, const AttributeList &Attr){
4042  if (S.LangOpts.CUDA) {
4043    // check the attribute arguments.
4044    if (Attr.getNumArgs() != 1 && Attr.getNumArgs() != 2) {
4045      // FIXME: 0 is not okay.
4046      S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 2;
4047      return;
4048    }
4049
4050    if (!isFunctionOrMethod(D)) {
4051      S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
4052        << Attr.getName() << ExpectedFunctionOrMethod;
4053      return;
4054    }
4055
4056    Expr *MaxThreadsExpr = Attr.getArg(0);
4057    llvm::APSInt MaxThreads(32);
4058    if (MaxThreadsExpr->isTypeDependent() ||
4059        MaxThreadsExpr->isValueDependent() ||
4060        !MaxThreadsExpr->isIntegerConstantExpr(MaxThreads, S.Context)) {
4061      S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
4062        << "launch_bounds" << 1 << MaxThreadsExpr->getSourceRange();
4063      return;
4064    }
4065
4066    llvm::APSInt MinBlocks(32);
4067    if (Attr.getNumArgs() > 1) {
4068      Expr *MinBlocksExpr = Attr.getArg(1);
4069      if (MinBlocksExpr->isTypeDependent() ||
4070          MinBlocksExpr->isValueDependent() ||
4071          !MinBlocksExpr->isIntegerConstantExpr(MinBlocks, S.Context)) {
4072        S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_int)
4073          << "launch_bounds" << 2 << MinBlocksExpr->getSourceRange();
4074        return;
4075      }
4076    }
4077
4078    D->addAttr(::new (S.Context)
4079               CUDALaunchBoundsAttr(Attr.getRange(), S.Context,
4080                                    MaxThreads.getZExtValue(),
4081                                    MinBlocks.getZExtValue(),
4082                                    Attr.getAttributeSpellingListIndex()));
4083  } else {
4084    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "launch_bounds";
4085  }
4086}
4087
4088static void handleArgumentWithTypeTagAttr(Sema &S, Decl *D,
4089                                          const AttributeList &Attr) {
4090  StringRef AttrName = Attr.getName()->getName();
4091  if (!Attr.getParameterName()) {
4092    S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_identifier)
4093      << Attr.getName() << /* arg num = */ 1;
4094    return;
4095  }
4096
4097  if (Attr.getNumArgs() != 2) {
4098    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments)
4099      << /* required args = */ 3;
4100    return;
4101  }
4102
4103  IdentifierInfo *ArgumentKind = Attr.getParameterName();
4104
4105  if (!isFunctionOrMethod(D) || !hasFunctionProto(D)) {
4106    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
4107      << Attr.getName() << ExpectedFunctionOrMethod;
4108    return;
4109  }
4110
4111  uint64_t ArgumentIdx;
4112  if (!checkFunctionOrMethodArgumentIndex(S, D, AttrName,
4113                                          Attr.getLoc(), 2,
4114                                          Attr.getArg(0), ArgumentIdx))
4115    return;
4116
4117  uint64_t TypeTagIdx;
4118  if (!checkFunctionOrMethodArgumentIndex(S, D, AttrName,
4119                                          Attr.getLoc(), 3,
4120                                          Attr.getArg(1), TypeTagIdx))
4121    return;
4122
4123  bool IsPointer = (AttrName == "pointer_with_type_tag");
4124  if (IsPointer) {
4125    // Ensure that buffer has a pointer type.
4126    QualType BufferTy = getFunctionOrMethodArgType(D, ArgumentIdx);
4127    if (!BufferTy->isPointerType()) {
4128      S.Diag(Attr.getLoc(), diag::err_attribute_pointers_only)
4129        << AttrName;
4130    }
4131  }
4132
4133  D->addAttr(::new (S.Context)
4134             ArgumentWithTypeTagAttr(Attr.getRange(), S.Context, ArgumentKind,
4135                                     ArgumentIdx, TypeTagIdx, IsPointer,
4136                                     Attr.getAttributeSpellingListIndex()));
4137}
4138
4139static void handleTypeTagForDatatypeAttr(Sema &S, Decl *D,
4140                                         const AttributeList &Attr) {
4141  IdentifierInfo *PointerKind = Attr.getParameterName();
4142  if (!PointerKind) {
4143    S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_identifier)
4144      << "type_tag_for_datatype" << 1;
4145    return;
4146  }
4147
4148  QualType MatchingCType = S.GetTypeFromParser(Attr.getMatchingCType(), NULL);
4149
4150  D->addAttr(::new (S.Context)
4151             TypeTagForDatatypeAttr(Attr.getRange(), S.Context, PointerKind,
4152                                    MatchingCType,
4153                                    Attr.getLayoutCompatible(),
4154                                    Attr.getMustBeNull(),
4155                                    Attr.getAttributeSpellingListIndex()));
4156}
4157
4158//===----------------------------------------------------------------------===//
4159// Checker-specific attribute handlers.
4160//===----------------------------------------------------------------------===//
4161
4162static bool isValidSubjectOfNSAttribute(Sema &S, QualType type) {
4163  return type->isDependentType() ||
4164         type->isObjCObjectPointerType() ||
4165         S.Context.isObjCNSObjectType(type);
4166}
4167static bool isValidSubjectOfCFAttribute(Sema &S, QualType type) {
4168  return type->isDependentType() ||
4169         type->isPointerType() ||
4170         isValidSubjectOfNSAttribute(S, type);
4171}
4172
4173static void handleNSConsumedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
4174  ParmVarDecl *param = dyn_cast<ParmVarDecl>(D);
4175  if (!param) {
4176    S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
4177      << Attr.getRange() << Attr.getName() << ExpectedParameter;
4178    return;
4179  }
4180
4181  bool typeOK, cf;
4182  if (Attr.getKind() == AttributeList::AT_NSConsumed) {
4183    typeOK = isValidSubjectOfNSAttribute(S, param->getType());
4184    cf = false;
4185  } else {
4186    typeOK = isValidSubjectOfCFAttribute(S, param->getType());
4187    cf = true;
4188  }
4189
4190  if (!typeOK) {
4191    S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_parameter_type)
4192      << Attr.getRange() << Attr.getName() << cf;
4193    return;
4194  }
4195
4196  if (cf)
4197    param->addAttr(::new (S.Context)
4198                   CFConsumedAttr(Attr.getRange(), S.Context,
4199                                  Attr.getAttributeSpellingListIndex()));
4200  else
4201    param->addAttr(::new (S.Context)
4202                   NSConsumedAttr(Attr.getRange(), S.Context,
4203                                  Attr.getAttributeSpellingListIndex()));
4204}
4205
4206static void handleNSConsumesSelfAttr(Sema &S, Decl *D,
4207                                     const AttributeList &Attr) {
4208  if (!isa<ObjCMethodDecl>(D)) {
4209    S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
4210      << Attr.getRange() << Attr.getName() << ExpectedMethod;
4211    return;
4212  }
4213
4214  D->addAttr(::new (S.Context)
4215             NSConsumesSelfAttr(Attr.getRange(), S.Context,
4216                                Attr.getAttributeSpellingListIndex()));
4217}
4218
4219static void handleNSReturnsRetainedAttr(Sema &S, Decl *D,
4220                                        const AttributeList &Attr) {
4221
4222  QualType returnType;
4223
4224  if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
4225    returnType = MD->getResultType();
4226  else if (S.getLangOpts().ObjCAutoRefCount && hasDeclarator(D) &&
4227           (Attr.getKind() == AttributeList::AT_NSReturnsRetained))
4228    return; // ignore: was handled as a type attribute
4229  else if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
4230    returnType = PD->getType();
4231  else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
4232    returnType = FD->getResultType();
4233  else {
4234    S.Diag(D->getLocStart(), diag::warn_attribute_wrong_decl_type)
4235        << Attr.getRange() << Attr.getName()
4236        << ExpectedFunctionOrMethod;
4237    return;
4238  }
4239
4240  bool typeOK;
4241  bool cf;
4242  switch (Attr.getKind()) {
4243  default: llvm_unreachable("invalid ownership attribute");
4244  case AttributeList::AT_NSReturnsAutoreleased:
4245  case AttributeList::AT_NSReturnsRetained:
4246  case AttributeList::AT_NSReturnsNotRetained:
4247    typeOK = isValidSubjectOfNSAttribute(S, returnType);
4248    cf = false;
4249    break;
4250
4251  case AttributeList::AT_CFReturnsRetained:
4252  case AttributeList::AT_CFReturnsNotRetained:
4253    typeOK = isValidSubjectOfCFAttribute(S, returnType);
4254    cf = true;
4255    break;
4256  }
4257
4258  if (!typeOK) {
4259    S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
4260      << Attr.getRange() << Attr.getName() << isa<ObjCMethodDecl>(D) << cf;
4261    return;
4262  }
4263
4264  switch (Attr.getKind()) {
4265    default:
4266      llvm_unreachable("invalid ownership attribute");
4267    case AttributeList::AT_NSReturnsAutoreleased:
4268      D->addAttr(::new (S.Context)
4269                 NSReturnsAutoreleasedAttr(Attr.getRange(), S.Context,
4270                                           Attr.getAttributeSpellingListIndex()));
4271      return;
4272    case AttributeList::AT_CFReturnsNotRetained:
4273      D->addAttr(::new (S.Context)
4274                 CFReturnsNotRetainedAttr(Attr.getRange(), S.Context,
4275                                          Attr.getAttributeSpellingListIndex()));
4276      return;
4277    case AttributeList::AT_NSReturnsNotRetained:
4278      D->addAttr(::new (S.Context)
4279                 NSReturnsNotRetainedAttr(Attr.getRange(), S.Context,
4280                                          Attr.getAttributeSpellingListIndex()));
4281      return;
4282    case AttributeList::AT_CFReturnsRetained:
4283      D->addAttr(::new (S.Context)
4284                 CFReturnsRetainedAttr(Attr.getRange(), S.Context,
4285                                       Attr.getAttributeSpellingListIndex()));
4286      return;
4287    case AttributeList::AT_NSReturnsRetained:
4288      D->addAttr(::new (S.Context)
4289                 NSReturnsRetainedAttr(Attr.getRange(), S.Context,
4290                                       Attr.getAttributeSpellingListIndex()));
4291      return;
4292  };
4293}
4294
4295static void handleObjCReturnsInnerPointerAttr(Sema &S, Decl *D,
4296                                              const AttributeList &attr) {
4297  SourceLocation loc = attr.getLoc();
4298
4299  ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(D);
4300
4301  if (!method) {
4302    S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
4303      << SourceRange(loc, loc) << attr.getName() << ExpectedMethod;
4304    return;
4305  }
4306
4307  // Check that the method returns a normal pointer.
4308  QualType resultType = method->getResultType();
4309
4310  if (!resultType->isReferenceType() &&
4311      (!resultType->isPointerType() || resultType->isObjCRetainableType())) {
4312    S.Diag(method->getLocStart(), diag::warn_ns_attribute_wrong_return_type)
4313      << SourceRange(loc)
4314      << attr.getName() << /*method*/ 1 << /*non-retainable pointer*/ 2;
4315
4316    // Drop the attribute.
4317    return;
4318  }
4319
4320  method->addAttr(::new (S.Context)
4321                  ObjCReturnsInnerPointerAttr(attr.getRange(), S.Context,
4322                                              attr.getAttributeSpellingListIndex()));
4323}
4324
4325static void handleObjCRequiresSuperAttr(Sema &S, Decl *D,
4326                                        const AttributeList &attr) {
4327  SourceLocation loc = attr.getLoc();
4328  ObjCMethodDecl *method = dyn_cast<ObjCMethodDecl>(D);
4329
4330  if (!method) {
4331   S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
4332   << SourceRange(loc, loc) << attr.getName() << ExpectedMethod;
4333    return;
4334  }
4335  DeclContext *DC = method->getDeclContext();
4336  if (const ObjCProtocolDecl *PDecl = dyn_cast_or_null<ObjCProtocolDecl>(DC)) {
4337    S.Diag(D->getLocStart(), diag::warn_objc_requires_super_protocol)
4338    << attr.getName() << 0;
4339    S.Diag(PDecl->getLocation(), diag::note_protocol_decl);
4340    return;
4341  }
4342  if (method->getMethodFamily() == OMF_dealloc) {
4343    S.Diag(D->getLocStart(), diag::warn_objc_requires_super_protocol)
4344    << attr.getName() << 1;
4345    return;
4346  }
4347
4348  method->addAttr(::new (S.Context)
4349                  ObjCRequiresSuperAttr(attr.getRange(), S.Context,
4350                                        attr.getAttributeSpellingListIndex()));
4351}
4352
4353/// Handle cf_audited_transfer and cf_unknown_transfer.
4354static void handleCFTransferAttr(Sema &S, Decl *D, const AttributeList &A) {
4355  if (!isa<FunctionDecl>(D)) {
4356    S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
4357      << A.getRange() << A.getName() << ExpectedFunction;
4358    return;
4359  }
4360
4361  bool IsAudited = (A.getKind() == AttributeList::AT_CFAuditedTransfer);
4362
4363  // Check whether there's a conflicting attribute already present.
4364  Attr *Existing;
4365  if (IsAudited) {
4366    Existing = D->getAttr<CFUnknownTransferAttr>();
4367  } else {
4368    Existing = D->getAttr<CFAuditedTransferAttr>();
4369  }
4370  if (Existing) {
4371    S.Diag(D->getLocStart(), diag::err_attributes_are_not_compatible)
4372      << A.getName()
4373      << (IsAudited ? "cf_unknown_transfer" : "cf_audited_transfer")
4374      << A.getRange() << Existing->getRange();
4375    return;
4376  }
4377
4378  // All clear;  add the attribute.
4379  if (IsAudited) {
4380    D->addAttr(::new (S.Context)
4381               CFAuditedTransferAttr(A.getRange(), S.Context,
4382                                     A.getAttributeSpellingListIndex()));
4383  } else {
4384    D->addAttr(::new (S.Context)
4385               CFUnknownTransferAttr(A.getRange(), S.Context,
4386                                     A.getAttributeSpellingListIndex()));
4387  }
4388}
4389
4390static void handleNSBridgedAttr(Sema &S, Scope *Sc, Decl *D,
4391                                const AttributeList &Attr) {
4392  RecordDecl *RD = dyn_cast<RecordDecl>(D);
4393  if (!RD || RD->isUnion()) {
4394    S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
4395      << Attr.getRange() << Attr.getName() << ExpectedStruct;
4396  }
4397
4398  IdentifierInfo *ParmName = Attr.getParameterName();
4399
4400  // In Objective-C, verify that the type names an Objective-C type.
4401  // We don't want to check this outside of ObjC because people sometimes
4402  // do crazy C declarations of Objective-C types.
4403  if (ParmName && S.getLangOpts().ObjC1) {
4404    // Check for an existing type with this name.
4405    LookupResult R(S, DeclarationName(ParmName), Attr.getParameterLoc(),
4406                   Sema::LookupOrdinaryName);
4407    if (S.LookupName(R, Sc)) {
4408      NamedDecl *Target = R.getFoundDecl();
4409      if (Target && !isa<ObjCInterfaceDecl>(Target)) {
4410        S.Diag(D->getLocStart(), diag::err_ns_bridged_not_interface);
4411        S.Diag(Target->getLocStart(), diag::note_declared_at);
4412      }
4413    }
4414  }
4415
4416  D->addAttr(::new (S.Context)
4417             NSBridgedAttr(Attr.getRange(), S.Context, ParmName,
4418                           Attr.getAttributeSpellingListIndex()));
4419}
4420
4421static void handleObjCOwnershipAttr(Sema &S, Decl *D,
4422                                    const AttributeList &Attr) {
4423  if (hasDeclarator(D)) return;
4424
4425  S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
4426    << Attr.getRange() << Attr.getName() << ExpectedVariable;
4427}
4428
4429static void handleObjCPreciseLifetimeAttr(Sema &S, Decl *D,
4430                                          const AttributeList &Attr) {
4431  if (!isa<VarDecl>(D) && !isa<FieldDecl>(D)) {
4432    S.Diag(D->getLocStart(), diag::err_attribute_wrong_decl_type)
4433      << Attr.getRange() << Attr.getName() << ExpectedVariable;
4434    return;
4435  }
4436
4437  ValueDecl *vd = cast<ValueDecl>(D);
4438  QualType type = vd->getType();
4439
4440  if (!type->isDependentType() &&
4441      !type->isObjCLifetimeType()) {
4442    S.Diag(Attr.getLoc(), diag::err_objc_precise_lifetime_bad_type)
4443      << type;
4444    return;
4445  }
4446
4447  Qualifiers::ObjCLifetime lifetime = type.getObjCLifetime();
4448
4449  // If we have no lifetime yet, check the lifetime we're presumably
4450  // going to infer.
4451  if (lifetime == Qualifiers::OCL_None && !type->isDependentType())
4452    lifetime = type->getObjCARCImplicitLifetime();
4453
4454  switch (lifetime) {
4455  case Qualifiers::OCL_None:
4456    assert(type->isDependentType() &&
4457           "didn't infer lifetime for non-dependent type?");
4458    break;
4459
4460  case Qualifiers::OCL_Weak:   // meaningful
4461  case Qualifiers::OCL_Strong: // meaningful
4462    break;
4463
4464  case Qualifiers::OCL_ExplicitNone:
4465  case Qualifiers::OCL_Autoreleasing:
4466    S.Diag(Attr.getLoc(), diag::warn_objc_precise_lifetime_meaningless)
4467      << (lifetime == Qualifiers::OCL_Autoreleasing);
4468    break;
4469  }
4470
4471  D->addAttr(::new (S.Context)
4472             ObjCPreciseLifetimeAttr(Attr.getRange(), S.Context,
4473                                     Attr.getAttributeSpellingListIndex()));
4474}
4475
4476//===----------------------------------------------------------------------===//
4477// Microsoft specific attribute handlers.
4478//===----------------------------------------------------------------------===//
4479
4480static void handleUuidAttr(Sema &S, Decl *D, const AttributeList &Attr) {
4481  if (S.LangOpts.MicrosoftExt || S.LangOpts.Borland) {
4482    // check the attribute arguments.
4483    if (!checkAttributeNumArgs(S, Attr, 1))
4484      return;
4485
4486    Expr *Arg = Attr.getArg(0);
4487    StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
4488    if (!Str || !Str->isAscii()) {
4489      S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
4490        << "uuid" << 1;
4491      return;
4492    }
4493
4494    StringRef StrRef = Str->getString();
4495
4496    bool IsCurly = StrRef.size() > 1 && StrRef.front() == '{' &&
4497                   StrRef.back() == '}';
4498
4499    // Validate GUID length.
4500    if (IsCurly && StrRef.size() != 38) {
4501      S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
4502      return;
4503    }
4504    if (!IsCurly && StrRef.size() != 36) {
4505      S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
4506      return;
4507    }
4508
4509    // GUID format is "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" or
4510    // "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
4511    StringRef::iterator I = StrRef.begin();
4512    if (IsCurly) // Skip the optional '{'
4513       ++I;
4514
4515    for (int i = 0; i < 36; ++i) {
4516      if (i == 8 || i == 13 || i == 18 || i == 23) {
4517        if (*I != '-') {
4518          S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
4519          return;
4520        }
4521      } else if (!isHexDigit(*I)) {
4522        S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
4523        return;
4524      }
4525      I++;
4526    }
4527
4528    D->addAttr(::new (S.Context)
4529               UuidAttr(Attr.getRange(), S.Context, Str->getString(),
4530                        Attr.getAttributeSpellingListIndex()));
4531  } else
4532    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "uuid";
4533}
4534
4535static void handleInheritanceAttr(Sema &S, Decl *D, const AttributeList &Attr) {
4536  if (!S.LangOpts.MicrosoftExt) {
4537    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
4538    return;
4539  }
4540
4541  AttributeList::Kind Kind = Attr.getKind();
4542  if (Kind == AttributeList::AT_SingleInheritance)
4543    D->addAttr(
4544        ::new (S.Context)
4545               SingleInheritanceAttr(Attr.getRange(), S.Context,
4546                                     Attr.getAttributeSpellingListIndex()));
4547  else if (Kind == AttributeList::AT_MultipleInheritance)
4548    D->addAttr(
4549        ::new (S.Context)
4550               MultipleInheritanceAttr(Attr.getRange(), S.Context,
4551                                       Attr.getAttributeSpellingListIndex()));
4552  else if (Kind == AttributeList::AT_VirtualInheritance)
4553    D->addAttr(
4554        ::new (S.Context)
4555               VirtualInheritanceAttr(Attr.getRange(), S.Context,
4556                                      Attr.getAttributeSpellingListIndex()));
4557}
4558
4559static void handlePortabilityAttr(Sema &S, Decl *D, const AttributeList &Attr) {
4560  if (S.LangOpts.MicrosoftExt) {
4561    AttributeList::Kind Kind = Attr.getKind();
4562    if (Kind == AttributeList::AT_Ptr32)
4563      D->addAttr(
4564          ::new (S.Context) Ptr32Attr(Attr.getRange(), S.Context,
4565                                      Attr.getAttributeSpellingListIndex()));
4566    else if (Kind == AttributeList::AT_Ptr64)
4567      D->addAttr(
4568          ::new (S.Context) Ptr64Attr(Attr.getRange(), S.Context,
4569                                      Attr.getAttributeSpellingListIndex()));
4570    else if (Kind == AttributeList::AT_Win64)
4571      D->addAttr(
4572          ::new (S.Context) Win64Attr(Attr.getRange(), S.Context,
4573                                      Attr.getAttributeSpellingListIndex()));
4574  } else
4575    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
4576}
4577
4578static void handleForceInlineAttr(Sema &S, Decl *D, const AttributeList &Attr) {
4579  if (S.LangOpts.MicrosoftExt)
4580    D->addAttr(::new (S.Context)
4581               ForceInlineAttr(Attr.getRange(), S.Context,
4582                               Attr.getAttributeSpellingListIndex()));
4583  else
4584    S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
4585}
4586
4587//===----------------------------------------------------------------------===//
4588// Top Level Sema Entry Points
4589//===----------------------------------------------------------------------===//
4590
4591static void ProcessNonInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
4592                                          const AttributeList &Attr) {
4593  switch (Attr.getKind()) {
4594  case AttributeList::AT_CUDADevice:  handleDeviceAttr      (S, D, Attr); break;
4595  case AttributeList::AT_CUDAHost:    handleHostAttr        (S, D, Attr); break;
4596  case AttributeList::AT_Overloadable:handleOverloadableAttr(S, D, Attr); break;
4597  default:
4598    break;
4599  }
4600}
4601
4602static void ProcessInheritableDeclAttr(Sema &S, Scope *scope, Decl *D,
4603                                       const AttributeList &Attr) {
4604  switch (Attr.getKind()) {
4605  case AttributeList::AT_IBAction:    handleIBAction(S, D, Attr); break;
4606  case AttributeList::AT_IBOutlet:    handleIBOutlet(S, D, Attr); break;
4607  case AttributeList::AT_IBOutletCollection:
4608    handleIBOutletCollection(S, D, Attr); break;
4609  case AttributeList::AT_AddressSpace:
4610  case AttributeList::AT_OpenCLImageAccess:
4611  case AttributeList::AT_ObjCGC:
4612  case AttributeList::AT_VectorSize:
4613  case AttributeList::AT_NeonVectorType:
4614  case AttributeList::AT_NeonPolyVectorType:
4615    // Ignore these, these are type attributes, handled by
4616    // ProcessTypeAttributes.
4617    break;
4618  case AttributeList::AT_CUDADevice:
4619  case AttributeList::AT_CUDAHost:
4620  case AttributeList::AT_Overloadable:
4621    // Ignore, this is a non-inheritable attribute, handled
4622    // by ProcessNonInheritableDeclAttr.
4623    break;
4624  case AttributeList::AT_Alias:       handleAliasAttr       (S, D, Attr); break;
4625  case AttributeList::AT_Aligned:     handleAlignedAttr     (S, D, Attr); break;
4626  case AttributeList::AT_AllocSize:   handleAllocSizeAttr   (S, D, Attr); break;
4627  case AttributeList::AT_AlwaysInline:
4628    handleAlwaysInlineAttr  (S, D, Attr); break;
4629  case AttributeList::AT_AnalyzerNoReturn:
4630    handleAnalyzerNoReturnAttr  (S, D, Attr); break;
4631  case AttributeList::AT_TLSModel:    handleTLSModelAttr    (S, D, Attr); break;
4632  case AttributeList::AT_Annotate:    handleAnnotateAttr    (S, D, Attr); break;
4633  case AttributeList::AT_Availability:handleAvailabilityAttr(S, D, Attr); break;
4634  case AttributeList::AT_CarriesDependency:
4635    handleDependencyAttr(S, scope, D, Attr);
4636    break;
4637  case AttributeList::AT_Common:      handleCommonAttr      (S, D, Attr); break;
4638  case AttributeList::AT_CUDAConstant:handleConstantAttr    (S, D, Attr); break;
4639  case AttributeList::AT_Constructor: handleConstructorAttr (S, D, Attr); break;
4640  case AttributeList::AT_CXX11NoReturn:
4641    handleCXX11NoReturnAttr(S, D, Attr);
4642    break;
4643  case AttributeList::AT_Deprecated:
4644    handleAttrWithMessage<DeprecatedAttr>(S, D, Attr, "deprecated");
4645    break;
4646  case AttributeList::AT_Destructor:  handleDestructorAttr  (S, D, Attr); break;
4647  case AttributeList::AT_ExtVectorType:
4648    handleExtVectorTypeAttr(S, scope, D, Attr);
4649    break;
4650  case AttributeList::AT_MinSize:
4651    handleMinSizeAttr(S, D, Attr);
4652    break;
4653  case AttributeList::AT_Format:      handleFormatAttr      (S, D, Attr); break;
4654  case AttributeList::AT_FormatArg:   handleFormatArgAttr   (S, D, Attr); break;
4655  case AttributeList::AT_CUDAGlobal:  handleGlobalAttr      (S, D, Attr); break;
4656  case AttributeList::AT_GNUInline:   handleGNUInlineAttr   (S, D, Attr); break;
4657  case AttributeList::AT_CUDALaunchBounds:
4658    handleLaunchBoundsAttr(S, D, Attr);
4659    break;
4660  case AttributeList::AT_Mode:        handleModeAttr        (S, D, Attr); break;
4661  case AttributeList::AT_Malloc:      handleMallocAttr      (S, D, Attr); break;
4662  case AttributeList::AT_MayAlias:    handleMayAliasAttr    (S, D, Attr); break;
4663  case AttributeList::AT_NoCommon:    handleNoCommonAttr    (S, D, Attr); break;
4664  case AttributeList::AT_NonNull:     handleNonNullAttr     (S, D, Attr); break;
4665  case AttributeList::AT_ownership_returns:
4666  case AttributeList::AT_ownership_takes:
4667  case AttributeList::AT_ownership_holds:
4668      handleOwnershipAttr     (S, D, Attr); break;
4669  case AttributeList::AT_Cold:        handleColdAttr        (S, D, Attr); break;
4670  case AttributeList::AT_Hot:         handleHotAttr         (S, D, Attr); break;
4671  case AttributeList::AT_Naked:       handleNakedAttr       (S, D, Attr); break;
4672  case AttributeList::AT_NoReturn:    handleNoReturnAttr    (S, D, Attr); break;
4673  case AttributeList::AT_NoThrow:     handleNothrowAttr     (S, D, Attr); break;
4674  case AttributeList::AT_CUDAShared:  handleSharedAttr      (S, D, Attr); break;
4675  case AttributeList::AT_VecReturn:   handleVecReturnAttr   (S, D, Attr); break;
4676
4677  case AttributeList::AT_ObjCOwnership:
4678    handleObjCOwnershipAttr(S, D, Attr); break;
4679  case AttributeList::AT_ObjCPreciseLifetime:
4680    handleObjCPreciseLifetimeAttr(S, D, Attr); break;
4681
4682  case AttributeList::AT_ObjCReturnsInnerPointer:
4683    handleObjCReturnsInnerPointerAttr(S, D, Attr); break;
4684
4685  case AttributeList::AT_ObjCRequiresSuper:
4686      handleObjCRequiresSuperAttr(S, D, Attr); break;
4687
4688  case AttributeList::AT_NSBridged:
4689    handleNSBridgedAttr(S, scope, D, Attr); break;
4690
4691  case AttributeList::AT_CFAuditedTransfer:
4692  case AttributeList::AT_CFUnknownTransfer:
4693    handleCFTransferAttr(S, D, Attr); break;
4694
4695  // Checker-specific.
4696  case AttributeList::AT_CFConsumed:
4697  case AttributeList::AT_NSConsumed:  handleNSConsumedAttr  (S, D, Attr); break;
4698  case AttributeList::AT_NSConsumesSelf:
4699    handleNSConsumesSelfAttr(S, D, Attr); break;
4700
4701  case AttributeList::AT_NSReturnsAutoreleased:
4702  case AttributeList::AT_NSReturnsNotRetained:
4703  case AttributeList::AT_CFReturnsNotRetained:
4704  case AttributeList::AT_NSReturnsRetained:
4705  case AttributeList::AT_CFReturnsRetained:
4706    handleNSReturnsRetainedAttr(S, D, Attr); break;
4707
4708  case AttributeList::AT_WorkGroupSizeHint:
4709  case AttributeList::AT_ReqdWorkGroupSize:
4710    handleWorkGroupSize(S, D, Attr); break;
4711
4712  case AttributeList::AT_InitPriority:
4713      handleInitPriorityAttr(S, D, Attr); break;
4714
4715  case AttributeList::AT_Packed:      handlePackedAttr      (S, D, Attr); break;
4716  case AttributeList::AT_Section:     handleSectionAttr     (S, D, Attr); break;
4717  case AttributeList::AT_Unavailable:
4718    handleAttrWithMessage<UnavailableAttr>(S, D, Attr, "unavailable");
4719    break;
4720  case AttributeList::AT_ArcWeakrefUnavailable:
4721    handleArcWeakrefUnavailableAttr (S, D, Attr);
4722    break;
4723  case AttributeList::AT_ObjCRootClass:
4724    handleObjCRootClassAttr(S, D, Attr);
4725    break;
4726  case AttributeList::AT_ObjCRequiresPropertyDefs:
4727    handleObjCRequiresPropertyDefsAttr (S, D, Attr);
4728    break;
4729  case AttributeList::AT_Unused:      handleUnusedAttr      (S, D, Attr); break;
4730  case AttributeList::AT_ReturnsTwice:
4731    handleReturnsTwiceAttr(S, D, Attr);
4732    break;
4733  case AttributeList::AT_Used:        handleUsedAttr        (S, D, Attr); break;
4734  case AttributeList::AT_Visibility:
4735    handleVisibilityAttr(S, D, Attr, false);
4736    break;
4737  case AttributeList::AT_TypeVisibility:
4738    handleVisibilityAttr(S, D, Attr, true);
4739    break;
4740  case AttributeList::AT_WarnUnusedResult: handleWarnUnusedResult(S, D, Attr);
4741    break;
4742  case AttributeList::AT_Weak:        handleWeakAttr        (S, D, Attr); break;
4743  case AttributeList::AT_WeakRef:     handleWeakRefAttr     (S, D, Attr); break;
4744  case AttributeList::AT_WeakImport:  handleWeakImportAttr  (S, D, Attr); break;
4745  case AttributeList::AT_TransparentUnion:
4746    handleTransparentUnionAttr(S, D, Attr);
4747    break;
4748  case AttributeList::AT_ObjCException:
4749    handleObjCExceptionAttr(S, D, Attr);
4750    break;
4751  case AttributeList::AT_ObjCMethodFamily:
4752    handleObjCMethodFamilyAttr(S, D, Attr);
4753    break;
4754  case AttributeList::AT_ObjCNSObject:handleObjCNSObject    (S, D, Attr); break;
4755  case AttributeList::AT_Blocks:      handleBlocksAttr      (S, D, Attr); break;
4756  case AttributeList::AT_Sentinel:    handleSentinelAttr    (S, D, Attr); break;
4757  case AttributeList::AT_Const:       handleConstAttr       (S, D, Attr); break;
4758  case AttributeList::AT_Pure:        handlePureAttr        (S, D, Attr); break;
4759  case AttributeList::AT_Cleanup:     handleCleanupAttr     (S, D, Attr); break;
4760  case AttributeList::AT_NoDebug:     handleNoDebugAttr     (S, D, Attr); break;
4761  case AttributeList::AT_NoInline:    handleNoInlineAttr    (S, D, Attr); break;
4762  case AttributeList::AT_Regparm:     handleRegparmAttr     (S, D, Attr); break;
4763  case AttributeList::IgnoredAttribute:
4764    // Just ignore
4765    break;
4766  case AttributeList::AT_NoInstrumentFunction:  // Interacts with -pg.
4767    handleNoInstrumentFunctionAttr(S, D, Attr);
4768    break;
4769  case AttributeList::AT_StdCall:
4770  case AttributeList::AT_CDecl:
4771  case AttributeList::AT_FastCall:
4772  case AttributeList::AT_ThisCall:
4773  case AttributeList::AT_Pascal:
4774  case AttributeList::AT_Pcs:
4775  case AttributeList::AT_PnaclCall:
4776  case AttributeList::AT_IntelOclBicc:
4777    handleCallConvAttr(S, D, Attr);
4778    break;
4779  case AttributeList::AT_OpenCLKernel:
4780    handleOpenCLKernelAttr(S, D, Attr);
4781    break;
4782
4783  // Microsoft attributes:
4784  case AttributeList::AT_MsStruct:
4785    handleMsStructAttr(S, D, Attr);
4786    break;
4787  case AttributeList::AT_Uuid:
4788    handleUuidAttr(S, D, Attr);
4789    break;
4790  case AttributeList::AT_SingleInheritance:
4791  case AttributeList::AT_MultipleInheritance:
4792  case AttributeList::AT_VirtualInheritance:
4793    handleInheritanceAttr(S, D, Attr);
4794    break;
4795  case AttributeList::AT_Win64:
4796  case AttributeList::AT_Ptr32:
4797  case AttributeList::AT_Ptr64:
4798    handlePortabilityAttr(S, D, Attr);
4799    break;
4800  case AttributeList::AT_ForceInline:
4801    handleForceInlineAttr(S, D, Attr);
4802    break;
4803
4804  // Thread safety attributes:
4805  case AttributeList::AT_GuardedVar:
4806    handleGuardedVarAttr(S, D, Attr);
4807    break;
4808  case AttributeList::AT_PtGuardedVar:
4809    handlePtGuardedVarAttr(S, D, Attr);
4810    break;
4811  case AttributeList::AT_ScopedLockable:
4812    handleScopedLockableAttr(S, D, Attr);
4813    break;
4814  case AttributeList::AT_NoAddressSafetyAnalysis:
4815    handleNoAddressSafetyAttr(S, D, Attr);
4816    break;
4817  case AttributeList::AT_NoThreadSafetyAnalysis:
4818    handleNoThreadSafetyAttr(S, D, Attr);
4819    break;
4820  case AttributeList::AT_Lockable:
4821    handleLockableAttr(S, D, Attr);
4822    break;
4823  case AttributeList::AT_GuardedBy:
4824    handleGuardedByAttr(S, D, Attr);
4825    break;
4826  case AttributeList::AT_PtGuardedBy:
4827    handlePtGuardedByAttr(S, D, Attr);
4828    break;
4829  case AttributeList::AT_ExclusiveLockFunction:
4830    handleExclusiveLockFunctionAttr(S, D, Attr);
4831    break;
4832  case AttributeList::AT_ExclusiveLocksRequired:
4833    handleExclusiveLocksRequiredAttr(S, D, Attr);
4834    break;
4835  case AttributeList::AT_ExclusiveTrylockFunction:
4836    handleExclusiveTrylockFunctionAttr(S, D, Attr);
4837    break;
4838  case AttributeList::AT_LockReturned:
4839    handleLockReturnedAttr(S, D, Attr);
4840    break;
4841  case AttributeList::AT_LocksExcluded:
4842    handleLocksExcludedAttr(S, D, Attr);
4843    break;
4844  case AttributeList::AT_SharedLockFunction:
4845    handleSharedLockFunctionAttr(S, D, Attr);
4846    break;
4847  case AttributeList::AT_SharedLocksRequired:
4848    handleSharedLocksRequiredAttr(S, D, Attr);
4849    break;
4850  case AttributeList::AT_SharedTrylockFunction:
4851    handleSharedTrylockFunctionAttr(S, D, Attr);
4852    break;
4853  case AttributeList::AT_UnlockFunction:
4854    handleUnlockFunAttr(S, D, Attr);
4855    break;
4856  case AttributeList::AT_AcquiredBefore:
4857    handleAcquiredBeforeAttr(S, D, Attr);
4858    break;
4859  case AttributeList::AT_AcquiredAfter:
4860    handleAcquiredAfterAttr(S, D, Attr);
4861    break;
4862
4863  // Type safety attributes.
4864  case AttributeList::AT_ArgumentWithTypeTag:
4865    handleArgumentWithTypeTagAttr(S, D, Attr);
4866    break;
4867  case AttributeList::AT_TypeTagForDatatype:
4868    handleTypeTagForDatatypeAttr(S, D, Attr);
4869    break;
4870
4871  default:
4872    // Ask target about the attribute.
4873    const TargetAttributesSema &TargetAttrs = S.getTargetAttributesSema();
4874    if (!TargetAttrs.ProcessDeclAttribute(scope, D, Attr, S))
4875      S.Diag(Attr.getLoc(), Attr.isDeclspecAttribute() ?
4876             diag::warn_unhandled_ms_attribute_ignored :
4877             diag::warn_unknown_attribute_ignored) << Attr.getName();
4878    break;
4879  }
4880}
4881
4882/// ProcessDeclAttribute - Apply the specific attribute to the specified decl if
4883/// the attribute applies to decls.  If the attribute is a type attribute, just
4884/// silently ignore it if a GNU attribute.
4885static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
4886                                 const AttributeList &Attr,
4887                                 bool NonInheritable, bool Inheritable,
4888                                 bool IncludeCXX11Attributes) {
4889  if (Attr.isInvalid())
4890    return;
4891
4892  // Ignore C++11 attributes on declarator chunks: they appertain to the type
4893  // instead.
4894  if (Attr.isCXX11Attribute() && !IncludeCXX11Attributes)
4895    return;
4896
4897  if (NonInheritable)
4898    ProcessNonInheritableDeclAttr(S, scope, D, Attr);
4899
4900  if (Inheritable)
4901    ProcessInheritableDeclAttr(S, scope, D, Attr);
4902}
4903
4904/// ProcessDeclAttributeList - Apply all the decl attributes in the specified
4905/// attribute list to the specified decl, ignoring any type attributes.
4906void Sema::ProcessDeclAttributeList(Scope *S, Decl *D,
4907                                    const AttributeList *AttrList,
4908                                    bool NonInheritable, bool Inheritable,
4909                                    bool IncludeCXX11Attributes) {
4910  for (const AttributeList* l = AttrList; l; l = l->getNext())
4911    ProcessDeclAttribute(*this, S, D, *l, NonInheritable, Inheritable,
4912                         IncludeCXX11Attributes);
4913
4914  // GCC accepts
4915  // static int a9 __attribute__((weakref));
4916  // but that looks really pointless. We reject it.
4917  if (Inheritable && D->hasAttr<WeakRefAttr>() && !D->hasAttr<AliasAttr>()) {
4918    Diag(AttrList->getLoc(), diag::err_attribute_weakref_without_alias) <<
4919    cast<NamedDecl>(D)->getNameAsString();
4920    D->dropAttr<WeakRefAttr>();
4921    return;
4922  }
4923}
4924
4925// Annotation attributes are the only attributes allowed after an access
4926// specifier.
4927bool Sema::ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl,
4928                                          const AttributeList *AttrList) {
4929  for (const AttributeList* l = AttrList; l; l = l->getNext()) {
4930    if (l->getKind() == AttributeList::AT_Annotate) {
4931      handleAnnotateAttr(*this, ASDecl, *l);
4932    } else {
4933      Diag(l->getLoc(), diag::err_only_annotate_after_access_spec);
4934      return true;
4935    }
4936  }
4937
4938  return false;
4939}
4940
4941/// checkUnusedDeclAttributes - Check a list of attributes to see if it
4942/// contains any decl attributes that we should warn about.
4943static void checkUnusedDeclAttributes(Sema &S, const AttributeList *A) {
4944  for ( ; A; A = A->getNext()) {
4945    // Only warn if the attribute is an unignored, non-type attribute.
4946    if (A->isUsedAsTypeAttr() || A->isInvalid()) continue;
4947    if (A->getKind() == AttributeList::IgnoredAttribute) continue;
4948
4949    if (A->getKind() == AttributeList::UnknownAttribute) {
4950      S.Diag(A->getLoc(), diag::warn_unknown_attribute_ignored)
4951        << A->getName() << A->getRange();
4952    } else {
4953      S.Diag(A->getLoc(), diag::warn_attribute_not_on_decl)
4954        << A->getName() << A->getRange();
4955    }
4956  }
4957}
4958
4959/// checkUnusedDeclAttributes - Given a declarator which is not being
4960/// used to build a declaration, complain about any decl attributes
4961/// which might be lying around on it.
4962void Sema::checkUnusedDeclAttributes(Declarator &D) {
4963  ::checkUnusedDeclAttributes(*this, D.getDeclSpec().getAttributes().getList());
4964  ::checkUnusedDeclAttributes(*this, D.getAttributes());
4965  for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i)
4966    ::checkUnusedDeclAttributes(*this, D.getTypeObject(i).getAttrs());
4967}
4968
4969/// DeclClonePragmaWeak - clone existing decl (maybe definition),
4970/// \#pragma weak needs a non-definition decl and source may not have one.
4971NamedDecl * Sema::DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II,
4972                                      SourceLocation Loc) {
4973  assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
4974  NamedDecl *NewD = 0;
4975  if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
4976    FunctionDecl *NewFD;
4977    // FIXME: Missing call to CheckFunctionDeclaration().
4978    // FIXME: Mangling?
4979    // FIXME: Is the qualifier info correct?
4980    // FIXME: Is the DeclContext correct?
4981    NewFD = FunctionDecl::Create(FD->getASTContext(), FD->getDeclContext(),
4982                                 Loc, Loc, DeclarationName(II),
4983                                 FD->getType(), FD->getTypeSourceInfo(),
4984                                 SC_None, SC_None,
4985                                 false/*isInlineSpecified*/,
4986                                 FD->hasPrototype(),
4987                                 false/*isConstexprSpecified*/);
4988    NewD = NewFD;
4989
4990    if (FD->getQualifier())
4991      NewFD->setQualifierInfo(FD->getQualifierLoc());
4992
4993    // Fake up parameter variables; they are declared as if this were
4994    // a typedef.
4995    QualType FDTy = FD->getType();
4996    if (const FunctionProtoType *FT = FDTy->getAs<FunctionProtoType>()) {
4997      SmallVector<ParmVarDecl*, 16> Params;
4998      for (FunctionProtoType::arg_type_iterator AI = FT->arg_type_begin(),
4999           AE = FT->arg_type_end(); AI != AE; ++AI) {
5000        ParmVarDecl *Param = BuildParmVarDeclForTypedef(NewFD, Loc, *AI);
5001        Param->setScopeInfo(0, Params.size());
5002        Params.push_back(Param);
5003      }
5004      NewFD->setParams(Params);
5005    }
5006  } else if (VarDecl *VD = dyn_cast<VarDecl>(ND)) {
5007    NewD = VarDecl::Create(VD->getASTContext(), VD->getDeclContext(),
5008                           VD->getInnerLocStart(), VD->getLocation(), II,
5009                           VD->getType(), VD->getTypeSourceInfo(),
5010                           VD->getStorageClass(),
5011                           VD->getStorageClassAsWritten());
5012    if (VD->getQualifier()) {
5013      VarDecl *NewVD = cast<VarDecl>(NewD);
5014      NewVD->setQualifierInfo(VD->getQualifierLoc());
5015    }
5016  }
5017  return NewD;
5018}
5019
5020/// DeclApplyPragmaWeak - A declaration (maybe definition) needs \#pragma weak
5021/// applied to it, possibly with an alias.
5022void Sema::DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, WeakInfo &W) {
5023  if (W.getUsed()) return; // only do this once
5024  W.setUsed(true);
5025  if (W.getAlias()) { // clone decl, impersonate __attribute(weak,alias(...))
5026    IdentifierInfo *NDId = ND->getIdentifier();
5027    NamedDecl *NewD = DeclClonePragmaWeak(ND, W.getAlias(), W.getLocation());
5028    NewD->addAttr(::new (Context) AliasAttr(W.getLocation(), Context,
5029                                            NDId->getName()));
5030    NewD->addAttr(::new (Context) WeakAttr(W.getLocation(), Context));
5031    WeakTopLevelDecl.push_back(NewD);
5032    // FIXME: "hideous" code from Sema::LazilyCreateBuiltin
5033    // to insert Decl at TU scope, sorry.
5034    DeclContext *SavedContext = CurContext;
5035    CurContext = Context.getTranslationUnitDecl();
5036    PushOnScopeChains(NewD, S);
5037    CurContext = SavedContext;
5038  } else { // just add weak to existing
5039    ND->addAttr(::new (Context) WeakAttr(W.getLocation(), Context));
5040  }
5041}
5042
5043/// ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in
5044/// it, apply them to D.  This is a bit tricky because PD can have attributes
5045/// specified in many different places, and we need to find and apply them all.
5046void Sema::ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD,
5047                                 bool NonInheritable, bool Inheritable) {
5048  // It's valid to "forward-declare" #pragma weak, in which case we
5049  // have to do this.
5050  if (Inheritable) {
5051    LoadExternalWeakUndeclaredIdentifiers();
5052    if (!WeakUndeclaredIdentifiers.empty()) {
5053      if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
5054        if (IdentifierInfo *Id = ND->getIdentifier()) {
5055          llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator I
5056            = WeakUndeclaredIdentifiers.find(Id);
5057          if (I != WeakUndeclaredIdentifiers.end() && ND->hasLinkage()) {
5058            WeakInfo W = I->second;
5059            DeclApplyPragmaWeak(S, ND, W);
5060            WeakUndeclaredIdentifiers[Id] = W;
5061          }
5062        }
5063      }
5064    }
5065  }
5066
5067  // Apply decl attributes from the DeclSpec if present.
5068  if (const AttributeList *Attrs = PD.getDeclSpec().getAttributes().getList())
5069    ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
5070
5071  // Walk the declarator structure, applying decl attributes that were in a type
5072  // position to the decl itself.  This handles cases like:
5073  //   int *__attr__(x)** D;
5074  // when X is a decl attribute.
5075  for (unsigned i = 0, e = PD.getNumTypeObjects(); i != e; ++i)
5076    if (const AttributeList *Attrs = PD.getTypeObject(i).getAttrs())
5077      ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable,
5078                               /*IncludeCXX11Attributes=*/false);
5079
5080  // Finally, apply any attributes on the decl itself.
5081  if (const AttributeList *Attrs = PD.getAttributes())
5082    ProcessDeclAttributeList(S, D, Attrs, NonInheritable, Inheritable);
5083}
5084
5085/// Is the given declaration allowed to use a forbidden type?
5086static bool isForbiddenTypeAllowed(Sema &S, Decl *decl) {
5087  // Private ivars are always okay.  Unfortunately, people don't
5088  // always properly make their ivars private, even in system headers.
5089  // Plus we need to make fields okay, too.
5090  // Function declarations in sys headers will be marked unavailable.
5091  if (!isa<FieldDecl>(decl) && !isa<ObjCPropertyDecl>(decl) &&
5092      !isa<FunctionDecl>(decl))
5093    return false;
5094
5095  // Require it to be declared in a system header.
5096  return S.Context.getSourceManager().isInSystemHeader(decl->getLocation());
5097}
5098
5099/// Handle a delayed forbidden-type diagnostic.
5100static void handleDelayedForbiddenType(Sema &S, DelayedDiagnostic &diag,
5101                                       Decl *decl) {
5102  if (decl && isForbiddenTypeAllowed(S, decl)) {
5103    decl->addAttr(new (S.Context) UnavailableAttr(diag.Loc, S.Context,
5104                        "this system declaration uses an unsupported type"));
5105    return;
5106  }
5107  if (S.getLangOpts().ObjCAutoRefCount)
5108    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(decl)) {
5109      // FIXME: we may want to suppress diagnostics for all
5110      // kind of forbidden type messages on unavailable functions.
5111      if (FD->hasAttr<UnavailableAttr>() &&
5112          diag.getForbiddenTypeDiagnostic() ==
5113          diag::err_arc_array_param_no_ownership) {
5114        diag.Triggered = true;
5115        return;
5116      }
5117    }
5118
5119  S.Diag(diag.Loc, diag.getForbiddenTypeDiagnostic())
5120    << diag.getForbiddenTypeOperand() << diag.getForbiddenTypeArgument();
5121  diag.Triggered = true;
5122}
5123
5124void Sema::PopParsingDeclaration(ParsingDeclState state, Decl *decl) {
5125  assert(DelayedDiagnostics.getCurrentPool());
5126  DelayedDiagnosticPool &poppedPool = *DelayedDiagnostics.getCurrentPool();
5127  DelayedDiagnostics.popWithoutEmitting(state);
5128
5129  // When delaying diagnostics to run in the context of a parsed
5130  // declaration, we only want to actually emit anything if parsing
5131  // succeeds.
5132  if (!decl) return;
5133
5134  // We emit all the active diagnostics in this pool or any of its
5135  // parents.  In general, we'll get one pool for the decl spec
5136  // and a child pool for each declarator; in a decl group like:
5137  //   deprecated_typedef foo, *bar, baz();
5138  // only the declarator pops will be passed decls.  This is correct;
5139  // we really do need to consider delayed diagnostics from the decl spec
5140  // for each of the different declarations.
5141  const DelayedDiagnosticPool *pool = &poppedPool;
5142  do {
5143    for (DelayedDiagnosticPool::pool_iterator
5144           i = pool->pool_begin(), e = pool->pool_end(); i != e; ++i) {
5145      // This const_cast is a bit lame.  Really, Triggered should be mutable.
5146      DelayedDiagnostic &diag = const_cast<DelayedDiagnostic&>(*i);
5147      if (diag.Triggered)
5148        continue;
5149
5150      switch (diag.Kind) {
5151      case DelayedDiagnostic::Deprecation:
5152        // Don't bother giving deprecation diagnostics if the decl is invalid.
5153        if (!decl->isInvalidDecl())
5154          HandleDelayedDeprecationCheck(diag, decl);
5155        break;
5156
5157      case DelayedDiagnostic::Access:
5158        HandleDelayedAccessCheck(diag, decl);
5159        break;
5160
5161      case DelayedDiagnostic::ForbiddenType:
5162        handleDelayedForbiddenType(*this, diag, decl);
5163        break;
5164      }
5165    }
5166  } while ((pool = pool->getParent()));
5167}
5168
5169/// Given a set of delayed diagnostics, re-emit them as if they had
5170/// been delayed in the current context instead of in the given pool.
5171/// Essentially, this just moves them to the current pool.
5172void Sema::redelayDiagnostics(DelayedDiagnosticPool &pool) {
5173  DelayedDiagnosticPool *curPool = DelayedDiagnostics.getCurrentPool();
5174  assert(curPool && "re-emitting in undelayed context not supported");
5175  curPool->steal(pool);
5176}
5177
5178static bool isDeclDeprecated(Decl *D) {
5179  do {
5180    if (D->isDeprecated())
5181      return true;
5182    // A category implicitly has the availability of the interface.
5183    if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(D))
5184      return CatD->getClassInterface()->isDeprecated();
5185  } while ((D = cast_or_null<Decl>(D->getDeclContext())));
5186  return false;
5187}
5188
5189static void
5190DoEmitDeprecationWarning(Sema &S, const NamedDecl *D, StringRef Message,
5191                         SourceLocation Loc,
5192                         const ObjCInterfaceDecl *UnknownObjCClass,
5193                         const ObjCPropertyDecl *ObjCPropery) {
5194  DeclarationName Name = D->getDeclName();
5195  if (!Message.empty()) {
5196    S.Diag(Loc, diag::warn_deprecated_message) << Name << Message;
5197    S.Diag(D->getLocation(),
5198           isa<ObjCMethodDecl>(D) ? diag::note_method_declared_at
5199                                  : diag::note_previous_decl) << Name;
5200    if (ObjCPropery)
5201      S.Diag(ObjCPropery->getLocation(), diag::note_property_attribute)
5202        << ObjCPropery->getDeclName() << 0;
5203  } else if (!UnknownObjCClass) {
5204    S.Diag(Loc, diag::warn_deprecated) << D->getDeclName();
5205    S.Diag(D->getLocation(),
5206           isa<ObjCMethodDecl>(D) ? diag::note_method_declared_at
5207                                  : diag::note_previous_decl) << Name;
5208    if (ObjCPropery)
5209      S.Diag(ObjCPropery->getLocation(), diag::note_property_attribute)
5210        << ObjCPropery->getDeclName() << 0;
5211  } else {
5212    S.Diag(Loc, diag::warn_deprecated_fwdclass_message) << Name;
5213    S.Diag(UnknownObjCClass->getLocation(), diag::note_forward_class);
5214  }
5215}
5216
5217void Sema::HandleDelayedDeprecationCheck(DelayedDiagnostic &DD,
5218                                         Decl *Ctx) {
5219  if (isDeclDeprecated(Ctx))
5220    return;
5221
5222  DD.Triggered = true;
5223  DoEmitDeprecationWarning(*this, DD.getDeprecationDecl(),
5224                           DD.getDeprecationMessage(), DD.Loc,
5225                           DD.getUnknownObjCClass(),
5226                           DD.getObjCProperty());
5227}
5228
5229void Sema::EmitDeprecationWarning(NamedDecl *D, StringRef Message,
5230                                  SourceLocation Loc,
5231                                  const ObjCInterfaceDecl *UnknownObjCClass,
5232                                  const ObjCPropertyDecl  *ObjCProperty) {
5233  // Delay if we're currently parsing a declaration.
5234  if (DelayedDiagnostics.shouldDelayDiagnostics()) {
5235    DelayedDiagnostics.add(DelayedDiagnostic::makeDeprecation(Loc, D,
5236                                                              UnknownObjCClass,
5237                                                              ObjCProperty,
5238                                                              Message));
5239    return;
5240  }
5241
5242  // Otherwise, don't warn if our current context is deprecated.
5243  if (isDeclDeprecated(cast<Decl>(getCurLexicalContext())))
5244    return;
5245  DoEmitDeprecationWarning(*this, D, Message, Loc, UnknownObjCClass, ObjCProperty);
5246}
5247