1//===--- Decl.cpp - Declaration AST Node Implementation -------------------===// 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 the Decl subclasses. 11// 12//===----------------------------------------------------------------------===// 13 14#include "clang/AST/Decl.h" 15#include "clang/AST/ASTContext.h" 16#include "clang/AST/ASTMutationListener.h" 17#include "clang/AST/Attr.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/ExprCXX.h" 23#include "clang/AST/PrettyPrinter.h" 24#include "clang/AST/Stmt.h" 25#include "clang/AST/TypeLoc.h" 26#include "clang/Basic/Builtins.h" 27#include "clang/Basic/IdentifierTable.h" 28#include "clang/Basic/Module.h" 29#include "clang/Basic/Specifiers.h" 30#include "clang/Basic/TargetInfo.h" 31#include "llvm/Support/ErrorHandling.h" 32#include "llvm/Support/type_traits.h" 33#include <algorithm> 34 35using namespace clang; 36 37//===----------------------------------------------------------------------===// 38// NamedDecl Implementation 39//===----------------------------------------------------------------------===// 40 41// Visibility rules aren't rigorously externally specified, but here 42// are the basic principles behind what we implement: 43// 44// 1. An explicit visibility attribute is generally a direct expression 45// of the user's intent and should be honored. Only the innermost 46// visibility attribute applies. If no visibility attribute applies, 47// global visibility settings are considered. 48// 49// 2. There is one caveat to the above: on or in a template pattern, 50// an explicit visibility attribute is just a default rule, and 51// visibility can be decreased by the visibility of template 52// arguments. But this, too, has an exception: an attribute on an 53// explicit specialization or instantiation causes all the visibility 54// restrictions of the template arguments to be ignored. 55// 56// 3. A variable that does not otherwise have explicit visibility can 57// be restricted by the visibility of its type. 58// 59// 4. A visibility restriction is explicit if it comes from an 60// attribute (or something like it), not a global visibility setting. 61// When emitting a reference to an external symbol, visibility 62// restrictions are ignored unless they are explicit. 63// 64// 5. When computing the visibility of a non-type, including a 65// non-type member of a class, only non-type visibility restrictions 66// are considered: the 'visibility' attribute, global value-visibility 67// settings, and a few special cases like __private_extern. 68// 69// 6. When computing the visibility of a type, including a type member 70// of a class, only type visibility restrictions are considered: 71// the 'type_visibility' attribute and global type-visibility settings. 72// However, a 'visibility' attribute counts as a 'type_visibility' 73// attribute on any declaration that only has the former. 74// 75// The visibility of a "secondary" entity, like a template argument, 76// is computed using the kind of that entity, not the kind of the 77// primary entity for which we are computing visibility. For example, 78// the visibility of a specialization of either of these templates: 79// template <class T, bool (&compare)(T, X)> bool has_match(list<T>, X); 80// template <class T, bool (&compare)(T, X)> class matcher; 81// is restricted according to the type visibility of the argument 'T', 82// the type visibility of 'bool(&)(T,X)', and the value visibility of 83// the argument function 'compare'. That 'has_match' is a value 84// and 'matcher' is a type only matters when looking for attributes 85// and settings from the immediate context. 86 87const unsigned IgnoreExplicitVisibilityBit = 2; 88const unsigned IgnoreAllVisibilityBit = 4; 89 90/// Kinds of LV computation. The linkage side of the computation is 91/// always the same, but different things can change how visibility is 92/// computed. 93enum LVComputationKind { 94 /// Do an LV computation for, ultimately, a type. 95 /// Visibility may be restricted by type visibility settings and 96 /// the visibility of template arguments. 97 LVForType = NamedDecl::VisibilityForType, 98 99 /// Do an LV computation for, ultimately, a non-type declaration. 100 /// Visibility may be restricted by value visibility settings and 101 /// the visibility of template arguments. 102 LVForValue = NamedDecl::VisibilityForValue, 103 104 /// Do an LV computation for, ultimately, a type that already has 105 /// some sort of explicit visibility. Visibility may only be 106 /// restricted by the visibility of template arguments. 107 LVForExplicitType = (LVForType | IgnoreExplicitVisibilityBit), 108 109 /// Do an LV computation for, ultimately, a non-type declaration 110 /// that already has some sort of explicit visibility. Visibility 111 /// may only be restricted by the visibility of template arguments. 112 LVForExplicitValue = (LVForValue | IgnoreExplicitVisibilityBit), 113 114 /// Do an LV computation when we only care about the linkage. 115 LVForLinkageOnly = 116 LVForValue | IgnoreExplicitVisibilityBit | IgnoreAllVisibilityBit 117}; 118 119/// Does this computation kind permit us to consider additional 120/// visibility settings from attributes and the like? 121static bool hasExplicitVisibilityAlready(LVComputationKind computation) { 122 return ((unsigned(computation) & IgnoreExplicitVisibilityBit) != 0); 123} 124 125/// Given an LVComputationKind, return one of the same type/value sort 126/// that records that it already has explicit visibility. 127static LVComputationKind 128withExplicitVisibilityAlready(LVComputationKind oldKind) { 129 LVComputationKind newKind = 130 static_cast<LVComputationKind>(unsigned(oldKind) | 131 IgnoreExplicitVisibilityBit); 132 assert(oldKind != LVForType || newKind == LVForExplicitType); 133 assert(oldKind != LVForValue || newKind == LVForExplicitValue); 134 assert(oldKind != LVForExplicitType || newKind == LVForExplicitType); 135 assert(oldKind != LVForExplicitValue || newKind == LVForExplicitValue); 136 return newKind; 137} 138 139static Optional<Visibility> getExplicitVisibility(const NamedDecl *D, 140 LVComputationKind kind) { 141 assert(!hasExplicitVisibilityAlready(kind) && 142 "asking for explicit visibility when we shouldn't be"); 143 return D->getExplicitVisibility((NamedDecl::ExplicitVisibilityKind) kind); 144} 145 146/// Is the given declaration a "type" or a "value" for the purposes of 147/// visibility computation? 148static bool usesTypeVisibility(const NamedDecl *D) { 149 return isa<TypeDecl>(D) || 150 isa<ClassTemplateDecl>(D) || 151 isa<ObjCInterfaceDecl>(D); 152} 153 154/// Does the given declaration have member specialization information, 155/// and if so, is it an explicit specialization? 156template <class T> static typename 157llvm::enable_if_c<!llvm::is_base_of<RedeclarableTemplateDecl, T>::value, 158 bool>::type 159isExplicitMemberSpecialization(const T *D) { 160 if (const MemberSpecializationInfo *member = 161 D->getMemberSpecializationInfo()) { 162 return member->isExplicitSpecialization(); 163 } 164 return false; 165} 166 167/// For templates, this question is easier: a member template can't be 168/// explicitly instantiated, so there's a single bit indicating whether 169/// or not this is an explicit member specialization. 170static bool isExplicitMemberSpecialization(const RedeclarableTemplateDecl *D) { 171 return D->isMemberSpecialization(); 172} 173 174/// Given a visibility attribute, return the explicit visibility 175/// associated with it. 176template <class T> 177static Visibility getVisibilityFromAttr(const T *attr) { 178 switch (attr->getVisibility()) { 179 case T::Default: 180 return DefaultVisibility; 181 case T::Hidden: 182 return HiddenVisibility; 183 case T::Protected: 184 return ProtectedVisibility; 185 } 186 llvm_unreachable("bad visibility kind"); 187} 188 189/// Return the explicit visibility of the given declaration. 190static Optional<Visibility> getVisibilityOf(const NamedDecl *D, 191 NamedDecl::ExplicitVisibilityKind kind) { 192 // If we're ultimately computing the visibility of a type, look for 193 // a 'type_visibility' attribute before looking for 'visibility'. 194 if (kind == NamedDecl::VisibilityForType) { 195 if (const TypeVisibilityAttr *A = D->getAttr<TypeVisibilityAttr>()) { 196 return getVisibilityFromAttr(A); 197 } 198 } 199 200 // If this declaration has an explicit visibility attribute, use it. 201 if (const VisibilityAttr *A = D->getAttr<VisibilityAttr>()) { 202 return getVisibilityFromAttr(A); 203 } 204 205 // If we're on Mac OS X, an 'availability' for Mac OS X attribute 206 // implies visibility(default). 207 if (D->getASTContext().getTargetInfo().getTriple().isOSDarwin()) { 208 for (specific_attr_iterator<AvailabilityAttr> 209 A = D->specific_attr_begin<AvailabilityAttr>(), 210 AEnd = D->specific_attr_end<AvailabilityAttr>(); 211 A != AEnd; ++A) 212 if ((*A)->getPlatform()->getName().equals("macosx")) 213 return DefaultVisibility; 214 } 215 216 return None; 217} 218 219static LinkageInfo 220getLVForType(const Type &T, LVComputationKind computation) { 221 if (computation == LVForLinkageOnly) 222 return LinkageInfo(T.getLinkage(), DefaultVisibility, true); 223 return T.getLinkageAndVisibility(); 224} 225 226/// \brief Get the most restrictive linkage for the types in the given 227/// template parameter list. For visibility purposes, template 228/// parameters are part of the signature of a template. 229static LinkageInfo 230getLVForTemplateParameterList(const TemplateParameterList *params, 231 LVComputationKind computation) { 232 LinkageInfo LV; 233 for (TemplateParameterList::const_iterator P = params->begin(), 234 PEnd = params->end(); 235 P != PEnd; ++P) { 236 237 // Template type parameters are the most common and never 238 // contribute to visibility, pack or not. 239 if (isa<TemplateTypeParmDecl>(*P)) 240 continue; 241 242 // Non-type template parameters can be restricted by the value type, e.g. 243 // template <enum X> class A { ... }; 244 // We have to be careful here, though, because we can be dealing with 245 // dependent types. 246 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 247 // Handle the non-pack case first. 248 if (!NTTP->isExpandedParameterPack()) { 249 if (!NTTP->getType()->isDependentType()) { 250 LV.merge(getLVForType(*NTTP->getType(), computation)); 251 } 252 continue; 253 } 254 255 // Look at all the types in an expanded pack. 256 for (unsigned i = 0, n = NTTP->getNumExpansionTypes(); i != n; ++i) { 257 QualType type = NTTP->getExpansionType(i); 258 if (!type->isDependentType()) 259 LV.merge(type->getLinkageAndVisibility()); 260 } 261 continue; 262 } 263 264 // Template template parameters can be restricted by their 265 // template parameters, recursively. 266 TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 267 268 // Handle the non-pack case first. 269 if (!TTP->isExpandedParameterPack()) { 270 LV.merge(getLVForTemplateParameterList(TTP->getTemplateParameters(), 271 computation)); 272 continue; 273 } 274 275 // Look at all expansions in an expanded pack. 276 for (unsigned i = 0, n = TTP->getNumExpansionTemplateParameters(); 277 i != n; ++i) { 278 LV.merge(getLVForTemplateParameterList( 279 TTP->getExpansionTemplateParameters(i), computation)); 280 } 281 } 282 283 return LV; 284} 285 286/// getLVForDecl - Get the linkage and visibility for the given declaration. 287static LinkageInfo getLVForDecl(const NamedDecl *D, 288 LVComputationKind computation); 289 290static const Decl *getOutermostFuncOrBlockContext(const Decl *D) { 291 const Decl *Ret = NULL; 292 const DeclContext *DC = D->getDeclContext(); 293 while (DC->getDeclKind() != Decl::TranslationUnit) { 294 if (isa<FunctionDecl>(DC) || isa<BlockDecl>(DC)) 295 Ret = cast<Decl>(DC); 296 DC = DC->getParent(); 297 } 298 return Ret; 299} 300 301/// \brief Get the most restrictive linkage for the types and 302/// declarations in the given template argument list. 303/// 304/// Note that we don't take an LVComputationKind because we always 305/// want to honor the visibility of template arguments in the same way. 306static LinkageInfo 307getLVForTemplateArgumentList(ArrayRef<TemplateArgument> args, 308 LVComputationKind computation) { 309 LinkageInfo LV; 310 311 for (unsigned i = 0, e = args.size(); i != e; ++i) { 312 const TemplateArgument &arg = args[i]; 313 switch (arg.getKind()) { 314 case TemplateArgument::Null: 315 case TemplateArgument::Integral: 316 case TemplateArgument::Expression: 317 continue; 318 319 case TemplateArgument::Type: 320 LV.merge(getLVForType(*arg.getAsType(), computation)); 321 continue; 322 323 case TemplateArgument::Declaration: 324 if (NamedDecl *ND = dyn_cast<NamedDecl>(arg.getAsDecl())) { 325 assert(!usesTypeVisibility(ND)); 326 LV.merge(getLVForDecl(ND, computation)); 327 } 328 continue; 329 330 case TemplateArgument::NullPtr: 331 LV.merge(arg.getNullPtrType()->getLinkageAndVisibility()); 332 continue; 333 334 case TemplateArgument::Template: 335 case TemplateArgument::TemplateExpansion: 336 if (TemplateDecl *Template 337 = arg.getAsTemplateOrTemplatePattern().getAsTemplateDecl()) 338 LV.merge(getLVForDecl(Template, computation)); 339 continue; 340 341 case TemplateArgument::Pack: 342 LV.merge(getLVForTemplateArgumentList(arg.getPackAsArray(), computation)); 343 continue; 344 } 345 llvm_unreachable("bad template argument kind"); 346 } 347 348 return LV; 349} 350 351static LinkageInfo 352getLVForTemplateArgumentList(const TemplateArgumentList &TArgs, 353 LVComputationKind computation) { 354 return getLVForTemplateArgumentList(TArgs.asArray(), computation); 355} 356 357static bool shouldConsiderTemplateVisibility(const FunctionDecl *fn, 358 const FunctionTemplateSpecializationInfo *specInfo) { 359 // Include visibility from the template parameters and arguments 360 // only if this is not an explicit instantiation or specialization 361 // with direct explicit visibility. (Implicit instantiations won't 362 // have a direct attribute.) 363 if (!specInfo->isExplicitInstantiationOrSpecialization()) 364 return true; 365 366 return !fn->hasAttr<VisibilityAttr>(); 367} 368 369/// Merge in template-related linkage and visibility for the given 370/// function template specialization. 371/// 372/// We don't need a computation kind here because we can assume 373/// LVForValue. 374/// 375/// \param[out] LV the computation to use for the parent 376static void 377mergeTemplateLV(LinkageInfo &LV, const FunctionDecl *fn, 378 const FunctionTemplateSpecializationInfo *specInfo, 379 LVComputationKind computation) { 380 bool considerVisibility = 381 shouldConsiderTemplateVisibility(fn, specInfo); 382 383 // Merge information from the template parameters. 384 FunctionTemplateDecl *temp = specInfo->getTemplate(); 385 LinkageInfo tempLV = 386 getLVForTemplateParameterList(temp->getTemplateParameters(), computation); 387 LV.mergeMaybeWithVisibility(tempLV, considerVisibility); 388 389 // Merge information from the template arguments. 390 const TemplateArgumentList &templateArgs = *specInfo->TemplateArguments; 391 LinkageInfo argsLV = getLVForTemplateArgumentList(templateArgs, computation); 392 LV.mergeMaybeWithVisibility(argsLV, considerVisibility); 393} 394 395/// Does the given declaration have a direct visibility attribute 396/// that would match the given rules? 397static bool hasDirectVisibilityAttribute(const NamedDecl *D, 398 LVComputationKind computation) { 399 switch (computation) { 400 case LVForType: 401 case LVForExplicitType: 402 if (D->hasAttr<TypeVisibilityAttr>()) 403 return true; 404 // fallthrough 405 case LVForValue: 406 case LVForExplicitValue: 407 if (D->hasAttr<VisibilityAttr>()) 408 return true; 409 return false; 410 case LVForLinkageOnly: 411 return false; 412 } 413 llvm_unreachable("bad visibility computation kind"); 414} 415 416/// Should we consider visibility associated with the template 417/// arguments and parameters of the given class template specialization? 418static bool shouldConsiderTemplateVisibility( 419 const ClassTemplateSpecializationDecl *spec, 420 LVComputationKind computation) { 421 // Include visibility from the template parameters and arguments 422 // only if this is not an explicit instantiation or specialization 423 // with direct explicit visibility (and note that implicit 424 // instantiations won't have a direct attribute). 425 // 426 // Furthermore, we want to ignore template parameters and arguments 427 // for an explicit specialization when computing the visibility of a 428 // member thereof with explicit visibility. 429 // 430 // This is a bit complex; let's unpack it. 431 // 432 // An explicit class specialization is an independent, top-level 433 // declaration. As such, if it or any of its members has an 434 // explicit visibility attribute, that must directly express the 435 // user's intent, and we should honor it. The same logic applies to 436 // an explicit instantiation of a member of such a thing. 437 438 // Fast path: if this is not an explicit instantiation or 439 // specialization, we always want to consider template-related 440 // visibility restrictions. 441 if (!spec->isExplicitInstantiationOrSpecialization()) 442 return true; 443 444 // This is the 'member thereof' check. 445 if (spec->isExplicitSpecialization() && 446 hasExplicitVisibilityAlready(computation)) 447 return false; 448 449 return !hasDirectVisibilityAttribute(spec, computation); 450} 451 452/// Merge in template-related linkage and visibility for the given 453/// class template specialization. 454static void mergeTemplateLV(LinkageInfo &LV, 455 const ClassTemplateSpecializationDecl *spec, 456 LVComputationKind computation) { 457 bool considerVisibility = shouldConsiderTemplateVisibility(spec, computation); 458 459 // Merge information from the template parameters, but ignore 460 // visibility if we're only considering template arguments. 461 462 ClassTemplateDecl *temp = spec->getSpecializedTemplate(); 463 LinkageInfo tempLV = 464 getLVForTemplateParameterList(temp->getTemplateParameters(), computation); 465 LV.mergeMaybeWithVisibility(tempLV, 466 considerVisibility && !hasExplicitVisibilityAlready(computation)); 467 468 // Merge information from the template arguments. We ignore 469 // template-argument visibility if we've got an explicit 470 // instantiation with a visibility attribute. 471 const TemplateArgumentList &templateArgs = spec->getTemplateArgs(); 472 LinkageInfo argsLV = getLVForTemplateArgumentList(templateArgs, computation); 473 if (considerVisibility) 474 LV.mergeVisibility(argsLV); 475 LV.mergeExternalVisibility(argsLV); 476} 477 478static bool useInlineVisibilityHidden(const NamedDecl *D) { 479 // FIXME: we should warn if -fvisibility-inlines-hidden is used with c. 480 const LangOptions &Opts = D->getASTContext().getLangOpts(); 481 if (!Opts.CPlusPlus || !Opts.InlineVisibilityHidden) 482 return false; 483 484 const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 485 if (!FD) 486 return false; 487 488 TemplateSpecializationKind TSK = TSK_Undeclared; 489 if (FunctionTemplateSpecializationInfo *spec 490 = FD->getTemplateSpecializationInfo()) { 491 TSK = spec->getTemplateSpecializationKind(); 492 } else if (MemberSpecializationInfo *MSI = 493 FD->getMemberSpecializationInfo()) { 494 TSK = MSI->getTemplateSpecializationKind(); 495 } 496 497 const FunctionDecl *Def = 0; 498 // InlineVisibilityHidden only applies to definitions, and 499 // isInlined() only gives meaningful answers on definitions 500 // anyway. 501 return TSK != TSK_ExplicitInstantiationDeclaration && 502 TSK != TSK_ExplicitInstantiationDefinition && 503 FD->hasBody(Def) && Def->isInlined() && !Def->hasAttr<GNUInlineAttr>(); 504} 505 506template <typename T> static bool isFirstInExternCContext(T *D) { 507 const T *First = D->getFirstDeclaration(); 508 return First->isInExternCContext(); 509} 510 511static bool isSingleLineExternC(const Decl &D) { 512 if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(D.getDeclContext())) 513 if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces()) 514 return true; 515 return false; 516} 517 518static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, 519 LVComputationKind computation) { 520 assert(D->getDeclContext()->getRedeclContext()->isFileContext() && 521 "Not a name having namespace scope"); 522 ASTContext &Context = D->getASTContext(); 523 524 // C++ [basic.link]p3: 525 // A name having namespace scope (3.3.6) has internal linkage if it 526 // is the name of 527 // - an object, reference, function or function template that is 528 // explicitly declared static; or, 529 // (This bullet corresponds to C99 6.2.2p3.) 530 if (const VarDecl *Var = dyn_cast<VarDecl>(D)) { 531 // Explicitly declared static. 532 if (Var->getStorageClass() == SC_Static) 533 return LinkageInfo::internal(); 534 535 // - a non-volatile object or reference that is explicitly declared const 536 // or constexpr and neither explicitly declared extern nor previously 537 // declared to have external linkage; or (there is no equivalent in C99) 538 if (Context.getLangOpts().CPlusPlus && 539 Var->getType().isConstQualified() && 540 !Var->getType().isVolatileQualified()) { 541 const VarDecl *PrevVar = Var->getPreviousDecl(); 542 if (PrevVar) 543 return getLVForDecl(PrevVar, computation); 544 545 if (Var->getStorageClass() != SC_Extern && 546 Var->getStorageClass() != SC_PrivateExtern && 547 !isSingleLineExternC(*Var)) 548 return LinkageInfo::internal(); 549 } 550 551 for (const VarDecl *PrevVar = Var->getPreviousDecl(); PrevVar; 552 PrevVar = PrevVar->getPreviousDecl()) { 553 if (PrevVar->getStorageClass() == SC_PrivateExtern && 554 Var->getStorageClass() == SC_None) 555 return PrevVar->getLinkageAndVisibility(); 556 // Explicitly declared static. 557 if (PrevVar->getStorageClass() == SC_Static) 558 return LinkageInfo::internal(); 559 } 560 } else if (isa<FunctionDecl>(D) || isa<FunctionTemplateDecl>(D)) { 561 // C++ [temp]p4: 562 // A non-member function template can have internal linkage; any 563 // other template name shall have external linkage. 564 const FunctionDecl *Function = 0; 565 if (const FunctionTemplateDecl *FunTmpl 566 = dyn_cast<FunctionTemplateDecl>(D)) 567 Function = FunTmpl->getTemplatedDecl(); 568 else 569 Function = cast<FunctionDecl>(D); 570 571 // Explicitly declared static. 572 if (Function->getCanonicalDecl()->getStorageClass() == SC_Static) 573 return LinkageInfo(InternalLinkage, DefaultVisibility, false); 574 } else if (const FieldDecl *Field = dyn_cast<FieldDecl>(D)) { 575 // - a data member of an anonymous union. 576 if (cast<RecordDecl>(Field->getDeclContext())->isAnonymousStructOrUnion()) 577 return LinkageInfo::internal(); 578 } 579 580 if (D->isInAnonymousNamespace()) { 581 const VarDecl *Var = dyn_cast<VarDecl>(D); 582 const FunctionDecl *Func = dyn_cast<FunctionDecl>(D); 583 if ((!Var || !isFirstInExternCContext(Var)) && 584 (!Func || !isFirstInExternCContext(Func))) 585 return LinkageInfo::uniqueExternal(); 586 } 587 588 // Set up the defaults. 589 590 // C99 6.2.2p5: 591 // If the declaration of an identifier for an object has file 592 // scope and no storage-class specifier, its linkage is 593 // external. 594 LinkageInfo LV; 595 596 if (!hasExplicitVisibilityAlready(computation)) { 597 if (Optional<Visibility> Vis = getExplicitVisibility(D, computation)) { 598 LV.mergeVisibility(*Vis, true); 599 } else { 600 // If we're declared in a namespace with a visibility attribute, 601 // use that namespace's visibility, and it still counts as explicit. 602 for (const DeclContext *DC = D->getDeclContext(); 603 !isa<TranslationUnitDecl>(DC); 604 DC = DC->getParent()) { 605 const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC); 606 if (!ND) continue; 607 if (Optional<Visibility> Vis = getExplicitVisibility(ND, computation)) { 608 LV.mergeVisibility(*Vis, true); 609 break; 610 } 611 } 612 } 613 614 // Add in global settings if the above didn't give us direct visibility. 615 if (!LV.isVisibilityExplicit()) { 616 // Use global type/value visibility as appropriate. 617 Visibility globalVisibility; 618 if (computation == LVForValue) { 619 globalVisibility = Context.getLangOpts().getValueVisibilityMode(); 620 } else { 621 assert(computation == LVForType); 622 globalVisibility = Context.getLangOpts().getTypeVisibilityMode(); 623 } 624 LV.mergeVisibility(globalVisibility, /*explicit*/ false); 625 626 // If we're paying attention to global visibility, apply 627 // -finline-visibility-hidden if this is an inline method. 628 if (useInlineVisibilityHidden(D)) 629 LV.mergeVisibility(HiddenVisibility, true); 630 } 631 } 632 633 // C++ [basic.link]p4: 634 635 // A name having namespace scope has external linkage if it is the 636 // name of 637 // 638 // - an object or reference, unless it has internal linkage; or 639 if (const VarDecl *Var = dyn_cast<VarDecl>(D)) { 640 // GCC applies the following optimization to variables and static 641 // data members, but not to functions: 642 // 643 // Modify the variable's LV by the LV of its type unless this is 644 // C or extern "C". This follows from [basic.link]p9: 645 // A type without linkage shall not be used as the type of a 646 // variable or function with external linkage unless 647 // - the entity has C language linkage, or 648 // - the entity is declared within an unnamed namespace, or 649 // - the entity is not used or is defined in the same 650 // translation unit. 651 // and [basic.link]p10: 652 // ...the types specified by all declarations referring to a 653 // given variable or function shall be identical... 654 // C does not have an equivalent rule. 655 // 656 // Ignore this if we've got an explicit attribute; the user 657 // probably knows what they're doing. 658 // 659 // Note that we don't want to make the variable non-external 660 // because of this, but unique-external linkage suits us. 661 if (Context.getLangOpts().CPlusPlus && !isFirstInExternCContext(Var)) { 662 LinkageInfo TypeLV = getLVForType(*Var->getType(), computation); 663 if (TypeLV.getLinkage() != ExternalLinkage) 664 return LinkageInfo::uniqueExternal(); 665 if (!LV.isVisibilityExplicit()) 666 LV.mergeVisibility(TypeLV); 667 } 668 669 if (Var->getStorageClass() == SC_PrivateExtern) 670 LV.mergeVisibility(HiddenVisibility, true); 671 672 // Note that Sema::MergeVarDecl already takes care of implementing 673 // C99 6.2.2p4 and propagating the visibility attribute, so we don't have 674 // to do it here. 675 676 // - a function, unless it has internal linkage; or 677 } else if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 678 // In theory, we can modify the function's LV by the LV of its 679 // type unless it has C linkage (see comment above about variables 680 // for justification). In practice, GCC doesn't do this, so it's 681 // just too painful to make work. 682 683 if (Function->getStorageClass() == SC_PrivateExtern) 684 LV.mergeVisibility(HiddenVisibility, true); 685 686 // Note that Sema::MergeCompatibleFunctionDecls already takes care of 687 // merging storage classes and visibility attributes, so we don't have to 688 // look at previous decls in here. 689 690 // In C++, then if the type of the function uses a type with 691 // unique-external linkage, it's not legally usable from outside 692 // this translation unit. However, we should use the C linkage 693 // rules instead for extern "C" declarations. 694 if (Context.getLangOpts().CPlusPlus && 695 !Function->isInExternCContext()) { 696 // Only look at the type-as-written. If this function has an auto-deduced 697 // return type, we can't compute the linkage of that type because it could 698 // require looking at the linkage of this function, and we don't need this 699 // for correctness because the type is not part of the function's 700 // signature. 701 // FIXME: This is a hack. We should be able to solve this circularity some 702 // other way. 703 QualType TypeAsWritten = Function->getType(); 704 if (TypeSourceInfo *TSI = Function->getTypeSourceInfo()) 705 TypeAsWritten = TSI->getType(); 706 if (TypeAsWritten->getLinkage() == UniqueExternalLinkage) 707 return LinkageInfo::uniqueExternal(); 708 } 709 710 // Consider LV from the template and the template arguments. 711 // We're at file scope, so we do not need to worry about nested 712 // specializations. 713 if (FunctionTemplateSpecializationInfo *specInfo 714 = Function->getTemplateSpecializationInfo()) { 715 mergeTemplateLV(LV, Function, specInfo, computation); 716 } 717 718 // - a named class (Clause 9), or an unnamed class defined in a 719 // typedef declaration in which the class has the typedef name 720 // for linkage purposes (7.1.3); or 721 // - a named enumeration (7.2), or an unnamed enumeration 722 // defined in a typedef declaration in which the enumeration 723 // has the typedef name for linkage purposes (7.1.3); or 724 } else if (const TagDecl *Tag = dyn_cast<TagDecl>(D)) { 725 // Unnamed tags have no linkage. 726 if (!Tag->hasNameForLinkage()) 727 return LinkageInfo::none(); 728 729 // If this is a class template specialization, consider the 730 // linkage of the template and template arguments. We're at file 731 // scope, so we do not need to worry about nested specializations. 732 if (const ClassTemplateSpecializationDecl *spec 733 = dyn_cast<ClassTemplateSpecializationDecl>(Tag)) { 734 mergeTemplateLV(LV, spec, computation); 735 } 736 737 // - an enumerator belonging to an enumeration with external linkage; 738 } else if (isa<EnumConstantDecl>(D)) { 739 LinkageInfo EnumLV = getLVForDecl(cast<NamedDecl>(D->getDeclContext()), 740 computation); 741 if (!isExternalFormalLinkage(EnumLV.getLinkage())) 742 return LinkageInfo::none(); 743 LV.merge(EnumLV); 744 745 // - a template, unless it is a function template that has 746 // internal linkage (Clause 14); 747 } else if (const TemplateDecl *temp = dyn_cast<TemplateDecl>(D)) { 748 bool considerVisibility = !hasExplicitVisibilityAlready(computation); 749 LinkageInfo tempLV = 750 getLVForTemplateParameterList(temp->getTemplateParameters(), computation); 751 LV.mergeMaybeWithVisibility(tempLV, considerVisibility); 752 753 // - a namespace (7.3), unless it is declared within an unnamed 754 // namespace. 755 } else if (isa<NamespaceDecl>(D) && !D->isInAnonymousNamespace()) { 756 return LV; 757 758 // By extension, we assign external linkage to Objective-C 759 // interfaces. 760 } else if (isa<ObjCInterfaceDecl>(D)) { 761 // fallout 762 763 // Everything not covered here has no linkage. 764 } else { 765 return LinkageInfo::none(); 766 } 767 768 // If we ended up with non-external linkage, visibility should 769 // always be default. 770 if (LV.getLinkage() != ExternalLinkage) 771 return LinkageInfo(LV.getLinkage(), DefaultVisibility, false); 772 773 return LV; 774} 775 776static LinkageInfo getLVForClassMember(const NamedDecl *D, 777 LVComputationKind computation) { 778 // Only certain class members have linkage. Note that fields don't 779 // really have linkage, but it's convenient to say they do for the 780 // purposes of calculating linkage of pointer-to-data-member 781 // template arguments. 782 if (!(isa<CXXMethodDecl>(D) || 783 isa<VarDecl>(D) || 784 isa<FieldDecl>(D) || 785 isa<TagDecl>(D))) 786 return LinkageInfo::none(); 787 788 LinkageInfo LV; 789 790 // If we have an explicit visibility attribute, merge that in. 791 if (!hasExplicitVisibilityAlready(computation)) { 792 if (Optional<Visibility> Vis = getExplicitVisibility(D, computation)) 793 LV.mergeVisibility(*Vis, true); 794 // If we're paying attention to global visibility, apply 795 // -finline-visibility-hidden if this is an inline method. 796 // 797 // Note that we do this before merging information about 798 // the class visibility. 799 if (!LV.isVisibilityExplicit() && useInlineVisibilityHidden(D)) 800 LV.mergeVisibility(HiddenVisibility, true); 801 } 802 803 // If this class member has an explicit visibility attribute, the only 804 // thing that can change its visibility is the template arguments, so 805 // only look for them when processing the class. 806 LVComputationKind classComputation = computation; 807 if (LV.isVisibilityExplicit()) 808 classComputation = withExplicitVisibilityAlready(computation); 809 810 LinkageInfo classLV = 811 getLVForDecl(cast<RecordDecl>(D->getDeclContext()), classComputation); 812 // If the class already has unique-external linkage, we can't improve. 813 if (classLV.getLinkage() == UniqueExternalLinkage) 814 return LinkageInfo::uniqueExternal(); 815 816 if (!isExternallyVisible(classLV.getLinkage())) 817 return LinkageInfo::none(); 818 819 820 // Otherwise, don't merge in classLV yet, because in certain cases 821 // we need to completely ignore the visibility from it. 822 823 // Specifically, if this decl exists and has an explicit attribute. 824 const NamedDecl *explicitSpecSuppressor = 0; 825 826 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) { 827 // If the type of the function uses a type with unique-external 828 // linkage, it's not legally usable from outside this translation unit. 829 if (MD->getType()->getLinkage() == UniqueExternalLinkage) 830 return LinkageInfo::uniqueExternal(); 831 832 // If this is a method template specialization, use the linkage for 833 // the template parameters and arguments. 834 if (FunctionTemplateSpecializationInfo *spec 835 = MD->getTemplateSpecializationInfo()) { 836 mergeTemplateLV(LV, MD, spec, computation); 837 if (spec->isExplicitSpecialization()) { 838 explicitSpecSuppressor = MD; 839 } else if (isExplicitMemberSpecialization(spec->getTemplate())) { 840 explicitSpecSuppressor = spec->getTemplate()->getTemplatedDecl(); 841 } 842 } else if (isExplicitMemberSpecialization(MD)) { 843 explicitSpecSuppressor = MD; 844 } 845 846 } else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) { 847 if (const ClassTemplateSpecializationDecl *spec 848 = dyn_cast<ClassTemplateSpecializationDecl>(RD)) { 849 mergeTemplateLV(LV, spec, computation); 850 if (spec->isExplicitSpecialization()) { 851 explicitSpecSuppressor = spec; 852 } else { 853 const ClassTemplateDecl *temp = spec->getSpecializedTemplate(); 854 if (isExplicitMemberSpecialization(temp)) { 855 explicitSpecSuppressor = temp->getTemplatedDecl(); 856 } 857 } 858 } else if (isExplicitMemberSpecialization(RD)) { 859 explicitSpecSuppressor = RD; 860 } 861 862 // Static data members. 863 } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 864 // Modify the variable's linkage by its type, but ignore the 865 // type's visibility unless it's a definition. 866 LinkageInfo typeLV = getLVForType(*VD->getType(), computation); 867 if (!LV.isVisibilityExplicit() && !classLV.isVisibilityExplicit()) 868 LV.mergeVisibility(typeLV); 869 LV.mergeExternalVisibility(typeLV); 870 871 if (isExplicitMemberSpecialization(VD)) { 872 explicitSpecSuppressor = VD; 873 } 874 875 // Template members. 876 } else if (const TemplateDecl *temp = dyn_cast<TemplateDecl>(D)) { 877 bool considerVisibility = 878 (!LV.isVisibilityExplicit() && 879 !classLV.isVisibilityExplicit() && 880 !hasExplicitVisibilityAlready(computation)); 881 LinkageInfo tempLV = 882 getLVForTemplateParameterList(temp->getTemplateParameters(), computation); 883 LV.mergeMaybeWithVisibility(tempLV, considerVisibility); 884 885 if (const RedeclarableTemplateDecl *redeclTemp = 886 dyn_cast<RedeclarableTemplateDecl>(temp)) { 887 if (isExplicitMemberSpecialization(redeclTemp)) { 888 explicitSpecSuppressor = temp->getTemplatedDecl(); 889 } 890 } 891 } 892 893 // We should never be looking for an attribute directly on a template. 894 assert(!explicitSpecSuppressor || !isa<TemplateDecl>(explicitSpecSuppressor)); 895 896 // If this member is an explicit member specialization, and it has 897 // an explicit attribute, ignore visibility from the parent. 898 bool considerClassVisibility = true; 899 if (explicitSpecSuppressor && 900 // optimization: hasDVA() is true only with explicit visibility. 901 LV.isVisibilityExplicit() && 902 classLV.getVisibility() != DefaultVisibility && 903 hasDirectVisibilityAttribute(explicitSpecSuppressor, computation)) { 904 considerClassVisibility = false; 905 } 906 907 // Finally, merge in information from the class. 908 LV.mergeMaybeWithVisibility(classLV, considerClassVisibility); 909 return LV; 910} 911 912void NamedDecl::anchor() { } 913 914static LinkageInfo computeLVForDecl(const NamedDecl *D, 915 LVComputationKind computation); 916 917bool NamedDecl::isLinkageValid() const { 918 if (!hasCachedLinkage()) 919 return true; 920 921 return computeLVForDecl(this, LVForLinkageOnly).getLinkage() == 922 getCachedLinkage(); 923} 924 925Linkage NamedDecl::getLinkageInternal() const { 926 // We don't care about visibility here, so ask for the cheapest 927 // possible visibility analysis. 928 return getLVForDecl(this, LVForLinkageOnly).getLinkage(); 929} 930 931LinkageInfo NamedDecl::getLinkageAndVisibility() const { 932 LVComputationKind computation = 933 (usesTypeVisibility(this) ? LVForType : LVForValue); 934 return getLVForDecl(this, computation); 935} 936 937Optional<Visibility> 938NamedDecl::getExplicitVisibility(ExplicitVisibilityKind kind) const { 939 // Check the declaration itself first. 940 if (Optional<Visibility> V = getVisibilityOf(this, kind)) 941 return V; 942 943 // If this is a member class of a specialization of a class template 944 // and the corresponding decl has explicit visibility, use that. 945 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(this)) { 946 CXXRecordDecl *InstantiatedFrom = RD->getInstantiatedFromMemberClass(); 947 if (InstantiatedFrom) 948 return getVisibilityOf(InstantiatedFrom, kind); 949 } 950 951 // If there wasn't explicit visibility there, and this is a 952 // specialization of a class template, check for visibility 953 // on the pattern. 954 if (const ClassTemplateSpecializationDecl *spec 955 = dyn_cast<ClassTemplateSpecializationDecl>(this)) 956 return getVisibilityOf(spec->getSpecializedTemplate()->getTemplatedDecl(), 957 kind); 958 959 // Use the most recent declaration. 960 const NamedDecl *MostRecent = cast<NamedDecl>(this->getMostRecentDecl()); 961 if (MostRecent != this) 962 return MostRecent->getExplicitVisibility(kind); 963 964 if (const VarDecl *Var = dyn_cast<VarDecl>(this)) { 965 if (Var->isStaticDataMember()) { 966 VarDecl *InstantiatedFrom = Var->getInstantiatedFromStaticDataMember(); 967 if (InstantiatedFrom) 968 return getVisibilityOf(InstantiatedFrom, kind); 969 } 970 971 return None; 972 } 973 // Also handle function template specializations. 974 if (const FunctionDecl *fn = dyn_cast<FunctionDecl>(this)) { 975 // If the function is a specialization of a template with an 976 // explicit visibility attribute, use that. 977 if (FunctionTemplateSpecializationInfo *templateInfo 978 = fn->getTemplateSpecializationInfo()) 979 return getVisibilityOf(templateInfo->getTemplate()->getTemplatedDecl(), 980 kind); 981 982 // If the function is a member of a specialization of a class template 983 // and the corresponding decl has explicit visibility, use that. 984 FunctionDecl *InstantiatedFrom = fn->getInstantiatedFromMemberFunction(); 985 if (InstantiatedFrom) 986 return getVisibilityOf(InstantiatedFrom, kind); 987 988 return None; 989 } 990 991 // The visibility of a template is stored in the templated decl. 992 if (const TemplateDecl *TD = dyn_cast<TemplateDecl>(this)) 993 return getVisibilityOf(TD->getTemplatedDecl(), kind); 994 995 return None; 996} 997 998static LinkageInfo getLVForClosure(const DeclContext *DC, Decl *ContextDecl, 999 LVComputationKind computation) { 1000 // This lambda has its linkage/visibility determined by its owner. 1001 if (ContextDecl) { 1002 if (isa<ParmVarDecl>(ContextDecl)) 1003 DC = ContextDecl->getDeclContext()->getRedeclContext(); 1004 else 1005 return getLVForDecl(cast<NamedDecl>(ContextDecl), computation); 1006 } 1007 1008 if (const NamedDecl *ND = dyn_cast<NamedDecl>(DC)) 1009 return getLVForDecl(ND, computation); 1010 1011 return LinkageInfo::external(); 1012} 1013 1014static LinkageInfo getLVForLocalDecl(const NamedDecl *D, 1015 LVComputationKind computation) { 1016 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 1017 if (Function->isInAnonymousNamespace() && 1018 !Function->isInExternCContext()) 1019 return LinkageInfo::uniqueExternal(); 1020 1021 // This is a "void f();" which got merged with a file static. 1022 if (Function->getCanonicalDecl()->getStorageClass() == SC_Static) 1023 return LinkageInfo::internal(); 1024 1025 LinkageInfo LV; 1026 if (!hasExplicitVisibilityAlready(computation)) { 1027 if (Optional<Visibility> Vis = 1028 getExplicitVisibility(Function, computation)) 1029 LV.mergeVisibility(*Vis, true); 1030 } 1031 1032 // Note that Sema::MergeCompatibleFunctionDecls already takes care of 1033 // merging storage classes and visibility attributes, so we don't have to 1034 // look at previous decls in here. 1035 1036 return LV; 1037 } 1038 1039 if (const VarDecl *Var = dyn_cast<VarDecl>(D)) { 1040 if (Var->hasExternalStorage()) { 1041 if (Var->isInAnonymousNamespace() && !Var->isInExternCContext()) 1042 return LinkageInfo::uniqueExternal(); 1043 1044 LinkageInfo LV; 1045 if (Var->getStorageClass() == SC_PrivateExtern) 1046 LV.mergeVisibility(HiddenVisibility, true); 1047 else if (!hasExplicitVisibilityAlready(computation)) { 1048 if (Optional<Visibility> Vis = getExplicitVisibility(Var, computation)) 1049 LV.mergeVisibility(*Vis, true); 1050 } 1051 1052 if (const VarDecl *Prev = Var->getPreviousDecl()) { 1053 LinkageInfo PrevLV = getLVForDecl(Prev, computation); 1054 if (PrevLV.getLinkage()) 1055 LV.setLinkage(PrevLV.getLinkage()); 1056 LV.mergeVisibility(PrevLV); 1057 } 1058 1059 return LV; 1060 } 1061 1062 if (!Var->isStaticLocal()) 1063 return LinkageInfo::none(); 1064 } 1065 1066 ASTContext &Context = D->getASTContext(); 1067 if (!Context.getLangOpts().CPlusPlus) 1068 return LinkageInfo::none(); 1069 1070 const Decl *OuterD = getOutermostFuncOrBlockContext(D); 1071 if (!OuterD) 1072 return LinkageInfo::none(); 1073 1074 LinkageInfo LV; 1075 if (const BlockDecl *BD = dyn_cast<BlockDecl>(OuterD)) { 1076 if (!BD->getBlockManglingNumber()) 1077 return LinkageInfo::none(); 1078 1079 LV = getLVForClosure(BD->getDeclContext()->getRedeclContext(), 1080 BD->getBlockManglingContextDecl(), computation); 1081 } else { 1082 const FunctionDecl *FD = cast<FunctionDecl>(OuterD); 1083 if (!FD->isInlined() && 1084 FD->getTemplateSpecializationKind() == TSK_Undeclared) 1085 return LinkageInfo::none(); 1086 1087 LV = getLVForDecl(FD, computation); 1088 } 1089 if (!isExternallyVisible(LV.getLinkage())) 1090 return LinkageInfo::none(); 1091 return LinkageInfo(VisibleNoLinkage, LV.getVisibility(), 1092 LV.isVisibilityExplicit()); 1093} 1094 1095static LinkageInfo computeLVForDecl(const NamedDecl *D, 1096 LVComputationKind computation) { 1097 // Objective-C: treat all Objective-C declarations as having external 1098 // linkage. 1099 switch (D->getKind()) { 1100 default: 1101 break; 1102 case Decl::ParmVar: 1103 return LinkageInfo::none(); 1104 case Decl::TemplateTemplateParm: // count these as external 1105 case Decl::NonTypeTemplateParm: 1106 case Decl::ObjCAtDefsField: 1107 case Decl::ObjCCategory: 1108 case Decl::ObjCCategoryImpl: 1109 case Decl::ObjCCompatibleAlias: 1110 case Decl::ObjCImplementation: 1111 case Decl::ObjCMethod: 1112 case Decl::ObjCProperty: 1113 case Decl::ObjCPropertyImpl: 1114 case Decl::ObjCProtocol: 1115 return LinkageInfo::external(); 1116 1117 case Decl::CXXRecord: { 1118 const CXXRecordDecl *Record = cast<CXXRecordDecl>(D); 1119 if (Record->isLambda()) { 1120 if (!Record->getLambdaManglingNumber()) { 1121 // This lambda has no mangling number, so it's internal. 1122 return LinkageInfo::internal(); 1123 } 1124 1125 // This lambda has its linkage/visibility determined by its owner. 1126 return getLVForClosure(D->getDeclContext()->getRedeclContext(), 1127 Record->getLambdaContextDecl(), computation); 1128 } 1129 1130 break; 1131 } 1132 } 1133 1134 // Handle linkage for namespace-scope names. 1135 if (D->getDeclContext()->getRedeclContext()->isFileContext()) 1136 return getLVForNamespaceScopeDecl(D, computation); 1137 1138 // C++ [basic.link]p5: 1139 // In addition, a member function, static data member, a named 1140 // class or enumeration of class scope, or an unnamed class or 1141 // enumeration defined in a class-scope typedef declaration such 1142 // that the class or enumeration has the typedef name for linkage 1143 // purposes (7.1.3), has external linkage if the name of the class 1144 // has external linkage. 1145 if (D->getDeclContext()->isRecord()) 1146 return getLVForClassMember(D, computation); 1147 1148 // C++ [basic.link]p6: 1149 // The name of a function declared in block scope and the name of 1150 // an object declared by a block scope extern declaration have 1151 // linkage. If there is a visible declaration of an entity with 1152 // linkage having the same name and type, ignoring entities 1153 // declared outside the innermost enclosing namespace scope, the 1154 // block scope declaration declares that same entity and receives 1155 // the linkage of the previous declaration. If there is more than 1156 // one such matching entity, the program is ill-formed. Otherwise, 1157 // if no matching entity is found, the block scope entity receives 1158 // external linkage. 1159 if (D->getDeclContext()->isFunctionOrMethod()) 1160 return getLVForLocalDecl(D, computation); 1161 1162 // C++ [basic.link]p6: 1163 // Names not covered by these rules have no linkage. 1164 return LinkageInfo::none(); 1165} 1166 1167namespace clang { 1168class LinkageComputer { 1169public: 1170 static LinkageInfo getLVForDecl(const NamedDecl *D, 1171 LVComputationKind computation) { 1172 if (computation == LVForLinkageOnly && D->hasCachedLinkage()) 1173 return LinkageInfo(D->getCachedLinkage(), DefaultVisibility, false); 1174 1175 LinkageInfo LV = computeLVForDecl(D, computation); 1176 if (D->hasCachedLinkage()) 1177 assert(D->getCachedLinkage() == LV.getLinkage()); 1178 1179 D->setCachedLinkage(LV.getLinkage()); 1180 1181#ifndef NDEBUG 1182 // In C (because of gnu inline) and in c++ with microsoft extensions an 1183 // static can follow an extern, so we can have two decls with different 1184 // linkages. 1185 const LangOptions &Opts = D->getASTContext().getLangOpts(); 1186 if (!Opts.CPlusPlus || Opts.MicrosoftExt) 1187 return LV; 1188 1189 // We have just computed the linkage for this decl. By induction we know 1190 // that all other computed linkages match, check that the one we just 1191 // computed 1192 // also does. 1193 NamedDecl *Old = NULL; 1194 for (NamedDecl::redecl_iterator I = D->redecls_begin(), 1195 E = D->redecls_end(); 1196 I != E; ++I) { 1197 NamedDecl *T = cast<NamedDecl>(*I); 1198 if (T == D) 1199 continue; 1200 if (T->hasCachedLinkage()) { 1201 Old = T; 1202 break; 1203 } 1204 } 1205 assert(!Old || Old->getCachedLinkage() == D->getCachedLinkage()); 1206#endif 1207 1208 return LV; 1209 } 1210}; 1211} 1212 1213static LinkageInfo getLVForDecl(const NamedDecl *D, 1214 LVComputationKind computation) { 1215 return clang::LinkageComputer::getLVForDecl(D, computation); 1216} 1217 1218std::string NamedDecl::getQualifiedNameAsString() const { 1219 return getQualifiedNameAsString(getASTContext().getPrintingPolicy()); 1220} 1221 1222std::string NamedDecl::getQualifiedNameAsString(const PrintingPolicy &P) const { 1223 std::string QualName; 1224 llvm::raw_string_ostream OS(QualName); 1225 printQualifiedName(OS, P); 1226 return OS.str(); 1227} 1228 1229void NamedDecl::printQualifiedName(raw_ostream &OS) const { 1230 printQualifiedName(OS, getASTContext().getPrintingPolicy()); 1231} 1232 1233void NamedDecl::printQualifiedName(raw_ostream &OS, 1234 const PrintingPolicy &P) const { 1235 const DeclContext *Ctx = getDeclContext(); 1236 1237 if (Ctx->isFunctionOrMethod()) { 1238 printName(OS); 1239 return; 1240 } 1241 1242 typedef SmallVector<const DeclContext *, 8> ContextsTy; 1243 ContextsTy Contexts; 1244 1245 // Collect contexts. 1246 while (Ctx && isa<NamedDecl>(Ctx)) { 1247 Contexts.push_back(Ctx); 1248 Ctx = Ctx->getParent(); 1249 } 1250 1251 for (ContextsTy::reverse_iterator I = Contexts.rbegin(), E = Contexts.rend(); 1252 I != E; ++I) { 1253 if (const ClassTemplateSpecializationDecl *Spec 1254 = dyn_cast<ClassTemplateSpecializationDecl>(*I)) { 1255 OS << Spec->getName(); 1256 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 1257 TemplateSpecializationType::PrintTemplateArgumentList(OS, 1258 TemplateArgs.data(), 1259 TemplateArgs.size(), 1260 P); 1261 } else if (const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(*I)) { 1262 if (ND->isAnonymousNamespace()) 1263 OS << "<anonymous namespace>"; 1264 else 1265 OS << *ND; 1266 } else if (const RecordDecl *RD = dyn_cast<RecordDecl>(*I)) { 1267 if (!RD->getIdentifier()) 1268 OS << "<anonymous " << RD->getKindName() << '>'; 1269 else 1270 OS << *RD; 1271 } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) { 1272 const FunctionProtoType *FT = 0; 1273 if (FD->hasWrittenPrototype()) 1274 FT = dyn_cast<FunctionProtoType>(FD->getType()->castAs<FunctionType>()); 1275 1276 OS << *FD << '('; 1277 if (FT) { 1278 unsigned NumParams = FD->getNumParams(); 1279 for (unsigned i = 0; i < NumParams; ++i) { 1280 if (i) 1281 OS << ", "; 1282 OS << FD->getParamDecl(i)->getType().stream(P); 1283 } 1284 1285 if (FT->isVariadic()) { 1286 if (NumParams > 0) 1287 OS << ", "; 1288 OS << "..."; 1289 } 1290 } 1291 OS << ')'; 1292 } else { 1293 OS << *cast<NamedDecl>(*I); 1294 } 1295 OS << "::"; 1296 } 1297 1298 if (getDeclName()) 1299 OS << *this; 1300 else 1301 OS << "<anonymous>"; 1302} 1303 1304void NamedDecl::getNameForDiagnostic(raw_ostream &OS, 1305 const PrintingPolicy &Policy, 1306 bool Qualified) const { 1307 if (Qualified) 1308 printQualifiedName(OS, Policy); 1309 else 1310 printName(OS); 1311} 1312 1313bool NamedDecl::declarationReplaces(NamedDecl *OldD) const { 1314 assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch"); 1315 1316 // UsingDirectiveDecl's are not really NamedDecl's, and all have same name. 1317 // We want to keep it, unless it nominates same namespace. 1318 if (getKind() == Decl::UsingDirective) { 1319 return cast<UsingDirectiveDecl>(this)->getNominatedNamespace() 1320 ->getOriginalNamespace() == 1321 cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace() 1322 ->getOriginalNamespace(); 1323 } 1324 1325 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) 1326 // For function declarations, we keep track of redeclarations. 1327 return FD->getPreviousDecl() == OldD; 1328 1329 // For function templates, the underlying function declarations are linked. 1330 if (const FunctionTemplateDecl *FunctionTemplate 1331 = dyn_cast<FunctionTemplateDecl>(this)) 1332 if (const FunctionTemplateDecl *OldFunctionTemplate 1333 = dyn_cast<FunctionTemplateDecl>(OldD)) 1334 return FunctionTemplate->getTemplatedDecl() 1335 ->declarationReplaces(OldFunctionTemplate->getTemplatedDecl()); 1336 1337 // For method declarations, we keep track of redeclarations. 1338 if (isa<ObjCMethodDecl>(this)) 1339 return false; 1340 1341 if (isa<ObjCInterfaceDecl>(this) && isa<ObjCCompatibleAliasDecl>(OldD)) 1342 return true; 1343 1344 if (isa<UsingShadowDecl>(this) && isa<UsingShadowDecl>(OldD)) 1345 return cast<UsingShadowDecl>(this)->getTargetDecl() == 1346 cast<UsingShadowDecl>(OldD)->getTargetDecl(); 1347 1348 if (isa<UsingDecl>(this) && isa<UsingDecl>(OldD)) { 1349 ASTContext &Context = getASTContext(); 1350 return Context.getCanonicalNestedNameSpecifier( 1351 cast<UsingDecl>(this)->getQualifier()) == 1352 Context.getCanonicalNestedNameSpecifier( 1353 cast<UsingDecl>(OldD)->getQualifier()); 1354 } 1355 1356 // A typedef of an Objective-C class type can replace an Objective-C class 1357 // declaration or definition, and vice versa. 1358 if ((isa<TypedefNameDecl>(this) && isa<ObjCInterfaceDecl>(OldD)) || 1359 (isa<ObjCInterfaceDecl>(this) && isa<TypedefNameDecl>(OldD))) 1360 return true; 1361 1362 // For non-function declarations, if the declarations are of the 1363 // same kind then this must be a redeclaration, or semantic analysis 1364 // would not have given us the new declaration. 1365 return this->getKind() == OldD->getKind(); 1366} 1367 1368bool NamedDecl::hasLinkage() const { 1369 return getFormalLinkage() != NoLinkage; 1370} 1371 1372NamedDecl *NamedDecl::getUnderlyingDeclImpl() { 1373 NamedDecl *ND = this; 1374 while (UsingShadowDecl *UD = dyn_cast<UsingShadowDecl>(ND)) 1375 ND = UD->getTargetDecl(); 1376 1377 if (ObjCCompatibleAliasDecl *AD = dyn_cast<ObjCCompatibleAliasDecl>(ND)) 1378 return AD->getClassInterface(); 1379 1380 return ND; 1381} 1382 1383bool NamedDecl::isCXXInstanceMember() const { 1384 if (!isCXXClassMember()) 1385 return false; 1386 1387 const NamedDecl *D = this; 1388 if (isa<UsingShadowDecl>(D)) 1389 D = cast<UsingShadowDecl>(D)->getTargetDecl(); 1390 1391 if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D) || isa<MSPropertyDecl>(D)) 1392 return true; 1393 if (isa<CXXMethodDecl>(D)) 1394 return cast<CXXMethodDecl>(D)->isInstance(); 1395 if (isa<FunctionTemplateDecl>(D)) 1396 return cast<CXXMethodDecl>(cast<FunctionTemplateDecl>(D) 1397 ->getTemplatedDecl())->isInstance(); 1398 return false; 1399} 1400 1401//===----------------------------------------------------------------------===// 1402// DeclaratorDecl Implementation 1403//===----------------------------------------------------------------------===// 1404 1405template <typename DeclT> 1406static SourceLocation getTemplateOrInnerLocStart(const DeclT *decl) { 1407 if (decl->getNumTemplateParameterLists() > 0) 1408 return decl->getTemplateParameterList(0)->getTemplateLoc(); 1409 else 1410 return decl->getInnerLocStart(); 1411} 1412 1413SourceLocation DeclaratorDecl::getTypeSpecStartLoc() const { 1414 TypeSourceInfo *TSI = getTypeSourceInfo(); 1415 if (TSI) return TSI->getTypeLoc().getBeginLoc(); 1416 return SourceLocation(); 1417} 1418 1419void DeclaratorDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) { 1420 if (QualifierLoc) { 1421 // Make sure the extended decl info is allocated. 1422 if (!hasExtInfo()) { 1423 // Save (non-extended) type source info pointer. 1424 TypeSourceInfo *savedTInfo = DeclInfo.get<TypeSourceInfo*>(); 1425 // Allocate external info struct. 1426 DeclInfo = new (getASTContext()) ExtInfo; 1427 // Restore savedTInfo into (extended) decl info. 1428 getExtInfo()->TInfo = savedTInfo; 1429 } 1430 // Set qualifier info. 1431 getExtInfo()->QualifierLoc = QualifierLoc; 1432 } else { 1433 // Here Qualifier == 0, i.e., we are removing the qualifier (if any). 1434 if (hasExtInfo()) { 1435 if (getExtInfo()->NumTemplParamLists == 0) { 1436 // Save type source info pointer. 1437 TypeSourceInfo *savedTInfo = getExtInfo()->TInfo; 1438 // Deallocate the extended decl info. 1439 getASTContext().Deallocate(getExtInfo()); 1440 // Restore savedTInfo into (non-extended) decl info. 1441 DeclInfo = savedTInfo; 1442 } 1443 else 1444 getExtInfo()->QualifierLoc = QualifierLoc; 1445 } 1446 } 1447} 1448 1449void 1450DeclaratorDecl::setTemplateParameterListsInfo(ASTContext &Context, 1451 unsigned NumTPLists, 1452 TemplateParameterList **TPLists) { 1453 assert(NumTPLists > 0); 1454 // Make sure the extended decl info is allocated. 1455 if (!hasExtInfo()) { 1456 // Save (non-extended) type source info pointer. 1457 TypeSourceInfo *savedTInfo = DeclInfo.get<TypeSourceInfo*>(); 1458 // Allocate external info struct. 1459 DeclInfo = new (getASTContext()) ExtInfo; 1460 // Restore savedTInfo into (extended) decl info. 1461 getExtInfo()->TInfo = savedTInfo; 1462 } 1463 // Set the template parameter lists info. 1464 getExtInfo()->setTemplateParameterListsInfo(Context, NumTPLists, TPLists); 1465} 1466 1467SourceLocation DeclaratorDecl::getOuterLocStart() const { 1468 return getTemplateOrInnerLocStart(this); 1469} 1470 1471namespace { 1472 1473// Helper function: returns true if QT is or contains a type 1474// having a postfix component. 1475bool typeIsPostfix(clang::QualType QT) { 1476 while (true) { 1477 const Type* T = QT.getTypePtr(); 1478 switch (T->getTypeClass()) { 1479 default: 1480 return false; 1481 case Type::Pointer: 1482 QT = cast<PointerType>(T)->getPointeeType(); 1483 break; 1484 case Type::BlockPointer: 1485 QT = cast<BlockPointerType>(T)->getPointeeType(); 1486 break; 1487 case Type::MemberPointer: 1488 QT = cast<MemberPointerType>(T)->getPointeeType(); 1489 break; 1490 case Type::LValueReference: 1491 case Type::RValueReference: 1492 QT = cast<ReferenceType>(T)->getPointeeType(); 1493 break; 1494 case Type::PackExpansion: 1495 QT = cast<PackExpansionType>(T)->getPattern(); 1496 break; 1497 case Type::Paren: 1498 case Type::ConstantArray: 1499 case Type::DependentSizedArray: 1500 case Type::IncompleteArray: 1501 case Type::VariableArray: 1502 case Type::FunctionProto: 1503 case Type::FunctionNoProto: 1504 return true; 1505 } 1506 } 1507} 1508 1509} // namespace 1510 1511SourceRange DeclaratorDecl::getSourceRange() const { 1512 SourceLocation RangeEnd = getLocation(); 1513 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) { 1514 if (typeIsPostfix(TInfo->getType())) 1515 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd(); 1516 } 1517 return SourceRange(getOuterLocStart(), RangeEnd); 1518} 1519 1520void 1521QualifierInfo::setTemplateParameterListsInfo(ASTContext &Context, 1522 unsigned NumTPLists, 1523 TemplateParameterList **TPLists) { 1524 assert((NumTPLists == 0 || TPLists != 0) && 1525 "Empty array of template parameters with positive size!"); 1526 1527 // Free previous template parameters (if any). 1528 if (NumTemplParamLists > 0) { 1529 Context.Deallocate(TemplParamLists); 1530 TemplParamLists = 0; 1531 NumTemplParamLists = 0; 1532 } 1533 // Set info on matched template parameter lists (if any). 1534 if (NumTPLists > 0) { 1535 TemplParamLists = new (Context) TemplateParameterList*[NumTPLists]; 1536 NumTemplParamLists = NumTPLists; 1537 for (unsigned i = NumTPLists; i-- > 0; ) 1538 TemplParamLists[i] = TPLists[i]; 1539 } 1540} 1541 1542//===----------------------------------------------------------------------===// 1543// VarDecl Implementation 1544//===----------------------------------------------------------------------===// 1545 1546const char *VarDecl::getStorageClassSpecifierString(StorageClass SC) { 1547 switch (SC) { 1548 case SC_None: break; 1549 case SC_Auto: return "auto"; 1550 case SC_Extern: return "extern"; 1551 case SC_OpenCLWorkGroupLocal: return "<<work-group-local>>"; 1552 case SC_PrivateExtern: return "__private_extern__"; 1553 case SC_Register: return "register"; 1554 case SC_Static: return "static"; 1555 } 1556 1557 llvm_unreachable("Invalid storage class"); 1558} 1559 1560VarDecl::VarDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc, 1561 SourceLocation IdLoc, IdentifierInfo *Id, QualType T, 1562 TypeSourceInfo *TInfo, StorageClass SC) 1563 : DeclaratorDecl(DK, DC, IdLoc, Id, T, TInfo, StartLoc), Init() { 1564 assert(sizeof(VarDeclBitfields) <= sizeof(unsigned)); 1565 assert(sizeof(ParmVarDeclBitfields) <= sizeof(unsigned)); 1566 AllBits = 0; 1567 VarDeclBits.SClass = SC; 1568 // Everything else is implicitly initialized to false. 1569} 1570 1571VarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, 1572 SourceLocation StartL, SourceLocation IdL, 1573 IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, 1574 StorageClass S) { 1575 return new (C) VarDecl(Var, DC, StartL, IdL, Id, T, TInfo, S); 1576} 1577 1578VarDecl *VarDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1579 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(VarDecl)); 1580 return new (Mem) VarDecl(Var, 0, SourceLocation(), SourceLocation(), 0, 1581 QualType(), 0, SC_None); 1582} 1583 1584void VarDecl::setStorageClass(StorageClass SC) { 1585 assert(isLegalForVariable(SC)); 1586 VarDeclBits.SClass = SC; 1587} 1588 1589SourceRange VarDecl::getSourceRange() const { 1590 if (const Expr *Init = getInit()) { 1591 SourceLocation InitEnd = Init->getLocEnd(); 1592 // If Init is implicit, ignore its source range and fallback on 1593 // DeclaratorDecl::getSourceRange() to handle postfix elements. 1594 if (InitEnd.isValid() && InitEnd != getLocation()) 1595 return SourceRange(getOuterLocStart(), InitEnd); 1596 } 1597 return DeclaratorDecl::getSourceRange(); 1598} 1599 1600template<typename T> 1601static LanguageLinkage getLanguageLinkageTemplate(const T &D) { 1602 // C++ [dcl.link]p1: All function types, function names with external linkage, 1603 // and variable names with external linkage have a language linkage. 1604 if (!D.hasExternalFormalLinkage()) 1605 return NoLanguageLinkage; 1606 1607 // Language linkage is a C++ concept, but saying that everything else in C has 1608 // C language linkage fits the implementation nicely. 1609 ASTContext &Context = D.getASTContext(); 1610 if (!Context.getLangOpts().CPlusPlus) 1611 return CLanguageLinkage; 1612 1613 // C++ [dcl.link]p4: A C language linkage is ignored in determining the 1614 // language linkage of the names of class members and the function type of 1615 // class member functions. 1616 const DeclContext *DC = D.getDeclContext(); 1617 if (DC->isRecord()) 1618 return CXXLanguageLinkage; 1619 1620 // If the first decl is in an extern "C" context, any other redeclaration 1621 // will have C language linkage. If the first one is not in an extern "C" 1622 // context, we would have reported an error for any other decl being in one. 1623 if (isFirstInExternCContext(&D)) 1624 return CLanguageLinkage; 1625 return CXXLanguageLinkage; 1626} 1627 1628template<typename T> 1629static bool isExternCTemplate(const T &D) { 1630 // Since the context is ignored for class members, they can only have C++ 1631 // language linkage or no language linkage. 1632 const DeclContext *DC = D.getDeclContext(); 1633 if (DC->isRecord()) { 1634 assert(D.getASTContext().getLangOpts().CPlusPlus); 1635 return false; 1636 } 1637 1638 return D.getLanguageLinkage() == CLanguageLinkage; 1639} 1640 1641LanguageLinkage VarDecl::getLanguageLinkage() const { 1642 return getLanguageLinkageTemplate(*this); 1643} 1644 1645bool VarDecl::isExternC() const { 1646 return isExternCTemplate(*this); 1647} 1648 1649static bool isLinkageSpecContext(const DeclContext *DC, 1650 LinkageSpecDecl::LanguageIDs ID) { 1651 while (DC->getDeclKind() != Decl::TranslationUnit) { 1652 if (DC->getDeclKind() == Decl::LinkageSpec) 1653 return cast<LinkageSpecDecl>(DC)->getLanguage() == ID; 1654 DC = DC->getParent(); 1655 } 1656 return false; 1657} 1658 1659template <typename T> 1660static bool isInLanguageSpecContext(T *D, LinkageSpecDecl::LanguageIDs ID) { 1661 return isLinkageSpecContext(D->getLexicalDeclContext(), ID); 1662} 1663 1664bool VarDecl::isInExternCContext() const { 1665 return isInLanguageSpecContext(this, LinkageSpecDecl::lang_c); 1666} 1667 1668bool VarDecl::isInExternCXXContext() const { 1669 return isInLanguageSpecContext(this, LinkageSpecDecl::lang_cxx); 1670} 1671 1672VarDecl *VarDecl::getCanonicalDecl() { 1673 return getFirstDeclaration(); 1674} 1675 1676VarDecl::DefinitionKind VarDecl::isThisDeclarationADefinition( 1677 ASTContext &C) const 1678{ 1679 // C++ [basic.def]p2: 1680 // A declaration is a definition unless [...] it contains the 'extern' 1681 // specifier or a linkage-specification and neither an initializer [...], 1682 // it declares a static data member in a class declaration [...]. 1683 // C++ [temp.expl.spec]p15: 1684 // An explicit specialization of a static data member of a template is a 1685 // definition if the declaration includes an initializer; otherwise, it is 1686 // a declaration. 1687 if (isStaticDataMember()) { 1688 if (isOutOfLine() && (hasInit() || 1689 getTemplateSpecializationKind() != TSK_ExplicitSpecialization)) 1690 return Definition; 1691 else 1692 return DeclarationOnly; 1693 } 1694 // C99 6.7p5: 1695 // A definition of an identifier is a declaration for that identifier that 1696 // [...] causes storage to be reserved for that object. 1697 // Note: that applies for all non-file-scope objects. 1698 // C99 6.9.2p1: 1699 // If the declaration of an identifier for an object has file scope and an 1700 // initializer, the declaration is an external definition for the identifier 1701 if (hasInit()) 1702 return Definition; 1703 1704 if (hasExternalStorage()) 1705 return DeclarationOnly; 1706 1707 // [dcl.link] p7: 1708 // A declaration directly contained in a linkage-specification is treated 1709 // as if it contains the extern specifier for the purpose of determining 1710 // the linkage of the declared name and whether it is a definition. 1711 if (isSingleLineExternC(*this)) 1712 return DeclarationOnly; 1713 1714 // C99 6.9.2p2: 1715 // A declaration of an object that has file scope without an initializer, 1716 // and without a storage class specifier or the scs 'static', constitutes 1717 // a tentative definition. 1718 // No such thing in C++. 1719 if (!C.getLangOpts().CPlusPlus && isFileVarDecl()) 1720 return TentativeDefinition; 1721 1722 // What's left is (in C, block-scope) declarations without initializers or 1723 // external storage. These are definitions. 1724 return Definition; 1725} 1726 1727VarDecl *VarDecl::getActingDefinition() { 1728 DefinitionKind Kind = isThisDeclarationADefinition(); 1729 if (Kind != TentativeDefinition) 1730 return 0; 1731 1732 VarDecl *LastTentative = 0; 1733 VarDecl *First = getFirstDeclaration(); 1734 for (redecl_iterator I = First->redecls_begin(), E = First->redecls_end(); 1735 I != E; ++I) { 1736 Kind = (*I)->isThisDeclarationADefinition(); 1737 if (Kind == Definition) 1738 return 0; 1739 else if (Kind == TentativeDefinition) 1740 LastTentative = *I; 1741 } 1742 return LastTentative; 1743} 1744 1745VarDecl *VarDecl::getDefinition(ASTContext &C) { 1746 VarDecl *First = getFirstDeclaration(); 1747 for (redecl_iterator I = First->redecls_begin(), E = First->redecls_end(); 1748 I != E; ++I) { 1749 if ((*I)->isThisDeclarationADefinition(C) == Definition) 1750 return *I; 1751 } 1752 return 0; 1753} 1754 1755VarDecl::DefinitionKind VarDecl::hasDefinition(ASTContext &C) const { 1756 DefinitionKind Kind = DeclarationOnly; 1757 1758 const VarDecl *First = getFirstDeclaration(); 1759 for (redecl_iterator I = First->redecls_begin(), E = First->redecls_end(); 1760 I != E; ++I) { 1761 Kind = std::max(Kind, (*I)->isThisDeclarationADefinition(C)); 1762 if (Kind == Definition) 1763 break; 1764 } 1765 1766 return Kind; 1767} 1768 1769const Expr *VarDecl::getAnyInitializer(const VarDecl *&D) const { 1770 redecl_iterator I = redecls_begin(), E = redecls_end(); 1771 while (I != E && !I->getInit()) 1772 ++I; 1773 1774 if (I != E) { 1775 D = *I; 1776 return I->getInit(); 1777 } 1778 return 0; 1779} 1780 1781bool VarDecl::isOutOfLine() const { 1782 if (Decl::isOutOfLine()) 1783 return true; 1784 1785 if (!isStaticDataMember()) 1786 return false; 1787 1788 // If this static data member was instantiated from a static data member of 1789 // a class template, check whether that static data member was defined 1790 // out-of-line. 1791 if (VarDecl *VD = getInstantiatedFromStaticDataMember()) 1792 return VD->isOutOfLine(); 1793 1794 return false; 1795} 1796 1797VarDecl *VarDecl::getOutOfLineDefinition() { 1798 if (!isStaticDataMember()) 1799 return 0; 1800 1801 for (VarDecl::redecl_iterator RD = redecls_begin(), RDEnd = redecls_end(); 1802 RD != RDEnd; ++RD) { 1803 if (RD->getLexicalDeclContext()->isFileContext()) 1804 return *RD; 1805 } 1806 1807 return 0; 1808} 1809 1810void VarDecl::setInit(Expr *I) { 1811 if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>()) { 1812 Eval->~EvaluatedStmt(); 1813 getASTContext().Deallocate(Eval); 1814 } 1815 1816 Init = I; 1817} 1818 1819bool VarDecl::isUsableInConstantExpressions(ASTContext &C) const { 1820 const LangOptions &Lang = C.getLangOpts(); 1821 1822 if (!Lang.CPlusPlus) 1823 return false; 1824 1825 // In C++11, any variable of reference type can be used in a constant 1826 // expression if it is initialized by a constant expression. 1827 if (Lang.CPlusPlus11 && getType()->isReferenceType()) 1828 return true; 1829 1830 // Only const objects can be used in constant expressions in C++. C++98 does 1831 // not require the variable to be non-volatile, but we consider this to be a 1832 // defect. 1833 if (!getType().isConstQualified() || getType().isVolatileQualified()) 1834 return false; 1835 1836 // In C++, const, non-volatile variables of integral or enumeration types 1837 // can be used in constant expressions. 1838 if (getType()->isIntegralOrEnumerationType()) 1839 return true; 1840 1841 // Additionally, in C++11, non-volatile constexpr variables can be used in 1842 // constant expressions. 1843 return Lang.CPlusPlus11 && isConstexpr(); 1844} 1845 1846/// Convert the initializer for this declaration to the elaborated EvaluatedStmt 1847/// form, which contains extra information on the evaluated value of the 1848/// initializer. 1849EvaluatedStmt *VarDecl::ensureEvaluatedStmt() const { 1850 EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>(); 1851 if (!Eval) { 1852 Stmt *S = Init.get<Stmt *>(); 1853 // Note: EvaluatedStmt contains an APValue, which usually holds 1854 // resources not allocated from the ASTContext. We need to do some 1855 // work to avoid leaking those, but we do so in VarDecl::evaluateValue 1856 // where we can detect whether there's anything to clean up or not. 1857 Eval = new (getASTContext()) EvaluatedStmt; 1858 Eval->Value = S; 1859 Init = Eval; 1860 } 1861 return Eval; 1862} 1863 1864APValue *VarDecl::evaluateValue() const { 1865 SmallVector<PartialDiagnosticAt, 8> Notes; 1866 return evaluateValue(Notes); 1867} 1868 1869namespace { 1870// Destroy an APValue that was allocated in an ASTContext. 1871void DestroyAPValue(void* UntypedValue) { 1872 static_cast<APValue*>(UntypedValue)->~APValue(); 1873} 1874} // namespace 1875 1876APValue *VarDecl::evaluateValue( 1877 SmallVectorImpl<PartialDiagnosticAt> &Notes) const { 1878 EvaluatedStmt *Eval = ensureEvaluatedStmt(); 1879 1880 // We only produce notes indicating why an initializer is non-constant the 1881 // first time it is evaluated. FIXME: The notes won't always be emitted the 1882 // first time we try evaluation, so might not be produced at all. 1883 if (Eval->WasEvaluated) 1884 return Eval->Evaluated.isUninit() ? 0 : &Eval->Evaluated; 1885 1886 const Expr *Init = cast<Expr>(Eval->Value); 1887 assert(!Init->isValueDependent()); 1888 1889 if (Eval->IsEvaluating) { 1890 // FIXME: Produce a diagnostic for self-initialization. 1891 Eval->CheckedICE = true; 1892 Eval->IsICE = false; 1893 return 0; 1894 } 1895 1896 Eval->IsEvaluating = true; 1897 1898 bool Result = Init->EvaluateAsInitializer(Eval->Evaluated, getASTContext(), 1899 this, Notes); 1900 1901 // Ensure the computed APValue is cleaned up later if evaluation succeeded, 1902 // or that it's empty (so that there's nothing to clean up) if evaluation 1903 // failed. 1904 if (!Result) 1905 Eval->Evaluated = APValue(); 1906 else if (Eval->Evaluated.needsCleanup()) 1907 getASTContext().AddDeallocation(DestroyAPValue, &Eval->Evaluated); 1908 1909 Eval->IsEvaluating = false; 1910 Eval->WasEvaluated = true; 1911 1912 // In C++11, we have determined whether the initializer was a constant 1913 // expression as a side-effect. 1914 if (getASTContext().getLangOpts().CPlusPlus11 && !Eval->CheckedICE) { 1915 Eval->CheckedICE = true; 1916 Eval->IsICE = Result && Notes.empty(); 1917 } 1918 1919 return Result ? &Eval->Evaluated : 0; 1920} 1921 1922bool VarDecl::checkInitIsICE() const { 1923 // Initializers of weak variables are never ICEs. 1924 if (isWeak()) 1925 return false; 1926 1927 EvaluatedStmt *Eval = ensureEvaluatedStmt(); 1928 if (Eval->CheckedICE) 1929 // We have already checked whether this subexpression is an 1930 // integral constant expression. 1931 return Eval->IsICE; 1932 1933 const Expr *Init = cast<Expr>(Eval->Value); 1934 assert(!Init->isValueDependent()); 1935 1936 // In C++11, evaluate the initializer to check whether it's a constant 1937 // expression. 1938 if (getASTContext().getLangOpts().CPlusPlus11) { 1939 SmallVector<PartialDiagnosticAt, 8> Notes; 1940 evaluateValue(Notes); 1941 return Eval->IsICE; 1942 } 1943 1944 // It's an ICE whether or not the definition we found is 1945 // out-of-line. See DR 721 and the discussion in Clang PR 1946 // 6206 for details. 1947 1948 if (Eval->CheckingICE) 1949 return false; 1950 Eval->CheckingICE = true; 1951 1952 Eval->IsICE = Init->isIntegerConstantExpr(getASTContext()); 1953 Eval->CheckingICE = false; 1954 Eval->CheckedICE = true; 1955 return Eval->IsICE; 1956} 1957 1958VarDecl *VarDecl::getInstantiatedFromStaticDataMember() const { 1959 if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) 1960 return cast<VarDecl>(MSI->getInstantiatedFrom()); 1961 1962 return 0; 1963} 1964 1965TemplateSpecializationKind VarDecl::getTemplateSpecializationKind() const { 1966 if (const VarTemplateSpecializationDecl *Spec = 1967 dyn_cast<VarTemplateSpecializationDecl>(this)) 1968 return Spec->getSpecializationKind(); 1969 1970 if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) 1971 return MSI->getTemplateSpecializationKind(); 1972 1973 return TSK_Undeclared; 1974} 1975 1976VarTemplateDecl *VarDecl::getDescribedVarTemplate() const { 1977 return getASTContext().getTemplateOrSpecializationInfo(this) 1978 .dyn_cast<VarTemplateDecl *>(); 1979} 1980 1981void VarDecl::setDescribedVarTemplate(VarTemplateDecl *Template) { 1982 getASTContext().setTemplateOrSpecializationInfo(this, Template); 1983} 1984 1985MemberSpecializationInfo *VarDecl::getMemberSpecializationInfo() const { 1986 if (isStaticDataMember()) 1987 // FIXME: Remove ? 1988 // return getASTContext().getInstantiatedFromStaticDataMember(this); 1989 return getASTContext().getTemplateOrSpecializationInfo(this) 1990 .dyn_cast<MemberSpecializationInfo *>(); 1991 return 0; 1992} 1993 1994void VarDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK, 1995 SourceLocation PointOfInstantiation) { 1996 if (VarTemplateSpecializationDecl *Spec = 1997 dyn_cast<VarTemplateSpecializationDecl>(this)) { 1998 Spec->setSpecializationKind(TSK); 1999 if (TSK != TSK_ExplicitSpecialization && PointOfInstantiation.isValid() && 2000 Spec->getPointOfInstantiation().isInvalid()) 2001 Spec->setPointOfInstantiation(PointOfInstantiation); 2002 return; 2003 } 2004 2005 if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) { 2006 MSI->setTemplateSpecializationKind(TSK); 2007 if (TSK != TSK_ExplicitSpecialization && PointOfInstantiation.isValid() && 2008 MSI->getPointOfInstantiation().isInvalid()) 2009 MSI->setPointOfInstantiation(PointOfInstantiation); 2010 return; 2011 } 2012 2013 llvm_unreachable( 2014 "Not a variable or static data member template specialization"); 2015} 2016 2017void 2018VarDecl::setInstantiationOfStaticDataMember(VarDecl *VD, 2019 TemplateSpecializationKind TSK) { 2020 assert(getASTContext().getTemplateOrSpecializationInfo(this).isNull() && 2021 "Previous template or instantiation?"); 2022 getASTContext().setInstantiatedFromStaticDataMember(this, VD, TSK); 2023} 2024 2025//===----------------------------------------------------------------------===// 2026// ParmVarDecl Implementation 2027//===----------------------------------------------------------------------===// 2028 2029ParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC, 2030 SourceLocation StartLoc, 2031 SourceLocation IdLoc, IdentifierInfo *Id, 2032 QualType T, TypeSourceInfo *TInfo, 2033 StorageClass S, Expr *DefArg) { 2034 return new (C) ParmVarDecl(ParmVar, DC, StartLoc, IdLoc, Id, T, TInfo, 2035 S, DefArg); 2036} 2037 2038QualType ParmVarDecl::getOriginalType() const { 2039 TypeSourceInfo *TSI = getTypeSourceInfo(); 2040 QualType T = TSI ? TSI->getType() : getType(); 2041 if (const DecayedType *DT = dyn_cast<DecayedType>(T)) 2042 return DT->getOriginalType(); 2043 return T; 2044} 2045 2046ParmVarDecl *ParmVarDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2047 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ParmVarDecl)); 2048 return new (Mem) ParmVarDecl(ParmVar, 0, SourceLocation(), SourceLocation(), 2049 0, QualType(), 0, SC_None, 0); 2050} 2051 2052SourceRange ParmVarDecl::getSourceRange() const { 2053 if (!hasInheritedDefaultArg()) { 2054 SourceRange ArgRange = getDefaultArgRange(); 2055 if (ArgRange.isValid()) 2056 return SourceRange(getOuterLocStart(), ArgRange.getEnd()); 2057 } 2058 2059 // DeclaratorDecl considers the range of postfix types as overlapping with the 2060 // declaration name, but this is not the case with parameters in ObjC methods. 2061 if (isa<ObjCMethodDecl>(getDeclContext())) 2062 return SourceRange(DeclaratorDecl::getLocStart(), getLocation()); 2063 2064 return DeclaratorDecl::getSourceRange(); 2065} 2066 2067Expr *ParmVarDecl::getDefaultArg() { 2068 assert(!hasUnparsedDefaultArg() && "Default argument is not yet parsed!"); 2069 assert(!hasUninstantiatedDefaultArg() && 2070 "Default argument is not yet instantiated!"); 2071 2072 Expr *Arg = getInit(); 2073 if (ExprWithCleanups *E = dyn_cast_or_null<ExprWithCleanups>(Arg)) 2074 return E->getSubExpr(); 2075 2076 return Arg; 2077} 2078 2079SourceRange ParmVarDecl::getDefaultArgRange() const { 2080 if (const Expr *E = getInit()) 2081 return E->getSourceRange(); 2082 2083 if (hasUninstantiatedDefaultArg()) 2084 return getUninstantiatedDefaultArg()->getSourceRange(); 2085 2086 return SourceRange(); 2087} 2088 2089bool ParmVarDecl::isParameterPack() const { 2090 return isa<PackExpansionType>(getType()); 2091} 2092 2093void ParmVarDecl::setParameterIndexLarge(unsigned parameterIndex) { 2094 getASTContext().setParameterIndex(this, parameterIndex); 2095 ParmVarDeclBits.ParameterIndex = ParameterIndexSentinel; 2096} 2097 2098unsigned ParmVarDecl::getParameterIndexLarge() const { 2099 return getASTContext().getParameterIndex(this); 2100} 2101 2102//===----------------------------------------------------------------------===// 2103// FunctionDecl Implementation 2104//===----------------------------------------------------------------------===// 2105 2106void FunctionDecl::getNameForDiagnostic( 2107 raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const { 2108 NamedDecl::getNameForDiagnostic(OS, Policy, Qualified); 2109 const TemplateArgumentList *TemplateArgs = getTemplateSpecializationArgs(); 2110 if (TemplateArgs) 2111 TemplateSpecializationType::PrintTemplateArgumentList( 2112 OS, TemplateArgs->data(), TemplateArgs->size(), Policy); 2113} 2114 2115bool FunctionDecl::isVariadic() const { 2116 if (const FunctionProtoType *FT = getType()->getAs<FunctionProtoType>()) 2117 return FT->isVariadic(); 2118 return false; 2119} 2120 2121bool FunctionDecl::hasBody(const FunctionDecl *&Definition) const { 2122 for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { 2123 if (I->Body || I->IsLateTemplateParsed) { 2124 Definition = *I; 2125 return true; 2126 } 2127 } 2128 2129 return false; 2130} 2131 2132bool FunctionDecl::hasTrivialBody() const 2133{ 2134 Stmt *S = getBody(); 2135 if (!S) { 2136 // Since we don't have a body for this function, we don't know if it's 2137 // trivial or not. 2138 return false; 2139 } 2140 2141 if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty()) 2142 return true; 2143 return false; 2144} 2145 2146bool FunctionDecl::isDefined(const FunctionDecl *&Definition) const { 2147 for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { 2148 if (I->IsDeleted || I->IsDefaulted || I->Body || I->IsLateTemplateParsed) { 2149 Definition = I->IsDeleted ? I->getCanonicalDecl() : *I; 2150 return true; 2151 } 2152 } 2153 2154 return false; 2155} 2156 2157Stmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const { 2158 for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { 2159 if (I->Body) { 2160 Definition = *I; 2161 return I->Body.get(getASTContext().getExternalSource()); 2162 } else if (I->IsLateTemplateParsed) { 2163 Definition = *I; 2164 return 0; 2165 } 2166 } 2167 2168 return 0; 2169} 2170 2171void FunctionDecl::setBody(Stmt *B) { 2172 Body = B; 2173 if (B) 2174 EndRangeLoc = B->getLocEnd(); 2175} 2176 2177void FunctionDecl::setPure(bool P) { 2178 IsPure = P; 2179 if (P) 2180 if (CXXRecordDecl *Parent = dyn_cast<CXXRecordDecl>(getDeclContext())) 2181 Parent->markedVirtualFunctionPure(); 2182} 2183 2184template<std::size_t Len> 2185static bool isNamed(const NamedDecl *ND, const char (&Str)[Len]) { 2186 IdentifierInfo *II = ND->getIdentifier(); 2187 return II && II->isStr(Str); 2188} 2189 2190bool FunctionDecl::isMain() const { 2191 const TranslationUnitDecl *tunit = 2192 dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext()); 2193 return tunit && 2194 !tunit->getASTContext().getLangOpts().Freestanding && 2195 isNamed(this, "main"); 2196} 2197 2198bool FunctionDecl::isReservedGlobalPlacementOperator() const { 2199 assert(getDeclName().getNameKind() == DeclarationName::CXXOperatorName); 2200 assert(getDeclName().getCXXOverloadedOperator() == OO_New || 2201 getDeclName().getCXXOverloadedOperator() == OO_Delete || 2202 getDeclName().getCXXOverloadedOperator() == OO_Array_New || 2203 getDeclName().getCXXOverloadedOperator() == OO_Array_Delete); 2204 2205 if (isa<CXXRecordDecl>(getDeclContext())) return false; 2206 assert(getDeclContext()->getRedeclContext()->isTranslationUnit()); 2207 2208 const FunctionProtoType *proto = getType()->castAs<FunctionProtoType>(); 2209 if (proto->getNumArgs() != 2 || proto->isVariadic()) return false; 2210 2211 ASTContext &Context = 2212 cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext()) 2213 ->getASTContext(); 2214 2215 // The result type and first argument type are constant across all 2216 // these operators. The second argument must be exactly void*. 2217 return (proto->getArgType(1).getCanonicalType() == Context.VoidPtrTy); 2218} 2219 2220static bool isNamespaceStd(const DeclContext *DC) { 2221 const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC->getRedeclContext()); 2222 return ND && isNamed(ND, "std") && 2223 ND->getParent()->getRedeclContext()->isTranslationUnit(); 2224} 2225 2226bool FunctionDecl::isReplaceableGlobalAllocationFunction() const { 2227 if (getDeclName().getNameKind() != DeclarationName::CXXOperatorName) 2228 return false; 2229 if (getDeclName().getCXXOverloadedOperator() != OO_New && 2230 getDeclName().getCXXOverloadedOperator() != OO_Delete && 2231 getDeclName().getCXXOverloadedOperator() != OO_Array_New && 2232 getDeclName().getCXXOverloadedOperator() != OO_Array_Delete) 2233 return false; 2234 2235 if (isa<CXXRecordDecl>(getDeclContext())) 2236 return false; 2237 assert(getDeclContext()->getRedeclContext()->isTranslationUnit()); 2238 2239 const FunctionProtoType *FPT = getType()->castAs<FunctionProtoType>(); 2240 if (FPT->getNumArgs() > 2 || FPT->isVariadic()) 2241 return false; 2242 2243 // If this is a single-parameter function, it must be a replaceable global 2244 // allocation or deallocation function. 2245 if (FPT->getNumArgs() == 1) 2246 return true; 2247 2248 // Otherwise, we're looking for a second parameter whose type is 2249 // 'const std::nothrow_t &'. 2250 QualType Ty = FPT->getArgType(1); 2251 if (!Ty->isReferenceType()) 2252 return false; 2253 Ty = Ty->getPointeeType(); 2254 if (Ty.getCVRQualifiers() != Qualifiers::Const) 2255 return false; 2256 // FIXME: Recognise nothrow_t in an inline namespace inside std? 2257 const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl(); 2258 return RD && isNamed(RD, "nothrow_t") && isNamespaceStd(RD->getDeclContext()); 2259} 2260 2261LanguageLinkage FunctionDecl::getLanguageLinkage() const { 2262 // Users expect to be able to write 2263 // extern "C" void *__builtin_alloca (size_t); 2264 // so consider builtins as having C language linkage. 2265 if (getBuiltinID()) 2266 return CLanguageLinkage; 2267 2268 return getLanguageLinkageTemplate(*this); 2269} 2270 2271bool FunctionDecl::isExternC() const { 2272 return isExternCTemplate(*this); 2273} 2274 2275bool FunctionDecl::isInExternCContext() const { 2276 return isInLanguageSpecContext(this, LinkageSpecDecl::lang_c); 2277} 2278 2279bool FunctionDecl::isInExternCXXContext() const { 2280 return isInLanguageSpecContext(this, LinkageSpecDecl::lang_cxx); 2281} 2282 2283bool FunctionDecl::isGlobal() const { 2284 if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(this)) 2285 return Method->isStatic(); 2286 2287 if (getCanonicalDecl()->getStorageClass() == SC_Static) 2288 return false; 2289 2290 for (const DeclContext *DC = getDeclContext(); 2291 DC->isNamespace(); 2292 DC = DC->getParent()) { 2293 if (const NamespaceDecl *Namespace = cast<NamespaceDecl>(DC)) { 2294 if (!Namespace->getDeclName()) 2295 return false; 2296 break; 2297 } 2298 } 2299 2300 return true; 2301} 2302 2303bool FunctionDecl::isNoReturn() const { 2304 return hasAttr<NoReturnAttr>() || hasAttr<CXX11NoReturnAttr>() || 2305 hasAttr<C11NoReturnAttr>() || 2306 getType()->getAs<FunctionType>()->getNoReturnAttr(); 2307} 2308 2309void 2310FunctionDecl::setPreviousDeclaration(FunctionDecl *PrevDecl) { 2311 redeclarable_base::setPreviousDeclaration(PrevDecl); 2312 2313 if (FunctionTemplateDecl *FunTmpl = getDescribedFunctionTemplate()) { 2314 FunctionTemplateDecl *PrevFunTmpl 2315 = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : 0; 2316 assert((!PrevDecl || PrevFunTmpl) && "Function/function template mismatch"); 2317 FunTmpl->setPreviousDeclaration(PrevFunTmpl); 2318 } 2319 2320 if (PrevDecl && PrevDecl->IsInline) 2321 IsInline = true; 2322} 2323 2324const FunctionDecl *FunctionDecl::getCanonicalDecl() const { 2325 return getFirstDeclaration(); 2326} 2327 2328FunctionDecl *FunctionDecl::getCanonicalDecl() { 2329 return getFirstDeclaration(); 2330} 2331 2332/// \brief Returns a value indicating whether this function 2333/// corresponds to a builtin function. 2334/// 2335/// The function corresponds to a built-in function if it is 2336/// declared at translation scope or within an extern "C" block and 2337/// its name matches with the name of a builtin. The returned value 2338/// will be 0 for functions that do not correspond to a builtin, a 2339/// value of type \c Builtin::ID if in the target-independent range 2340/// \c [1,Builtin::First), or a target-specific builtin value. 2341unsigned FunctionDecl::getBuiltinID() const { 2342 if (!getIdentifier()) 2343 return 0; 2344 2345 unsigned BuiltinID = getIdentifier()->getBuiltinID(); 2346 if (!BuiltinID) 2347 return 0; 2348 2349 ASTContext &Context = getASTContext(); 2350 if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) 2351 return BuiltinID; 2352 2353 // This function has the name of a known C library 2354 // function. Determine whether it actually refers to the C library 2355 // function or whether it just has the same name. 2356 2357 // If this is a static function, it's not a builtin. 2358 if (getStorageClass() == SC_Static) 2359 return 0; 2360 2361 // If this function is at translation-unit scope and we're not in 2362 // C++, it refers to the C library function. 2363 if (!Context.getLangOpts().CPlusPlus && 2364 getDeclContext()->isTranslationUnit()) 2365 return BuiltinID; 2366 2367 // If the function is in an extern "C" linkage specification and is 2368 // not marked "overloadable", it's the real function. 2369 if (isa<LinkageSpecDecl>(getDeclContext()) && 2370 cast<LinkageSpecDecl>(getDeclContext())->getLanguage() 2371 == LinkageSpecDecl::lang_c && 2372 !getAttr<OverloadableAttr>()) 2373 return BuiltinID; 2374 2375 // Not a builtin 2376 return 0; 2377} 2378 2379 2380/// getNumParams - Return the number of parameters this function must have 2381/// based on its FunctionType. This is the length of the ParamInfo array 2382/// after it has been created. 2383unsigned FunctionDecl::getNumParams() const { 2384 const FunctionType *FT = getType()->castAs<FunctionType>(); 2385 if (isa<FunctionNoProtoType>(FT)) 2386 return 0; 2387 return cast<FunctionProtoType>(FT)->getNumArgs(); 2388 2389} 2390 2391void FunctionDecl::setParams(ASTContext &C, 2392 ArrayRef<ParmVarDecl *> NewParamInfo) { 2393 assert(ParamInfo == 0 && "Already has param info!"); 2394 assert(NewParamInfo.size() == getNumParams() && "Parameter count mismatch!"); 2395 2396 // Zero params -> null pointer. 2397 if (!NewParamInfo.empty()) { 2398 ParamInfo = new (C) ParmVarDecl*[NewParamInfo.size()]; 2399 std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo); 2400 } 2401} 2402 2403void FunctionDecl::setDeclsInPrototypeScope(ArrayRef<NamedDecl *> NewDecls) { 2404 assert(DeclsInPrototypeScope.empty() && "Already has prototype decls!"); 2405 2406 if (!NewDecls.empty()) { 2407 NamedDecl **A = new (getASTContext()) NamedDecl*[NewDecls.size()]; 2408 std::copy(NewDecls.begin(), NewDecls.end(), A); 2409 DeclsInPrototypeScope = ArrayRef<NamedDecl *>(A, NewDecls.size()); 2410 } 2411} 2412 2413/// getMinRequiredArguments - Returns the minimum number of arguments 2414/// needed to call this function. This may be fewer than the number of 2415/// function parameters, if some of the parameters have default 2416/// arguments (in C++) or the last parameter is a parameter pack. 2417unsigned FunctionDecl::getMinRequiredArguments() const { 2418 if (!getASTContext().getLangOpts().CPlusPlus) 2419 return getNumParams(); 2420 2421 unsigned NumRequiredArgs = getNumParams(); 2422 2423 // If the last parameter is a parameter pack, we don't need an argument for 2424 // it. 2425 if (NumRequiredArgs > 0 && 2426 getParamDecl(NumRequiredArgs - 1)->isParameterPack()) 2427 --NumRequiredArgs; 2428 2429 // If this parameter has a default argument, we don't need an argument for 2430 // it. 2431 while (NumRequiredArgs > 0 && 2432 getParamDecl(NumRequiredArgs-1)->hasDefaultArg()) 2433 --NumRequiredArgs; 2434 2435 // We might have parameter packs before the end. These can't be deduced, 2436 // but they can still handle multiple arguments. 2437 unsigned ArgIdx = NumRequiredArgs; 2438 while (ArgIdx > 0) { 2439 if (getParamDecl(ArgIdx - 1)->isParameterPack()) 2440 NumRequiredArgs = ArgIdx; 2441 2442 --ArgIdx; 2443 } 2444 2445 return NumRequiredArgs; 2446} 2447 2448static bool RedeclForcesDefC99(const FunctionDecl *Redecl) { 2449 // Only consider file-scope declarations in this test. 2450 if (!Redecl->getLexicalDeclContext()->isTranslationUnit()) 2451 return false; 2452 2453 // Only consider explicit declarations; the presence of a builtin for a 2454 // libcall shouldn't affect whether a definition is externally visible. 2455 if (Redecl->isImplicit()) 2456 return false; 2457 2458 if (!Redecl->isInlineSpecified() || Redecl->getStorageClass() == SC_Extern) 2459 return true; // Not an inline definition 2460 2461 return false; 2462} 2463 2464/// \brief For a function declaration in C or C++, determine whether this 2465/// declaration causes the definition to be externally visible. 2466/// 2467/// Specifically, this determines if adding the current declaration to the set 2468/// of redeclarations of the given functions causes 2469/// isInlineDefinitionExternallyVisible to change from false to true. 2470bool FunctionDecl::doesDeclarationForceExternallyVisibleDefinition() const { 2471 assert(!doesThisDeclarationHaveABody() && 2472 "Must have a declaration without a body."); 2473 2474 ASTContext &Context = getASTContext(); 2475 2476 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) { 2477 // With GNU inlining, a declaration with 'inline' but not 'extern', forces 2478 // an externally visible definition. 2479 // 2480 // FIXME: What happens if gnu_inline gets added on after the first 2481 // declaration? 2482 if (!isInlineSpecified() || getStorageClass() == SC_Extern) 2483 return false; 2484 2485 const FunctionDecl *Prev = this; 2486 bool FoundBody = false; 2487 while ((Prev = Prev->getPreviousDecl())) { 2488 FoundBody |= Prev->Body.isValid(); 2489 2490 if (Prev->Body) { 2491 // If it's not the case that both 'inline' and 'extern' are 2492 // specified on the definition, then it is always externally visible. 2493 if (!Prev->isInlineSpecified() || 2494 Prev->getStorageClass() != SC_Extern) 2495 return false; 2496 } else if (Prev->isInlineSpecified() && 2497 Prev->getStorageClass() != SC_Extern) { 2498 return false; 2499 } 2500 } 2501 return FoundBody; 2502 } 2503 2504 if (Context.getLangOpts().CPlusPlus) 2505 return false; 2506 2507 // C99 6.7.4p6: 2508 // [...] If all of the file scope declarations for a function in a 2509 // translation unit include the inline function specifier without extern, 2510 // then the definition in that translation unit is an inline definition. 2511 if (isInlineSpecified() && getStorageClass() != SC_Extern) 2512 return false; 2513 const FunctionDecl *Prev = this; 2514 bool FoundBody = false; 2515 while ((Prev = Prev->getPreviousDecl())) { 2516 FoundBody |= Prev->Body.isValid(); 2517 if (RedeclForcesDefC99(Prev)) 2518 return false; 2519 } 2520 return FoundBody; 2521} 2522 2523/// \brief For an inline function definition in C, or for a gnu_inline function 2524/// in C++, determine whether the definition will be externally visible. 2525/// 2526/// Inline function definitions are always available for inlining optimizations. 2527/// However, depending on the language dialect, declaration specifiers, and 2528/// attributes, the definition of an inline function may or may not be 2529/// "externally" visible to other translation units in the program. 2530/// 2531/// In C99, inline definitions are not externally visible by default. However, 2532/// if even one of the global-scope declarations is marked "extern inline", the 2533/// inline definition becomes externally visible (C99 6.7.4p6). 2534/// 2535/// In GNU89 mode, or if the gnu_inline attribute is attached to the function 2536/// definition, we use the GNU semantics for inline, which are nearly the 2537/// opposite of C99 semantics. In particular, "inline" by itself will create 2538/// an externally visible symbol, but "extern inline" will not create an 2539/// externally visible symbol. 2540bool FunctionDecl::isInlineDefinitionExternallyVisible() const { 2541 assert(doesThisDeclarationHaveABody() && "Must have the function definition"); 2542 assert(isInlined() && "Function must be inline"); 2543 ASTContext &Context = getASTContext(); 2544 2545 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) { 2546 // Note: If you change the logic here, please change 2547 // doesDeclarationForceExternallyVisibleDefinition as well. 2548 // 2549 // If it's not the case that both 'inline' and 'extern' are 2550 // specified on the definition, then this inline definition is 2551 // externally visible. 2552 if (!(isInlineSpecified() && getStorageClass() == SC_Extern)) 2553 return true; 2554 2555 // If any declaration is 'inline' but not 'extern', then this definition 2556 // is externally visible. 2557 for (redecl_iterator Redecl = redecls_begin(), RedeclEnd = redecls_end(); 2558 Redecl != RedeclEnd; 2559 ++Redecl) { 2560 if (Redecl->isInlineSpecified() && 2561 Redecl->getStorageClass() != SC_Extern) 2562 return true; 2563 } 2564 2565 return false; 2566 } 2567 2568 // The rest of this function is C-only. 2569 assert(!Context.getLangOpts().CPlusPlus && 2570 "should not use C inline rules in C++"); 2571 2572 // C99 6.7.4p6: 2573 // [...] If all of the file scope declarations for a function in a 2574 // translation unit include the inline function specifier without extern, 2575 // then the definition in that translation unit is an inline definition. 2576 for (redecl_iterator Redecl = redecls_begin(), RedeclEnd = redecls_end(); 2577 Redecl != RedeclEnd; 2578 ++Redecl) { 2579 if (RedeclForcesDefC99(*Redecl)) 2580 return true; 2581 } 2582 2583 // C99 6.7.4p6: 2584 // An inline definition does not provide an external definition for the 2585 // function, and does not forbid an external definition in another 2586 // translation unit. 2587 return false; 2588} 2589 2590/// getOverloadedOperator - Which C++ overloaded operator this 2591/// function represents, if any. 2592OverloadedOperatorKind FunctionDecl::getOverloadedOperator() const { 2593 if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName) 2594 return getDeclName().getCXXOverloadedOperator(); 2595 else 2596 return OO_None; 2597} 2598 2599/// getLiteralIdentifier - The literal suffix identifier this function 2600/// represents, if any. 2601const IdentifierInfo *FunctionDecl::getLiteralIdentifier() const { 2602 if (getDeclName().getNameKind() == DeclarationName::CXXLiteralOperatorName) 2603 return getDeclName().getCXXLiteralIdentifier(); 2604 else 2605 return 0; 2606} 2607 2608FunctionDecl::TemplatedKind FunctionDecl::getTemplatedKind() const { 2609 if (TemplateOrSpecialization.isNull()) 2610 return TK_NonTemplate; 2611 if (TemplateOrSpecialization.is<FunctionTemplateDecl *>()) 2612 return TK_FunctionTemplate; 2613 if (TemplateOrSpecialization.is<MemberSpecializationInfo *>()) 2614 return TK_MemberSpecialization; 2615 if (TemplateOrSpecialization.is<FunctionTemplateSpecializationInfo *>()) 2616 return TK_FunctionTemplateSpecialization; 2617 if (TemplateOrSpecialization.is 2618 <DependentFunctionTemplateSpecializationInfo*>()) 2619 return TK_DependentFunctionTemplateSpecialization; 2620 2621 llvm_unreachable("Did we miss a TemplateOrSpecialization type?"); 2622} 2623 2624FunctionDecl *FunctionDecl::getInstantiatedFromMemberFunction() const { 2625 if (MemberSpecializationInfo *Info = getMemberSpecializationInfo()) 2626 return cast<FunctionDecl>(Info->getInstantiatedFrom()); 2627 2628 return 0; 2629} 2630 2631void 2632FunctionDecl::setInstantiationOfMemberFunction(ASTContext &C, 2633 FunctionDecl *FD, 2634 TemplateSpecializationKind TSK) { 2635 assert(TemplateOrSpecialization.isNull() && 2636 "Member function is already a specialization"); 2637 MemberSpecializationInfo *Info 2638 = new (C) MemberSpecializationInfo(FD, TSK); 2639 TemplateOrSpecialization = Info; 2640} 2641 2642bool FunctionDecl::isImplicitlyInstantiable() const { 2643 // If the function is invalid, it can't be implicitly instantiated. 2644 if (isInvalidDecl()) 2645 return false; 2646 2647 switch (getTemplateSpecializationKind()) { 2648 case TSK_Undeclared: 2649 case TSK_ExplicitInstantiationDefinition: 2650 return false; 2651 2652 case TSK_ImplicitInstantiation: 2653 return true; 2654 2655 // It is possible to instantiate TSK_ExplicitSpecialization kind 2656 // if the FunctionDecl has a class scope specialization pattern. 2657 case TSK_ExplicitSpecialization: 2658 return getClassScopeSpecializationPattern() != 0; 2659 2660 case TSK_ExplicitInstantiationDeclaration: 2661 // Handled below. 2662 break; 2663 } 2664 2665 // Find the actual template from which we will instantiate. 2666 const FunctionDecl *PatternDecl = getTemplateInstantiationPattern(); 2667 bool HasPattern = false; 2668 if (PatternDecl) 2669 HasPattern = PatternDecl->hasBody(PatternDecl); 2670 2671 // C++0x [temp.explicit]p9: 2672 // Except for inline functions, other explicit instantiation declarations 2673 // have the effect of suppressing the implicit instantiation of the entity 2674 // to which they refer. 2675 if (!HasPattern || !PatternDecl) 2676 return true; 2677 2678 return PatternDecl->isInlined(); 2679} 2680 2681bool FunctionDecl::isTemplateInstantiation() const { 2682 switch (getTemplateSpecializationKind()) { 2683 case TSK_Undeclared: 2684 case TSK_ExplicitSpecialization: 2685 return false; 2686 case TSK_ImplicitInstantiation: 2687 case TSK_ExplicitInstantiationDeclaration: 2688 case TSK_ExplicitInstantiationDefinition: 2689 return true; 2690 } 2691 llvm_unreachable("All TSK values handled."); 2692} 2693 2694FunctionDecl *FunctionDecl::getTemplateInstantiationPattern() const { 2695 // Handle class scope explicit specialization special case. 2696 if (getTemplateSpecializationKind() == TSK_ExplicitSpecialization) 2697 return getClassScopeSpecializationPattern(); 2698 2699 if (FunctionTemplateDecl *Primary = getPrimaryTemplate()) { 2700 while (Primary->getInstantiatedFromMemberTemplate()) { 2701 // If we have hit a point where the user provided a specialization of 2702 // this template, we're done looking. 2703 if (Primary->isMemberSpecialization()) 2704 break; 2705 2706 Primary = Primary->getInstantiatedFromMemberTemplate(); 2707 } 2708 2709 return Primary->getTemplatedDecl(); 2710 } 2711 2712 return getInstantiatedFromMemberFunction(); 2713} 2714 2715FunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() const { 2716 if (FunctionTemplateSpecializationInfo *Info 2717 = TemplateOrSpecialization 2718 .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 2719 return Info->Template.getPointer(); 2720 } 2721 return 0; 2722} 2723 2724FunctionDecl *FunctionDecl::getClassScopeSpecializationPattern() const { 2725 return getASTContext().getClassScopeSpecializationPattern(this); 2726} 2727 2728const TemplateArgumentList * 2729FunctionDecl::getTemplateSpecializationArgs() const { 2730 if (FunctionTemplateSpecializationInfo *Info 2731 = TemplateOrSpecialization 2732 .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 2733 return Info->TemplateArguments; 2734 } 2735 return 0; 2736} 2737 2738const ASTTemplateArgumentListInfo * 2739FunctionDecl::getTemplateSpecializationArgsAsWritten() const { 2740 if (FunctionTemplateSpecializationInfo *Info 2741 = TemplateOrSpecialization 2742 .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 2743 return Info->TemplateArgumentsAsWritten; 2744 } 2745 return 0; 2746} 2747 2748void 2749FunctionDecl::setFunctionTemplateSpecialization(ASTContext &C, 2750 FunctionTemplateDecl *Template, 2751 const TemplateArgumentList *TemplateArgs, 2752 void *InsertPos, 2753 TemplateSpecializationKind TSK, 2754 const TemplateArgumentListInfo *TemplateArgsAsWritten, 2755 SourceLocation PointOfInstantiation) { 2756 assert(TSK != TSK_Undeclared && 2757 "Must specify the type of function template specialization"); 2758 FunctionTemplateSpecializationInfo *Info 2759 = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>(); 2760 if (!Info) 2761 Info = FunctionTemplateSpecializationInfo::Create(C, this, Template, TSK, 2762 TemplateArgs, 2763 TemplateArgsAsWritten, 2764 PointOfInstantiation); 2765 TemplateOrSpecialization = Info; 2766 Template->addSpecialization(Info, InsertPos); 2767} 2768 2769void 2770FunctionDecl::setDependentTemplateSpecialization(ASTContext &Context, 2771 const UnresolvedSetImpl &Templates, 2772 const TemplateArgumentListInfo &TemplateArgs) { 2773 assert(TemplateOrSpecialization.isNull()); 2774 size_t Size = sizeof(DependentFunctionTemplateSpecializationInfo); 2775 Size += Templates.size() * sizeof(FunctionTemplateDecl*); 2776 Size += TemplateArgs.size() * sizeof(TemplateArgumentLoc); 2777 void *Buffer = Context.Allocate(Size); 2778 DependentFunctionTemplateSpecializationInfo *Info = 2779 new (Buffer) DependentFunctionTemplateSpecializationInfo(Templates, 2780 TemplateArgs); 2781 TemplateOrSpecialization = Info; 2782} 2783 2784DependentFunctionTemplateSpecializationInfo:: 2785DependentFunctionTemplateSpecializationInfo(const UnresolvedSetImpl &Ts, 2786 const TemplateArgumentListInfo &TArgs) 2787 : AngleLocs(TArgs.getLAngleLoc(), TArgs.getRAngleLoc()) { 2788 2789 d.NumTemplates = Ts.size(); 2790 d.NumArgs = TArgs.size(); 2791 2792 FunctionTemplateDecl **TsArray = 2793 const_cast<FunctionTemplateDecl**>(getTemplates()); 2794 for (unsigned I = 0, E = Ts.size(); I != E; ++I) 2795 TsArray[I] = cast<FunctionTemplateDecl>(Ts[I]->getUnderlyingDecl()); 2796 2797 TemplateArgumentLoc *ArgsArray = 2798 const_cast<TemplateArgumentLoc*>(getTemplateArgs()); 2799 for (unsigned I = 0, E = TArgs.size(); I != E; ++I) 2800 new (&ArgsArray[I]) TemplateArgumentLoc(TArgs[I]); 2801} 2802 2803TemplateSpecializationKind FunctionDecl::getTemplateSpecializationKind() const { 2804 // For a function template specialization, query the specialization 2805 // information object. 2806 FunctionTemplateSpecializationInfo *FTSInfo 2807 = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>(); 2808 if (FTSInfo) 2809 return FTSInfo->getTemplateSpecializationKind(); 2810 2811 MemberSpecializationInfo *MSInfo 2812 = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>(); 2813 if (MSInfo) 2814 return MSInfo->getTemplateSpecializationKind(); 2815 2816 return TSK_Undeclared; 2817} 2818 2819void 2820FunctionDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK, 2821 SourceLocation PointOfInstantiation) { 2822 if (FunctionTemplateSpecializationInfo *FTSInfo 2823 = TemplateOrSpecialization.dyn_cast< 2824 FunctionTemplateSpecializationInfo*>()) { 2825 FTSInfo->setTemplateSpecializationKind(TSK); 2826 if (TSK != TSK_ExplicitSpecialization && 2827 PointOfInstantiation.isValid() && 2828 FTSInfo->getPointOfInstantiation().isInvalid()) 2829 FTSInfo->setPointOfInstantiation(PointOfInstantiation); 2830 } else if (MemberSpecializationInfo *MSInfo 2831 = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>()) { 2832 MSInfo->setTemplateSpecializationKind(TSK); 2833 if (TSK != TSK_ExplicitSpecialization && 2834 PointOfInstantiation.isValid() && 2835 MSInfo->getPointOfInstantiation().isInvalid()) 2836 MSInfo->setPointOfInstantiation(PointOfInstantiation); 2837 } else 2838 llvm_unreachable("Function cannot have a template specialization kind"); 2839} 2840 2841SourceLocation FunctionDecl::getPointOfInstantiation() const { 2842 if (FunctionTemplateSpecializationInfo *FTSInfo 2843 = TemplateOrSpecialization.dyn_cast< 2844 FunctionTemplateSpecializationInfo*>()) 2845 return FTSInfo->getPointOfInstantiation(); 2846 else if (MemberSpecializationInfo *MSInfo 2847 = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>()) 2848 return MSInfo->getPointOfInstantiation(); 2849 2850 return SourceLocation(); 2851} 2852 2853bool FunctionDecl::isOutOfLine() const { 2854 if (Decl::isOutOfLine()) 2855 return true; 2856 2857 // If this function was instantiated from a member function of a 2858 // class template, check whether that member function was defined out-of-line. 2859 if (FunctionDecl *FD = getInstantiatedFromMemberFunction()) { 2860 const FunctionDecl *Definition; 2861 if (FD->hasBody(Definition)) 2862 return Definition->isOutOfLine(); 2863 } 2864 2865 // If this function was instantiated from a function template, 2866 // check whether that function template was defined out-of-line. 2867 if (FunctionTemplateDecl *FunTmpl = getPrimaryTemplate()) { 2868 const FunctionDecl *Definition; 2869 if (FunTmpl->getTemplatedDecl()->hasBody(Definition)) 2870 return Definition->isOutOfLine(); 2871 } 2872 2873 return false; 2874} 2875 2876SourceRange FunctionDecl::getSourceRange() const { 2877 return SourceRange(getOuterLocStart(), EndRangeLoc); 2878} 2879 2880unsigned FunctionDecl::getMemoryFunctionKind() const { 2881 IdentifierInfo *FnInfo = getIdentifier(); 2882 2883 if (!FnInfo) 2884 return 0; 2885 2886 // Builtin handling. 2887 switch (getBuiltinID()) { 2888 case Builtin::BI__builtin_memset: 2889 case Builtin::BI__builtin___memset_chk: 2890 case Builtin::BImemset: 2891 return Builtin::BImemset; 2892 2893 case Builtin::BI__builtin_memcpy: 2894 case Builtin::BI__builtin___memcpy_chk: 2895 case Builtin::BImemcpy: 2896 return Builtin::BImemcpy; 2897 2898 case Builtin::BI__builtin_memmove: 2899 case Builtin::BI__builtin___memmove_chk: 2900 case Builtin::BImemmove: 2901 return Builtin::BImemmove; 2902 2903 case Builtin::BIstrlcpy: 2904 return Builtin::BIstrlcpy; 2905 case Builtin::BIstrlcat: 2906 return Builtin::BIstrlcat; 2907 2908 case Builtin::BI__builtin_memcmp: 2909 case Builtin::BImemcmp: 2910 return Builtin::BImemcmp; 2911 2912 case Builtin::BI__builtin_strncpy: 2913 case Builtin::BI__builtin___strncpy_chk: 2914 case Builtin::BIstrncpy: 2915 return Builtin::BIstrncpy; 2916 2917 case Builtin::BI__builtin_strncmp: 2918 case Builtin::BIstrncmp: 2919 return Builtin::BIstrncmp; 2920 2921 case Builtin::BI__builtin_strncasecmp: 2922 case Builtin::BIstrncasecmp: 2923 return Builtin::BIstrncasecmp; 2924 2925 case Builtin::BI__builtin_strncat: 2926 case Builtin::BI__builtin___strncat_chk: 2927 case Builtin::BIstrncat: 2928 return Builtin::BIstrncat; 2929 2930 case Builtin::BI__builtin_strndup: 2931 case Builtin::BIstrndup: 2932 return Builtin::BIstrndup; 2933 2934 case Builtin::BI__builtin_strlen: 2935 case Builtin::BIstrlen: 2936 return Builtin::BIstrlen; 2937 2938 default: 2939 if (isExternC()) { 2940 if (FnInfo->isStr("memset")) 2941 return Builtin::BImemset; 2942 else if (FnInfo->isStr("memcpy")) 2943 return Builtin::BImemcpy; 2944 else if (FnInfo->isStr("memmove")) 2945 return Builtin::BImemmove; 2946 else if (FnInfo->isStr("memcmp")) 2947 return Builtin::BImemcmp; 2948 else if (FnInfo->isStr("strncpy")) 2949 return Builtin::BIstrncpy; 2950 else if (FnInfo->isStr("strncmp")) 2951 return Builtin::BIstrncmp; 2952 else if (FnInfo->isStr("strncasecmp")) 2953 return Builtin::BIstrncasecmp; 2954 else if (FnInfo->isStr("strncat")) 2955 return Builtin::BIstrncat; 2956 else if (FnInfo->isStr("strndup")) 2957 return Builtin::BIstrndup; 2958 else if (FnInfo->isStr("strlen")) 2959 return Builtin::BIstrlen; 2960 } 2961 break; 2962 } 2963 return 0; 2964} 2965 2966//===----------------------------------------------------------------------===// 2967// FieldDecl Implementation 2968//===----------------------------------------------------------------------===// 2969 2970FieldDecl *FieldDecl::Create(const ASTContext &C, DeclContext *DC, 2971 SourceLocation StartLoc, SourceLocation IdLoc, 2972 IdentifierInfo *Id, QualType T, 2973 TypeSourceInfo *TInfo, Expr *BW, bool Mutable, 2974 InClassInitStyle InitStyle) { 2975 return new (C) FieldDecl(Decl::Field, DC, StartLoc, IdLoc, Id, T, TInfo, 2976 BW, Mutable, InitStyle); 2977} 2978 2979FieldDecl *FieldDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2980 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FieldDecl)); 2981 return new (Mem) FieldDecl(Field, 0, SourceLocation(), SourceLocation(), 2982 0, QualType(), 0, 0, false, ICIS_NoInit); 2983} 2984 2985bool FieldDecl::isAnonymousStructOrUnion() const { 2986 if (!isImplicit() || getDeclName()) 2987 return false; 2988 2989 if (const RecordType *Record = getType()->getAs<RecordType>()) 2990 return Record->getDecl()->isAnonymousStructOrUnion(); 2991 2992 return false; 2993} 2994 2995unsigned FieldDecl::getBitWidthValue(const ASTContext &Ctx) const { 2996 assert(isBitField() && "not a bitfield"); 2997 Expr *BitWidth = InitializerOrBitWidth.getPointer(); 2998 return BitWidth->EvaluateKnownConstInt(Ctx).getZExtValue(); 2999} 3000 3001unsigned FieldDecl::getFieldIndex() const { 3002 if (CachedFieldIndex) return CachedFieldIndex - 1; 3003 3004 unsigned Index = 0; 3005 const RecordDecl *RD = getParent(); 3006 3007 for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end(); 3008 I != E; ++I, ++Index) 3009 I->CachedFieldIndex = Index + 1; 3010 3011 assert(CachedFieldIndex && "failed to find field in parent"); 3012 return CachedFieldIndex - 1; 3013} 3014 3015SourceRange FieldDecl::getSourceRange() const { 3016 if (const Expr *E = InitializerOrBitWidth.getPointer()) 3017 return SourceRange(getInnerLocStart(), E->getLocEnd()); 3018 return DeclaratorDecl::getSourceRange(); 3019} 3020 3021void FieldDecl::setBitWidth(Expr *Width) { 3022 assert(!InitializerOrBitWidth.getPointer() && !hasInClassInitializer() && 3023 "bit width or initializer already set"); 3024 InitializerOrBitWidth.setPointer(Width); 3025} 3026 3027void FieldDecl::setInClassInitializer(Expr *Init) { 3028 assert(!InitializerOrBitWidth.getPointer() && hasInClassInitializer() && 3029 "bit width or initializer already set"); 3030 InitializerOrBitWidth.setPointer(Init); 3031} 3032 3033//===----------------------------------------------------------------------===// 3034// TagDecl Implementation 3035//===----------------------------------------------------------------------===// 3036 3037SourceLocation TagDecl::getOuterLocStart() const { 3038 return getTemplateOrInnerLocStart(this); 3039} 3040 3041SourceRange TagDecl::getSourceRange() const { 3042 SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation(); 3043 return SourceRange(getOuterLocStart(), E); 3044} 3045 3046TagDecl* TagDecl::getCanonicalDecl() { 3047 return getFirstDeclaration(); 3048} 3049 3050void TagDecl::setTypedefNameForAnonDecl(TypedefNameDecl *TDD) { 3051 TypedefNameDeclOrQualifier = TDD; 3052 if (TypeForDecl) 3053 assert(TypeForDecl->isLinkageValid()); 3054 assert(isLinkageValid()); 3055} 3056 3057void TagDecl::startDefinition() { 3058 IsBeingDefined = true; 3059 3060 if (CXXRecordDecl *D = dyn_cast<CXXRecordDecl>(this)) { 3061 struct CXXRecordDecl::DefinitionData *Data = 3062 new (getASTContext()) struct CXXRecordDecl::DefinitionData(D); 3063 for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) 3064 cast<CXXRecordDecl>(*I)->DefinitionData = Data; 3065 } 3066} 3067 3068void TagDecl::completeDefinition() { 3069 assert((!isa<CXXRecordDecl>(this) || 3070 cast<CXXRecordDecl>(this)->hasDefinition()) && 3071 "definition completed but not started"); 3072 3073 IsCompleteDefinition = true; 3074 IsBeingDefined = false; 3075 3076 if (ASTMutationListener *L = getASTMutationListener()) 3077 L->CompletedTagDefinition(this); 3078} 3079 3080TagDecl *TagDecl::getDefinition() const { 3081 if (isCompleteDefinition()) 3082 return const_cast<TagDecl *>(this); 3083 3084 // If it's possible for us to have an out-of-date definition, check now. 3085 if (MayHaveOutOfDateDef) { 3086 if (IdentifierInfo *II = getIdentifier()) { 3087 if (II->isOutOfDate()) { 3088 updateOutOfDate(*II); 3089 } 3090 } 3091 } 3092 3093 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(this)) 3094 return CXXRD->getDefinition(); 3095 3096 for (redecl_iterator R = redecls_begin(), REnd = redecls_end(); 3097 R != REnd; ++R) 3098 if (R->isCompleteDefinition()) 3099 return *R; 3100 3101 return 0; 3102} 3103 3104void TagDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) { 3105 if (QualifierLoc) { 3106 // Make sure the extended qualifier info is allocated. 3107 if (!hasExtInfo()) 3108 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo; 3109 // Set qualifier info. 3110 getExtInfo()->QualifierLoc = QualifierLoc; 3111 } else { 3112 // Here Qualifier == 0, i.e., we are removing the qualifier (if any). 3113 if (hasExtInfo()) { 3114 if (getExtInfo()->NumTemplParamLists == 0) { 3115 getASTContext().Deallocate(getExtInfo()); 3116 TypedefNameDeclOrQualifier = (TypedefNameDecl*) 0; 3117 } 3118 else 3119 getExtInfo()->QualifierLoc = QualifierLoc; 3120 } 3121 } 3122} 3123 3124void TagDecl::setTemplateParameterListsInfo(ASTContext &Context, 3125 unsigned NumTPLists, 3126 TemplateParameterList **TPLists) { 3127 assert(NumTPLists > 0); 3128 // Make sure the extended decl info is allocated. 3129 if (!hasExtInfo()) 3130 // Allocate external info struct. 3131 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo; 3132 // Set the template parameter lists info. 3133 getExtInfo()->setTemplateParameterListsInfo(Context, NumTPLists, TPLists); 3134} 3135 3136//===----------------------------------------------------------------------===// 3137// EnumDecl Implementation 3138//===----------------------------------------------------------------------===// 3139 3140void EnumDecl::anchor() { } 3141 3142EnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, 3143 SourceLocation StartLoc, SourceLocation IdLoc, 3144 IdentifierInfo *Id, 3145 EnumDecl *PrevDecl, bool IsScoped, 3146 bool IsScopedUsingClassTag, bool IsFixed) { 3147 EnumDecl *Enum = new (C) EnumDecl(DC, StartLoc, IdLoc, Id, PrevDecl, 3148 IsScoped, IsScopedUsingClassTag, IsFixed); 3149 Enum->MayHaveOutOfDateDef = C.getLangOpts().Modules; 3150 C.getTypeDeclType(Enum, PrevDecl); 3151 return Enum; 3152} 3153 3154EnumDecl *EnumDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 3155 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(EnumDecl)); 3156 EnumDecl *Enum = new (Mem) EnumDecl(0, SourceLocation(), SourceLocation(), 3157 0, 0, false, false, false); 3158 Enum->MayHaveOutOfDateDef = C.getLangOpts().Modules; 3159 return Enum; 3160} 3161 3162void EnumDecl::completeDefinition(QualType NewType, 3163 QualType NewPromotionType, 3164 unsigned NumPositiveBits, 3165 unsigned NumNegativeBits) { 3166 assert(!isCompleteDefinition() && "Cannot redefine enums!"); 3167 if (!IntegerType) 3168 IntegerType = NewType.getTypePtr(); 3169 PromotionType = NewPromotionType; 3170 setNumPositiveBits(NumPositiveBits); 3171 setNumNegativeBits(NumNegativeBits); 3172 TagDecl::completeDefinition(); 3173} 3174 3175TemplateSpecializationKind EnumDecl::getTemplateSpecializationKind() const { 3176 if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) 3177 return MSI->getTemplateSpecializationKind(); 3178 3179 return TSK_Undeclared; 3180} 3181 3182void EnumDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK, 3183 SourceLocation PointOfInstantiation) { 3184 MemberSpecializationInfo *MSI = getMemberSpecializationInfo(); 3185 assert(MSI && "Not an instantiated member enumeration?"); 3186 MSI->setTemplateSpecializationKind(TSK); 3187 if (TSK != TSK_ExplicitSpecialization && 3188 PointOfInstantiation.isValid() && 3189 MSI->getPointOfInstantiation().isInvalid()) 3190 MSI->setPointOfInstantiation(PointOfInstantiation); 3191} 3192 3193EnumDecl *EnumDecl::getInstantiatedFromMemberEnum() const { 3194 if (SpecializationInfo) 3195 return cast<EnumDecl>(SpecializationInfo->getInstantiatedFrom()); 3196 3197 return 0; 3198} 3199 3200void EnumDecl::setInstantiationOfMemberEnum(ASTContext &C, EnumDecl *ED, 3201 TemplateSpecializationKind TSK) { 3202 assert(!SpecializationInfo && "Member enum is already a specialization"); 3203 SpecializationInfo = new (C) MemberSpecializationInfo(ED, TSK); 3204} 3205 3206//===----------------------------------------------------------------------===// 3207// RecordDecl Implementation 3208//===----------------------------------------------------------------------===// 3209 3210RecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, 3211 SourceLocation StartLoc, SourceLocation IdLoc, 3212 IdentifierInfo *Id, RecordDecl *PrevDecl) 3213 : TagDecl(DK, TK, DC, IdLoc, Id, PrevDecl, StartLoc) { 3214 HasFlexibleArrayMember = false; 3215 AnonymousStructOrUnion = false; 3216 HasObjectMember = false; 3217 HasVolatileMember = false; 3218 LoadedFieldsFromExternalStorage = false; 3219 assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!"); 3220} 3221 3222RecordDecl *RecordDecl::Create(const ASTContext &C, TagKind TK, DeclContext *DC, 3223 SourceLocation StartLoc, SourceLocation IdLoc, 3224 IdentifierInfo *Id, RecordDecl* PrevDecl) { 3225 RecordDecl* R = new (C) RecordDecl(Record, TK, DC, StartLoc, IdLoc, Id, 3226 PrevDecl); 3227 R->MayHaveOutOfDateDef = C.getLangOpts().Modules; 3228 3229 C.getTypeDeclType(R, PrevDecl); 3230 return R; 3231} 3232 3233RecordDecl *RecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 3234 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(RecordDecl)); 3235 RecordDecl *R = new (Mem) RecordDecl(Record, TTK_Struct, 0, SourceLocation(), 3236 SourceLocation(), 0, 0); 3237 R->MayHaveOutOfDateDef = C.getLangOpts().Modules; 3238 return R; 3239} 3240 3241bool RecordDecl::isInjectedClassName() const { 3242 return isImplicit() && getDeclName() && getDeclContext()->isRecord() && 3243 cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName(); 3244} 3245 3246RecordDecl::field_iterator RecordDecl::field_begin() const { 3247 if (hasExternalLexicalStorage() && !LoadedFieldsFromExternalStorage) 3248 LoadFieldsFromExternalStorage(); 3249 3250 return field_iterator(decl_iterator(FirstDecl)); 3251} 3252 3253/// completeDefinition - Notes that the definition of this type is now 3254/// complete. 3255void RecordDecl::completeDefinition() { 3256 assert(!isCompleteDefinition() && "Cannot redefine record!"); 3257 TagDecl::completeDefinition(); 3258} 3259 3260/// isMsStruct - Get whether or not this record uses ms_struct layout. 3261/// This which can be turned on with an attribute, pragma, or the 3262/// -mms-bitfields command-line option. 3263bool RecordDecl::isMsStruct(const ASTContext &C) const { 3264 return hasAttr<MsStructAttr>() || C.getLangOpts().MSBitfields == 1; 3265} 3266 3267static bool isFieldOrIndirectField(Decl::Kind K) { 3268 return FieldDecl::classofKind(K) || IndirectFieldDecl::classofKind(K); 3269} 3270 3271void RecordDecl::LoadFieldsFromExternalStorage() const { 3272 ExternalASTSource *Source = getASTContext().getExternalSource(); 3273 assert(hasExternalLexicalStorage() && Source && "No external storage?"); 3274 3275 // Notify that we have a RecordDecl doing some initialization. 3276 ExternalASTSource::Deserializing TheFields(Source); 3277 3278 SmallVector<Decl*, 64> Decls; 3279 LoadedFieldsFromExternalStorage = true; 3280 switch (Source->FindExternalLexicalDecls(this, isFieldOrIndirectField, 3281 Decls)) { 3282 case ELR_Success: 3283 break; 3284 3285 case ELR_AlreadyLoaded: 3286 case ELR_Failure: 3287 return; 3288 } 3289 3290#ifndef NDEBUG 3291 // Check that all decls we got were FieldDecls. 3292 for (unsigned i=0, e=Decls.size(); i != e; ++i) 3293 assert(isa<FieldDecl>(Decls[i]) || isa<IndirectFieldDecl>(Decls[i])); 3294#endif 3295 3296 if (Decls.empty()) 3297 return; 3298 3299 llvm::tie(FirstDecl, LastDecl) = BuildDeclChain(Decls, 3300 /*FieldsAlreadyLoaded=*/false); 3301} 3302 3303//===----------------------------------------------------------------------===// 3304// BlockDecl Implementation 3305//===----------------------------------------------------------------------===// 3306 3307void BlockDecl::setParams(ArrayRef<ParmVarDecl *> NewParamInfo) { 3308 assert(ParamInfo == 0 && "Already has param info!"); 3309 3310 // Zero params -> null pointer. 3311 if (!NewParamInfo.empty()) { 3312 NumParams = NewParamInfo.size(); 3313 ParamInfo = new (getASTContext()) ParmVarDecl*[NewParamInfo.size()]; 3314 std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo); 3315 } 3316} 3317 3318void BlockDecl::setCaptures(ASTContext &Context, 3319 const Capture *begin, 3320 const Capture *end, 3321 bool capturesCXXThis) { 3322 CapturesCXXThis = capturesCXXThis; 3323 3324 if (begin == end) { 3325 NumCaptures = 0; 3326 Captures = 0; 3327 return; 3328 } 3329 3330 NumCaptures = end - begin; 3331 3332 // Avoid new Capture[] because we don't want to provide a default 3333 // constructor. 3334 size_t allocationSize = NumCaptures * sizeof(Capture); 3335 void *buffer = Context.Allocate(allocationSize, /*alignment*/sizeof(void*)); 3336 memcpy(buffer, begin, allocationSize); 3337 Captures = static_cast<Capture*>(buffer); 3338} 3339 3340bool BlockDecl::capturesVariable(const VarDecl *variable) const { 3341 for (capture_const_iterator 3342 i = capture_begin(), e = capture_end(); i != e; ++i) 3343 // Only auto vars can be captured, so no redeclaration worries. 3344 if (i->getVariable() == variable) 3345 return true; 3346 3347 return false; 3348} 3349 3350SourceRange BlockDecl::getSourceRange() const { 3351 return SourceRange(getLocation(), Body? Body->getLocEnd() : getLocation()); 3352} 3353 3354//===----------------------------------------------------------------------===// 3355// Other Decl Allocation/Deallocation Method Implementations 3356//===----------------------------------------------------------------------===// 3357 3358void TranslationUnitDecl::anchor() { } 3359 3360TranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) { 3361 return new (C) TranslationUnitDecl(C); 3362} 3363 3364void LabelDecl::anchor() { } 3365 3366LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC, 3367 SourceLocation IdentL, IdentifierInfo *II) { 3368 return new (C) LabelDecl(DC, IdentL, II, 0, IdentL); 3369} 3370 3371LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC, 3372 SourceLocation IdentL, IdentifierInfo *II, 3373 SourceLocation GnuLabelL) { 3374 assert(GnuLabelL != IdentL && "Use this only for GNU local labels"); 3375 return new (C) LabelDecl(DC, IdentL, II, 0, GnuLabelL); 3376} 3377 3378LabelDecl *LabelDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 3379 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(LabelDecl)); 3380 return new (Mem) LabelDecl(0, SourceLocation(), 0, 0, SourceLocation()); 3381} 3382 3383void ValueDecl::anchor() { } 3384 3385bool ValueDecl::isWeak() const { 3386 for (attr_iterator I = attr_begin(), E = attr_end(); I != E; ++I) 3387 if (isa<WeakAttr>(*I) || isa<WeakRefAttr>(*I)) 3388 return true; 3389 3390 return isWeakImported(); 3391} 3392 3393void ImplicitParamDecl::anchor() { } 3394 3395ImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC, 3396 SourceLocation IdLoc, 3397 IdentifierInfo *Id, 3398 QualType Type) { 3399 return new (C) ImplicitParamDecl(DC, IdLoc, Id, Type); 3400} 3401 3402ImplicitParamDecl *ImplicitParamDecl::CreateDeserialized(ASTContext &C, 3403 unsigned ID) { 3404 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ImplicitParamDecl)); 3405 return new (Mem) ImplicitParamDecl(0, SourceLocation(), 0, QualType()); 3406} 3407 3408FunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC, 3409 SourceLocation StartLoc, 3410 const DeclarationNameInfo &NameInfo, 3411 QualType T, TypeSourceInfo *TInfo, 3412 StorageClass SC, 3413 bool isInlineSpecified, 3414 bool hasWrittenPrototype, 3415 bool isConstexprSpecified) { 3416 FunctionDecl *New = new (C) FunctionDecl(Function, DC, StartLoc, NameInfo, 3417 T, TInfo, SC, 3418 isInlineSpecified, 3419 isConstexprSpecified); 3420 New->HasWrittenPrototype = hasWrittenPrototype; 3421 return New; 3422} 3423 3424FunctionDecl *FunctionDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 3425 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionDecl)); 3426 return new (Mem) FunctionDecl(Function, 0, SourceLocation(), 3427 DeclarationNameInfo(), QualType(), 0, 3428 SC_None, false, false); 3429} 3430 3431BlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) { 3432 return new (C) BlockDecl(DC, L); 3433} 3434 3435BlockDecl *BlockDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 3436 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(BlockDecl)); 3437 return new (Mem) BlockDecl(0, SourceLocation()); 3438} 3439 3440MSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C, 3441 unsigned ID) { 3442 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(MSPropertyDecl)); 3443 return new (Mem) MSPropertyDecl(0, SourceLocation(), DeclarationName(), 3444 QualType(), 0, SourceLocation(), 3445 0, 0); 3446} 3447 3448CapturedDecl *CapturedDecl::Create(ASTContext &C, DeclContext *DC, 3449 unsigned NumParams) { 3450 unsigned Size = sizeof(CapturedDecl) + NumParams * sizeof(ImplicitParamDecl*); 3451 return new (C.Allocate(Size)) CapturedDecl(DC, NumParams); 3452} 3453 3454CapturedDecl *CapturedDecl::CreateDeserialized(ASTContext &C, unsigned ID, 3455 unsigned NumParams) { 3456 unsigned Size = sizeof(CapturedDecl) + NumParams * sizeof(ImplicitParamDecl*); 3457 void *Mem = AllocateDeserializedDecl(C, ID, Size); 3458 return new (Mem) CapturedDecl(0, NumParams); 3459} 3460 3461EnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD, 3462 SourceLocation L, 3463 IdentifierInfo *Id, QualType T, 3464 Expr *E, const llvm::APSInt &V) { 3465 return new (C) EnumConstantDecl(CD, L, Id, T, E, V); 3466} 3467 3468EnumConstantDecl * 3469EnumConstantDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 3470 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(EnumConstantDecl)); 3471 return new (Mem) EnumConstantDecl(0, SourceLocation(), 0, QualType(), 0, 3472 llvm::APSInt()); 3473} 3474 3475void IndirectFieldDecl::anchor() { } 3476 3477IndirectFieldDecl * 3478IndirectFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 3479 IdentifierInfo *Id, QualType T, NamedDecl **CH, 3480 unsigned CHS) { 3481 return new (C) IndirectFieldDecl(DC, L, Id, T, CH, CHS); 3482} 3483 3484IndirectFieldDecl *IndirectFieldDecl::CreateDeserialized(ASTContext &C, 3485 unsigned ID) { 3486 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(IndirectFieldDecl)); 3487 return new (Mem) IndirectFieldDecl(0, SourceLocation(), DeclarationName(), 3488 QualType(), 0, 0); 3489} 3490 3491SourceRange EnumConstantDecl::getSourceRange() const { 3492 SourceLocation End = getLocation(); 3493 if (Init) 3494 End = Init->getLocEnd(); 3495 return SourceRange(getLocation(), End); 3496} 3497 3498void TypeDecl::anchor() { } 3499 3500TypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC, 3501 SourceLocation StartLoc, SourceLocation IdLoc, 3502 IdentifierInfo *Id, TypeSourceInfo *TInfo) { 3503 return new (C) TypedefDecl(DC, StartLoc, IdLoc, Id, TInfo); 3504} 3505 3506void TypedefNameDecl::anchor() { } 3507 3508TypedefDecl *TypedefDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 3509 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypedefDecl)); 3510 return new (Mem) TypedefDecl(0, SourceLocation(), SourceLocation(), 0, 0); 3511} 3512 3513TypeAliasDecl *TypeAliasDecl::Create(ASTContext &C, DeclContext *DC, 3514 SourceLocation StartLoc, 3515 SourceLocation IdLoc, IdentifierInfo *Id, 3516 TypeSourceInfo *TInfo) { 3517 return new (C) TypeAliasDecl(DC, StartLoc, IdLoc, Id, TInfo); 3518} 3519 3520TypeAliasDecl *TypeAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 3521 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasDecl)); 3522 return new (Mem) TypeAliasDecl(0, SourceLocation(), SourceLocation(), 0, 0); 3523} 3524 3525SourceRange TypedefDecl::getSourceRange() const { 3526 SourceLocation RangeEnd = getLocation(); 3527 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) { 3528 if (typeIsPostfix(TInfo->getType())) 3529 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd(); 3530 } 3531 return SourceRange(getLocStart(), RangeEnd); 3532} 3533 3534SourceRange TypeAliasDecl::getSourceRange() const { 3535 SourceLocation RangeEnd = getLocStart(); 3536 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) 3537 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd(); 3538 return SourceRange(getLocStart(), RangeEnd); 3539} 3540 3541void FileScopeAsmDecl::anchor() { } 3542 3543FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC, 3544 StringLiteral *Str, 3545 SourceLocation AsmLoc, 3546 SourceLocation RParenLoc) { 3547 return new (C) FileScopeAsmDecl(DC, Str, AsmLoc, RParenLoc); 3548} 3549 3550FileScopeAsmDecl *FileScopeAsmDecl::CreateDeserialized(ASTContext &C, 3551 unsigned ID) { 3552 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FileScopeAsmDecl)); 3553 return new (Mem) FileScopeAsmDecl(0, 0, SourceLocation(), SourceLocation()); 3554} 3555 3556void EmptyDecl::anchor() {} 3557 3558EmptyDecl *EmptyDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) { 3559 return new (C) EmptyDecl(DC, L); 3560} 3561 3562EmptyDecl *EmptyDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 3563 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(EmptyDecl)); 3564 return new (Mem) EmptyDecl(0, SourceLocation()); 3565} 3566 3567//===----------------------------------------------------------------------===// 3568// ImportDecl Implementation 3569//===----------------------------------------------------------------------===// 3570 3571/// \brief Retrieve the number of module identifiers needed to name the given 3572/// module. 3573static unsigned getNumModuleIdentifiers(Module *Mod) { 3574 unsigned Result = 1; 3575 while (Mod->Parent) { 3576 Mod = Mod->Parent; 3577 ++Result; 3578 } 3579 return Result; 3580} 3581 3582ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc, 3583 Module *Imported, 3584 ArrayRef<SourceLocation> IdentifierLocs) 3585 : Decl(Import, DC, StartLoc), ImportedAndComplete(Imported, true), 3586 NextLocalImport() 3587{ 3588 assert(getNumModuleIdentifiers(Imported) == IdentifierLocs.size()); 3589 SourceLocation *StoredLocs = reinterpret_cast<SourceLocation *>(this + 1); 3590 memcpy(StoredLocs, IdentifierLocs.data(), 3591 IdentifierLocs.size() * sizeof(SourceLocation)); 3592} 3593 3594ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc, 3595 Module *Imported, SourceLocation EndLoc) 3596 : Decl(Import, DC, StartLoc), ImportedAndComplete(Imported, false), 3597 NextLocalImport() 3598{ 3599 *reinterpret_cast<SourceLocation *>(this + 1) = EndLoc; 3600} 3601 3602ImportDecl *ImportDecl::Create(ASTContext &C, DeclContext *DC, 3603 SourceLocation StartLoc, Module *Imported, 3604 ArrayRef<SourceLocation> IdentifierLocs) { 3605 void *Mem = C.Allocate(sizeof(ImportDecl) + 3606 IdentifierLocs.size() * sizeof(SourceLocation)); 3607 return new (Mem) ImportDecl(DC, StartLoc, Imported, IdentifierLocs); 3608} 3609 3610ImportDecl *ImportDecl::CreateImplicit(ASTContext &C, DeclContext *DC, 3611 SourceLocation StartLoc, 3612 Module *Imported, 3613 SourceLocation EndLoc) { 3614 void *Mem = C.Allocate(sizeof(ImportDecl) + sizeof(SourceLocation)); 3615 ImportDecl *Import = new (Mem) ImportDecl(DC, StartLoc, Imported, EndLoc); 3616 Import->setImplicit(); 3617 return Import; 3618} 3619 3620ImportDecl *ImportDecl::CreateDeserialized(ASTContext &C, unsigned ID, 3621 unsigned NumLocations) { 3622 void *Mem = AllocateDeserializedDecl(C, ID, 3623 (sizeof(ImportDecl) + 3624 NumLocations * sizeof(SourceLocation))); 3625 return new (Mem) ImportDecl(EmptyShell()); 3626} 3627 3628ArrayRef<SourceLocation> ImportDecl::getIdentifierLocs() const { 3629 if (!ImportedAndComplete.getInt()) 3630 return None; 3631 3632 const SourceLocation *StoredLocs 3633 = reinterpret_cast<const SourceLocation *>(this + 1); 3634 return ArrayRef<SourceLocation>(StoredLocs, 3635 getNumModuleIdentifiers(getImportedModule())); 3636} 3637 3638SourceRange ImportDecl::getSourceRange() const { 3639 if (!ImportedAndComplete.getInt()) 3640 return SourceRange(getLocation(), 3641 *reinterpret_cast<const SourceLocation *>(this + 1)); 3642 3643 return SourceRange(getLocation(), getIdentifierLocs().back()); 3644} 3645