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