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