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