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