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