1 //===- DeclBase.cpp - Declaration AST Node Implementation -----------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements the Decl and DeclContext classes. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/AST/DeclBase.h" 14 #include "clang/AST/ASTContext.h" 15 #include "clang/AST/ASTLambda.h" 16 #include "clang/AST/ASTMutationListener.h" 17 #include "clang/AST/Attr.h" 18 #include "clang/AST/AttrIterator.h" 19 #include "clang/AST/Decl.h" 20 #include "clang/AST/DeclCXX.h" 21 #include "clang/AST/DeclContextInternals.h" 22 #include "clang/AST/DeclFriend.h" 23 #include "clang/AST/DeclObjC.h" 24 #include "clang/AST/DeclOpenMP.h" 25 #include "clang/AST/DeclTemplate.h" 26 #include "clang/AST/DependentDiagnostic.h" 27 #include "clang/AST/ExternalASTSource.h" 28 #include "clang/AST/Stmt.h" 29 #include "clang/AST/Type.h" 30 #include "clang/Basic/IdentifierTable.h" 31 #include "clang/Basic/LLVM.h" 32 #include "clang/Basic/LangOptions.h" 33 #include "clang/Basic/ObjCRuntime.h" 34 #include "clang/Basic/PartialDiagnostic.h" 35 #include "clang/Basic/SourceLocation.h" 36 #include "clang/Basic/TargetInfo.h" 37 #include "llvm/ADT/ArrayRef.h" 38 #include "llvm/ADT/PointerIntPair.h" 39 #include "llvm/ADT/SmallVector.h" 40 #include "llvm/ADT/StringRef.h" 41 #include "llvm/Support/Casting.h" 42 #include "llvm/Support/ErrorHandling.h" 43 #include "llvm/Support/MathExtras.h" 44 #include "llvm/Support/VersionTuple.h" 45 #include "llvm/Support/raw_ostream.h" 46 #include <algorithm> 47 #include <cassert> 48 #include <cstddef> 49 #include <string> 50 #include <tuple> 51 #include <utility> 52 53 using namespace clang; 54 55 //===----------------------------------------------------------------------===// 56 // Statistics 57 //===----------------------------------------------------------------------===// 58 59 #define DECL(DERIVED, BASE) static int n##DERIVED##s = 0; 60 #define ABSTRACT_DECL(DECL) 61 #include "clang/AST/DeclNodes.inc" 62 63 void Decl::updateOutOfDate(IdentifierInfo &II) const { 64 getASTContext().getExternalSource()->updateOutOfDateIdentifier(II); 65 } 66 67 #define DECL(DERIVED, BASE) \ 68 static_assert(alignof(Decl) >= alignof(DERIVED##Decl), \ 69 "Alignment sufficient after objects prepended to " #DERIVED); 70 #define ABSTRACT_DECL(DECL) 71 #include "clang/AST/DeclNodes.inc" 72 73 void *Decl::operator new(std::size_t Size, const ASTContext &Context, 74 unsigned ID, std::size_t Extra) { 75 // Allocate an extra 8 bytes worth of storage, which ensures that the 76 // resulting pointer will still be 8-byte aligned. 77 static_assert(sizeof(unsigned) * 2 >= alignof(Decl), 78 "Decl won't be misaligned"); 79 void *Start = Context.Allocate(Size + Extra + 8); 80 void *Result = (char*)Start + 8; 81 82 unsigned *PrefixPtr = (unsigned *)Result - 2; 83 84 // Zero out the first 4 bytes; this is used to store the owning module ID. 85 PrefixPtr[0] = 0; 86 87 // Store the global declaration ID in the second 4 bytes. 88 PrefixPtr[1] = ID; 89 90 return Result; 91 } 92 93 void *Decl::operator new(std::size_t Size, const ASTContext &Ctx, 94 DeclContext *Parent, std::size_t Extra) { 95 assert(!Parent || &Parent->getParentASTContext() == &Ctx); 96 // With local visibility enabled, we track the owning module even for local 97 // declarations. We create the TU decl early and may not yet know what the 98 // LangOpts are, so conservatively allocate the storage. 99 if (Ctx.getLangOpts().trackLocalOwningModule() || !Parent) { 100 // Ensure required alignment of the resulting object by adding extra 101 // padding at the start if required. 102 size_t ExtraAlign = 103 llvm::offsetToAlignment(sizeof(Module *), llvm::Align(alignof(Decl))); 104 auto *Buffer = reinterpret_cast<char *>( 105 ::operator new(ExtraAlign + sizeof(Module *) + Size + Extra, Ctx)); 106 Buffer += ExtraAlign; 107 auto *ParentModule = 108 Parent ? cast<Decl>(Parent)->getOwningModule() : nullptr; 109 return new (Buffer) Module*(ParentModule) + 1; 110 } 111 return ::operator new(Size + Extra, Ctx); 112 } 113 114 Module *Decl::getOwningModuleSlow() const { 115 assert(isFromASTFile() && "Not from AST file?"); 116 return getASTContext().getExternalSource()->getModule(getOwningModuleID()); 117 } 118 119 bool Decl::hasLocalOwningModuleStorage() const { 120 return getASTContext().getLangOpts().trackLocalOwningModule(); 121 } 122 123 const char *Decl::getDeclKindName() const { 124 switch (DeclKind) { 125 default: llvm_unreachable("Declaration not in DeclNodes.inc!"); 126 #define DECL(DERIVED, BASE) case DERIVED: return #DERIVED; 127 #define ABSTRACT_DECL(DECL) 128 #include "clang/AST/DeclNodes.inc" 129 } 130 } 131 132 void Decl::setInvalidDecl(bool Invalid) { 133 InvalidDecl = Invalid; 134 assert(!isa<TagDecl>(this) || !cast<TagDecl>(this)->isCompleteDefinition()); 135 if (!Invalid) { 136 return; 137 } 138 139 if (!isa<ParmVarDecl>(this)) { 140 // Defensive maneuver for ill-formed code: we're likely not to make it to 141 // a point where we set the access specifier, so default it to "public" 142 // to avoid triggering asserts elsewhere in the front end. 143 setAccess(AS_public); 144 } 145 146 // Marking a DecompositionDecl as invalid implies all the child BindingDecl's 147 // are invalid too. 148 if (auto *DD = dyn_cast<DecompositionDecl>(this)) { 149 for (auto *Binding : DD->bindings()) { 150 Binding->setInvalidDecl(); 151 } 152 } 153 } 154 155 const char *DeclContext::getDeclKindName() const { 156 switch (getDeclKind()) { 157 #define DECL(DERIVED, BASE) case Decl::DERIVED: return #DERIVED; 158 #define ABSTRACT_DECL(DECL) 159 #include "clang/AST/DeclNodes.inc" 160 } 161 llvm_unreachable("Declaration context not in DeclNodes.inc!"); 162 } 163 164 bool Decl::StatisticsEnabled = false; 165 void Decl::EnableStatistics() { 166 StatisticsEnabled = true; 167 } 168 169 void Decl::PrintStats() { 170 llvm::errs() << "\n*** Decl Stats:\n"; 171 172 int totalDecls = 0; 173 #define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s; 174 #define ABSTRACT_DECL(DECL) 175 #include "clang/AST/DeclNodes.inc" 176 llvm::errs() << " " << totalDecls << " decls total.\n"; 177 178 int totalBytes = 0; 179 #define DECL(DERIVED, BASE) \ 180 if (n##DERIVED##s > 0) { \ 181 totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl)); \ 182 llvm::errs() << " " << n##DERIVED##s << " " #DERIVED " decls, " \ 183 << sizeof(DERIVED##Decl) << " each (" \ 184 << n##DERIVED##s * sizeof(DERIVED##Decl) \ 185 << " bytes)\n"; \ 186 } 187 #define ABSTRACT_DECL(DECL) 188 #include "clang/AST/DeclNodes.inc" 189 190 llvm::errs() << "Total bytes = " << totalBytes << "\n"; 191 } 192 193 void Decl::add(Kind k) { 194 switch (k) { 195 #define DECL(DERIVED, BASE) case DERIVED: ++n##DERIVED##s; break; 196 #define ABSTRACT_DECL(DECL) 197 #include "clang/AST/DeclNodes.inc" 198 } 199 } 200 201 bool Decl::isTemplateParameterPack() const { 202 if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(this)) 203 return TTP->isParameterPack(); 204 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(this)) 205 return NTTP->isParameterPack(); 206 if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(this)) 207 return TTP->isParameterPack(); 208 return false; 209 } 210 211 bool Decl::isParameterPack() const { 212 if (const auto *Var = dyn_cast<VarDecl>(this)) 213 return Var->isParameterPack(); 214 215 return isTemplateParameterPack(); 216 } 217 218 FunctionDecl *Decl::getAsFunction() { 219 if (auto *FD = dyn_cast<FunctionDecl>(this)) 220 return FD; 221 if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(this)) 222 return FTD->getTemplatedDecl(); 223 return nullptr; 224 } 225 226 bool Decl::isTemplateDecl() const { 227 return isa<TemplateDecl>(this); 228 } 229 230 TemplateDecl *Decl::getDescribedTemplate() const { 231 if (auto *FD = dyn_cast<FunctionDecl>(this)) 232 return FD->getDescribedFunctionTemplate(); 233 else if (auto *RD = dyn_cast<CXXRecordDecl>(this)) 234 return RD->getDescribedClassTemplate(); 235 else if (auto *VD = dyn_cast<VarDecl>(this)) 236 return VD->getDescribedVarTemplate(); 237 else if (auto *AD = dyn_cast<TypeAliasDecl>(this)) 238 return AD->getDescribedAliasTemplate(); 239 240 return nullptr; 241 } 242 243 bool Decl::isTemplated() const { 244 // A declaration is dependent if it is a template or a template pattern, or 245 // is within (lexcially for a friend, semantically otherwise) a dependent 246 // context. 247 // FIXME: Should local extern declarations be treated like friends? 248 if (auto *AsDC = dyn_cast<DeclContext>(this)) 249 return AsDC->isDependentContext(); 250 auto *DC = getFriendObjectKind() ? getLexicalDeclContext() : getDeclContext(); 251 return DC->isDependentContext() || isTemplateDecl() || getDescribedTemplate(); 252 } 253 254 const DeclContext *Decl::getParentFunctionOrMethod() const { 255 for (const DeclContext *DC = getDeclContext(); 256 DC && !DC->isTranslationUnit() && !DC->isNamespace(); 257 DC = DC->getParent()) 258 if (DC->isFunctionOrMethod()) 259 return DC; 260 261 return nullptr; 262 } 263 264 //===----------------------------------------------------------------------===// 265 // PrettyStackTraceDecl Implementation 266 //===----------------------------------------------------------------------===// 267 268 void PrettyStackTraceDecl::print(raw_ostream &OS) const { 269 SourceLocation TheLoc = Loc; 270 if (TheLoc.isInvalid() && TheDecl) 271 TheLoc = TheDecl->getLocation(); 272 273 if (TheLoc.isValid()) { 274 TheLoc.print(OS, SM); 275 OS << ": "; 276 } 277 278 OS << Message; 279 280 if (const auto *DN = dyn_cast_or_null<NamedDecl>(TheDecl)) { 281 OS << " '"; 282 DN->printQualifiedName(OS); 283 OS << '\''; 284 } 285 OS << '\n'; 286 } 287 288 //===----------------------------------------------------------------------===// 289 // Decl Implementation 290 //===----------------------------------------------------------------------===// 291 292 // Out-of-line virtual method providing a home for Decl. 293 Decl::~Decl() = default; 294 295 void Decl::setDeclContext(DeclContext *DC) { 296 DeclCtx = DC; 297 } 298 299 void Decl::setLexicalDeclContext(DeclContext *DC) { 300 if (DC == getLexicalDeclContext()) 301 return; 302 303 if (isInSemaDC()) { 304 setDeclContextsImpl(getDeclContext(), DC, getASTContext()); 305 } else { 306 getMultipleDC()->LexicalDC = DC; 307 } 308 309 // FIXME: We shouldn't be changing the lexical context of declarations 310 // imported from AST files. 311 if (!isFromASTFile()) { 312 setModuleOwnershipKind(getModuleOwnershipKindForChildOf(DC)); 313 if (hasOwningModule()) 314 setLocalOwningModule(cast<Decl>(DC)->getOwningModule()); 315 } 316 317 assert( 318 (getModuleOwnershipKind() != ModuleOwnershipKind::VisibleWhenImported || 319 getOwningModule()) && 320 "hidden declaration has no owning module"); 321 } 322 323 void Decl::setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC, 324 ASTContext &Ctx) { 325 if (SemaDC == LexicalDC) { 326 DeclCtx = SemaDC; 327 } else { 328 auto *MDC = new (Ctx) Decl::MultipleDC(); 329 MDC->SemanticDC = SemaDC; 330 MDC->LexicalDC = LexicalDC; 331 DeclCtx = MDC; 332 } 333 } 334 335 bool Decl::isLexicallyWithinFunctionOrMethod() const { 336 const DeclContext *LDC = getLexicalDeclContext(); 337 while (true) { 338 if (LDC->isFunctionOrMethod()) 339 return true; 340 if (!isa<TagDecl>(LDC)) 341 return false; 342 LDC = LDC->getLexicalParent(); 343 } 344 return false; 345 } 346 347 bool Decl::isInAnonymousNamespace() const { 348 for (const DeclContext *DC = getDeclContext(); DC; DC = DC->getParent()) { 349 if (const auto *ND = dyn_cast<NamespaceDecl>(DC)) 350 if (ND->isAnonymousNamespace()) 351 return true; 352 } 353 354 return false; 355 } 356 357 bool Decl::isInStdNamespace() const { 358 const DeclContext *DC = getDeclContext(); 359 return DC && DC->isStdNamespace(); 360 } 361 362 TranslationUnitDecl *Decl::getTranslationUnitDecl() { 363 if (auto *TUD = dyn_cast<TranslationUnitDecl>(this)) 364 return TUD; 365 366 DeclContext *DC = getDeclContext(); 367 assert(DC && "This decl is not contained in a translation unit!"); 368 369 while (!DC->isTranslationUnit()) { 370 DC = DC->getParent(); 371 assert(DC && "This decl is not contained in a translation unit!"); 372 } 373 374 return cast<TranslationUnitDecl>(DC); 375 } 376 377 ASTContext &Decl::getASTContext() const { 378 return getTranslationUnitDecl()->getASTContext(); 379 } 380 381 /// Helper to get the language options from the ASTContext. 382 /// Defined out of line to avoid depending on ASTContext.h. 383 const LangOptions &Decl::getLangOpts() const { 384 return getASTContext().getLangOpts(); 385 } 386 387 ASTMutationListener *Decl::getASTMutationListener() const { 388 return getASTContext().getASTMutationListener(); 389 } 390 391 unsigned Decl::getMaxAlignment() const { 392 if (!hasAttrs()) 393 return 0; 394 395 unsigned Align = 0; 396 const AttrVec &V = getAttrs(); 397 ASTContext &Ctx = getASTContext(); 398 specific_attr_iterator<AlignedAttr> I(V.begin()), E(V.end()); 399 for (; I != E; ++I) { 400 if (!I->isAlignmentErrorDependent()) 401 Align = std::max(Align, I->getAlignment(Ctx)); 402 } 403 return Align; 404 } 405 406 bool Decl::isUsed(bool CheckUsedAttr) const { 407 const Decl *CanonD = getCanonicalDecl(); 408 if (CanonD->Used) 409 return true; 410 411 // Check for used attribute. 412 // Ask the most recent decl, since attributes accumulate in the redecl chain. 413 if (CheckUsedAttr && getMostRecentDecl()->hasAttr<UsedAttr>()) 414 return true; 415 416 // The information may have not been deserialized yet. Force deserialization 417 // to complete the needed information. 418 return getMostRecentDecl()->getCanonicalDecl()->Used; 419 } 420 421 void Decl::markUsed(ASTContext &C) { 422 if (isUsed(false)) 423 return; 424 425 if (C.getASTMutationListener()) 426 C.getASTMutationListener()->DeclarationMarkedUsed(this); 427 428 setIsUsed(); 429 } 430 431 bool Decl::isReferenced() const { 432 if (Referenced) 433 return true; 434 435 // Check redeclarations. 436 for (const auto *I : redecls()) 437 if (I->Referenced) 438 return true; 439 440 return false; 441 } 442 443 ExternalSourceSymbolAttr *Decl::getExternalSourceSymbolAttr() const { 444 const Decl *Definition = nullptr; 445 if (auto *ID = dyn_cast<ObjCInterfaceDecl>(this)) { 446 Definition = ID->getDefinition(); 447 } else if (auto *PD = dyn_cast<ObjCProtocolDecl>(this)) { 448 Definition = PD->getDefinition(); 449 } else if (auto *TD = dyn_cast<TagDecl>(this)) { 450 Definition = TD->getDefinition(); 451 } 452 if (!Definition) 453 Definition = this; 454 455 if (auto *attr = Definition->getAttr<ExternalSourceSymbolAttr>()) 456 return attr; 457 if (auto *dcd = dyn_cast<Decl>(getDeclContext())) { 458 return dcd->getAttr<ExternalSourceSymbolAttr>(); 459 } 460 461 return nullptr; 462 } 463 464 bool Decl::hasDefiningAttr() const { 465 return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>() || 466 hasAttr<LoaderUninitializedAttr>(); 467 } 468 469 const Attr *Decl::getDefiningAttr() const { 470 if (auto *AA = getAttr<AliasAttr>()) 471 return AA; 472 if (auto *IFA = getAttr<IFuncAttr>()) 473 return IFA; 474 if (auto *NZA = getAttr<LoaderUninitializedAttr>()) 475 return NZA; 476 return nullptr; 477 } 478 479 static StringRef getRealizedPlatform(const AvailabilityAttr *A, 480 const ASTContext &Context) { 481 // Check if this is an App Extension "platform", and if so chop off 482 // the suffix for matching with the actual platform. 483 StringRef RealizedPlatform = A->getPlatform()->getName(); 484 if (!Context.getLangOpts().AppExt) 485 return RealizedPlatform; 486 size_t suffix = RealizedPlatform.rfind("_app_extension"); 487 if (suffix != StringRef::npos) 488 return RealizedPlatform.slice(0, suffix); 489 return RealizedPlatform; 490 } 491 492 /// Determine the availability of the given declaration based on 493 /// the target platform. 494 /// 495 /// When it returns an availability result other than \c AR_Available, 496 /// if the \p Message parameter is non-NULL, it will be set to a 497 /// string describing why the entity is unavailable. 498 /// 499 /// FIXME: Make these strings localizable, since they end up in 500 /// diagnostics. 501 static AvailabilityResult CheckAvailability(ASTContext &Context, 502 const AvailabilityAttr *A, 503 std::string *Message, 504 VersionTuple EnclosingVersion) { 505 if (EnclosingVersion.empty()) 506 EnclosingVersion = Context.getTargetInfo().getPlatformMinVersion(); 507 508 if (EnclosingVersion.empty()) 509 return AR_Available; 510 511 StringRef ActualPlatform = A->getPlatform()->getName(); 512 StringRef TargetPlatform = Context.getTargetInfo().getPlatformName(); 513 514 // Match the platform name. 515 if (getRealizedPlatform(A, Context) != TargetPlatform) 516 return AR_Available; 517 518 StringRef PrettyPlatformName 519 = AvailabilityAttr::getPrettyPlatformName(ActualPlatform); 520 521 if (PrettyPlatformName.empty()) 522 PrettyPlatformName = ActualPlatform; 523 524 std::string HintMessage; 525 if (!A->getMessage().empty()) { 526 HintMessage = " - "; 527 HintMessage += A->getMessage(); 528 } 529 530 // Make sure that this declaration has not been marked 'unavailable'. 531 if (A->getUnavailable()) { 532 if (Message) { 533 Message->clear(); 534 llvm::raw_string_ostream Out(*Message); 535 Out << "not available on " << PrettyPlatformName 536 << HintMessage; 537 } 538 539 return AR_Unavailable; 540 } 541 542 // Make sure that this declaration has already been introduced. 543 if (!A->getIntroduced().empty() && 544 EnclosingVersion < A->getIntroduced()) { 545 if (Message) { 546 Message->clear(); 547 llvm::raw_string_ostream Out(*Message); 548 VersionTuple VTI(A->getIntroduced()); 549 Out << "introduced in " << PrettyPlatformName << ' ' 550 << VTI << HintMessage; 551 } 552 553 return A->getStrict() ? AR_Unavailable : AR_NotYetIntroduced; 554 } 555 556 // Make sure that this declaration hasn't been obsoleted. 557 if (!A->getObsoleted().empty() && EnclosingVersion >= A->getObsoleted()) { 558 if (Message) { 559 Message->clear(); 560 llvm::raw_string_ostream Out(*Message); 561 VersionTuple VTO(A->getObsoleted()); 562 Out << "obsoleted in " << PrettyPlatformName << ' ' 563 << VTO << HintMessage; 564 } 565 566 return AR_Unavailable; 567 } 568 569 // Make sure that this declaration hasn't been deprecated. 570 if (!A->getDeprecated().empty() && EnclosingVersion >= A->getDeprecated()) { 571 if (Message) { 572 Message->clear(); 573 llvm::raw_string_ostream Out(*Message); 574 VersionTuple VTD(A->getDeprecated()); 575 Out << "first deprecated in " << PrettyPlatformName << ' ' 576 << VTD << HintMessage; 577 } 578 579 return AR_Deprecated; 580 } 581 582 return AR_Available; 583 } 584 585 AvailabilityResult Decl::getAvailability(std::string *Message, 586 VersionTuple EnclosingVersion, 587 StringRef *RealizedPlatform) const { 588 if (auto *FTD = dyn_cast<FunctionTemplateDecl>(this)) 589 return FTD->getTemplatedDecl()->getAvailability(Message, EnclosingVersion, 590 RealizedPlatform); 591 592 AvailabilityResult Result = AR_Available; 593 std::string ResultMessage; 594 595 for (const auto *A : attrs()) { 596 if (const auto *Deprecated = dyn_cast<DeprecatedAttr>(A)) { 597 if (Result >= AR_Deprecated) 598 continue; 599 600 if (Message) 601 ResultMessage = std::string(Deprecated->getMessage()); 602 603 Result = AR_Deprecated; 604 continue; 605 } 606 607 if (const auto *Unavailable = dyn_cast<UnavailableAttr>(A)) { 608 if (Message) 609 *Message = std::string(Unavailable->getMessage()); 610 return AR_Unavailable; 611 } 612 613 if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) { 614 AvailabilityResult AR = CheckAvailability(getASTContext(), Availability, 615 Message, EnclosingVersion); 616 617 if (AR == AR_Unavailable) { 618 if (RealizedPlatform) 619 *RealizedPlatform = Availability->getPlatform()->getName(); 620 return AR_Unavailable; 621 } 622 623 if (AR > Result) { 624 Result = AR; 625 if (Message) 626 ResultMessage.swap(*Message); 627 } 628 continue; 629 } 630 } 631 632 if (Message) 633 Message->swap(ResultMessage); 634 return Result; 635 } 636 637 VersionTuple Decl::getVersionIntroduced() const { 638 const ASTContext &Context = getASTContext(); 639 StringRef TargetPlatform = Context.getTargetInfo().getPlatformName(); 640 for (const auto *A : attrs()) { 641 if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) { 642 if (getRealizedPlatform(Availability, Context) != TargetPlatform) 643 continue; 644 if (!Availability->getIntroduced().empty()) 645 return Availability->getIntroduced(); 646 } 647 } 648 return {}; 649 } 650 651 bool Decl::canBeWeakImported(bool &IsDefinition) const { 652 IsDefinition = false; 653 654 // Variables, if they aren't definitions. 655 if (const auto *Var = dyn_cast<VarDecl>(this)) { 656 if (Var->isThisDeclarationADefinition()) { 657 IsDefinition = true; 658 return false; 659 } 660 return true; 661 662 // Functions, if they aren't definitions. 663 } else if (const auto *FD = dyn_cast<FunctionDecl>(this)) { 664 if (FD->hasBody()) { 665 IsDefinition = true; 666 return false; 667 } 668 return true; 669 670 // Objective-C classes, if this is the non-fragile runtime. 671 } else if (isa<ObjCInterfaceDecl>(this) && 672 getASTContext().getLangOpts().ObjCRuntime.hasWeakClassImport()) { 673 return true; 674 675 // Nothing else. 676 } else { 677 return false; 678 } 679 } 680 681 bool Decl::isWeakImported() const { 682 bool IsDefinition; 683 if (!canBeWeakImported(IsDefinition)) 684 return false; 685 686 for (const auto *A : attrs()) { 687 if (isa<WeakImportAttr>(A)) 688 return true; 689 690 if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) { 691 if (CheckAvailability(getASTContext(), Availability, nullptr, 692 VersionTuple()) == AR_NotYetIntroduced) 693 return true; 694 } 695 } 696 697 return false; 698 } 699 700 unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) { 701 switch (DeclKind) { 702 case Function: 703 case CXXDeductionGuide: 704 case CXXMethod: 705 case CXXConstructor: 706 case ConstructorUsingShadow: 707 case CXXDestructor: 708 case CXXConversion: 709 case EnumConstant: 710 case Var: 711 case ImplicitParam: 712 case ParmVar: 713 case ObjCMethod: 714 case ObjCProperty: 715 case MSProperty: 716 return IDNS_Ordinary; 717 case Label: 718 return IDNS_Label; 719 case IndirectField: 720 return IDNS_Ordinary | IDNS_Member; 721 722 case Binding: 723 case NonTypeTemplateParm: 724 case VarTemplate: 725 case Concept: 726 // These (C++-only) declarations are found by redeclaration lookup for 727 // tag types, so we include them in the tag namespace. 728 return IDNS_Ordinary | IDNS_Tag; 729 730 case ObjCCompatibleAlias: 731 case ObjCInterface: 732 return IDNS_Ordinary | IDNS_Type; 733 734 case Typedef: 735 case TypeAlias: 736 case TemplateTypeParm: 737 case ObjCTypeParam: 738 return IDNS_Ordinary | IDNS_Type; 739 740 case UnresolvedUsingTypename: 741 return IDNS_Ordinary | IDNS_Type | IDNS_Using; 742 743 case UsingShadow: 744 return 0; // we'll actually overwrite this later 745 746 case UnresolvedUsingValue: 747 return IDNS_Ordinary | IDNS_Using; 748 749 case Using: 750 case UsingPack: 751 return IDNS_Using; 752 753 case ObjCProtocol: 754 return IDNS_ObjCProtocol; 755 756 case Field: 757 case ObjCAtDefsField: 758 case ObjCIvar: 759 return IDNS_Member; 760 761 case Record: 762 case CXXRecord: 763 case Enum: 764 return IDNS_Tag | IDNS_Type; 765 766 case Namespace: 767 case NamespaceAlias: 768 return IDNS_Namespace; 769 770 case FunctionTemplate: 771 return IDNS_Ordinary; 772 773 case ClassTemplate: 774 case TemplateTemplateParm: 775 case TypeAliasTemplate: 776 return IDNS_Ordinary | IDNS_Tag | IDNS_Type; 777 778 case OMPDeclareReduction: 779 return IDNS_OMPReduction; 780 781 case OMPDeclareMapper: 782 return IDNS_OMPMapper; 783 784 // Never have names. 785 case Friend: 786 case FriendTemplate: 787 case AccessSpec: 788 case LinkageSpec: 789 case Export: 790 case FileScopeAsm: 791 case StaticAssert: 792 case ObjCPropertyImpl: 793 case PragmaComment: 794 case PragmaDetectMismatch: 795 case Block: 796 case Captured: 797 case TranslationUnit: 798 case ExternCContext: 799 case Decomposition: 800 case MSGuid: 801 802 case UsingDirective: 803 case BuiltinTemplate: 804 case ClassTemplateSpecialization: 805 case ClassTemplatePartialSpecialization: 806 case ClassScopeFunctionSpecialization: 807 case VarTemplateSpecialization: 808 case VarTemplatePartialSpecialization: 809 case ObjCImplementation: 810 case ObjCCategory: 811 case ObjCCategoryImpl: 812 case Import: 813 case OMPThreadPrivate: 814 case OMPAllocate: 815 case OMPRequires: 816 case OMPCapturedExpr: 817 case Empty: 818 case LifetimeExtendedTemporary: 819 case RequiresExprBody: 820 // Never looked up by name. 821 return 0; 822 } 823 824 llvm_unreachable("Invalid DeclKind!"); 825 } 826 827 void Decl::setAttrsImpl(const AttrVec &attrs, ASTContext &Ctx) { 828 assert(!HasAttrs && "Decl already contains attrs."); 829 830 AttrVec &AttrBlank = Ctx.getDeclAttrs(this); 831 assert(AttrBlank.empty() && "HasAttrs was wrong?"); 832 833 AttrBlank = attrs; 834 HasAttrs = true; 835 } 836 837 void Decl::dropAttrs() { 838 if (!HasAttrs) return; 839 840 HasAttrs = false; 841 getASTContext().eraseDeclAttrs(this); 842 } 843 844 void Decl::addAttr(Attr *A) { 845 if (!hasAttrs()) { 846 setAttrs(AttrVec(1, A)); 847 return; 848 } 849 850 AttrVec &Attrs = getAttrs(); 851 if (!A->isInherited()) { 852 Attrs.push_back(A); 853 return; 854 } 855 856 // Attribute inheritance is processed after attribute parsing. To keep the 857 // order as in the source code, add inherited attributes before non-inherited 858 // ones. 859 auto I = Attrs.begin(), E = Attrs.end(); 860 for (; I != E; ++I) { 861 if (!(*I)->isInherited()) 862 break; 863 } 864 Attrs.insert(I, A); 865 } 866 867 const AttrVec &Decl::getAttrs() const { 868 assert(HasAttrs && "No attrs to get!"); 869 return getASTContext().getDeclAttrs(this); 870 } 871 872 Decl *Decl::castFromDeclContext (const DeclContext *D) { 873 Decl::Kind DK = D->getDeclKind(); 874 switch(DK) { 875 #define DECL(NAME, BASE) 876 #define DECL_CONTEXT(NAME) \ 877 case Decl::NAME: \ 878 return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D)); 879 #define DECL_CONTEXT_BASE(NAME) 880 #include "clang/AST/DeclNodes.inc" 881 default: 882 #define DECL(NAME, BASE) 883 #define DECL_CONTEXT_BASE(NAME) \ 884 if (DK >= first##NAME && DK <= last##NAME) \ 885 return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D)); 886 #include "clang/AST/DeclNodes.inc" 887 llvm_unreachable("a decl that inherits DeclContext isn't handled"); 888 } 889 } 890 891 DeclContext *Decl::castToDeclContext(const Decl *D) { 892 Decl::Kind DK = D->getKind(); 893 switch(DK) { 894 #define DECL(NAME, BASE) 895 #define DECL_CONTEXT(NAME) \ 896 case Decl::NAME: \ 897 return static_cast<NAME##Decl *>(const_cast<Decl *>(D)); 898 #define DECL_CONTEXT_BASE(NAME) 899 #include "clang/AST/DeclNodes.inc" 900 default: 901 #define DECL(NAME, BASE) 902 #define DECL_CONTEXT_BASE(NAME) \ 903 if (DK >= first##NAME && DK <= last##NAME) \ 904 return static_cast<NAME##Decl *>(const_cast<Decl *>(D)); 905 #include "clang/AST/DeclNodes.inc" 906 llvm_unreachable("a decl that inherits DeclContext isn't handled"); 907 } 908 } 909 910 SourceLocation Decl::getBodyRBrace() const { 911 // Special handling of FunctionDecl to avoid de-serializing the body from PCH. 912 // FunctionDecl stores EndRangeLoc for this purpose. 913 if (const auto *FD = dyn_cast<FunctionDecl>(this)) { 914 const FunctionDecl *Definition; 915 if (FD->hasBody(Definition)) 916 return Definition->getSourceRange().getEnd(); 917 return {}; 918 } 919 920 if (Stmt *Body = getBody()) 921 return Body->getSourceRange().getEnd(); 922 923 return {}; 924 } 925 926 bool Decl::AccessDeclContextSanity() const { 927 #ifndef NDEBUG 928 // Suppress this check if any of the following hold: 929 // 1. this is the translation unit (and thus has no parent) 930 // 2. this is a template parameter (and thus doesn't belong to its context) 931 // 3. this is a non-type template parameter 932 // 4. the context is not a record 933 // 5. it's invalid 934 // 6. it's a C++0x static_assert. 935 // 7. it's a block literal declaration 936 if (isa<TranslationUnitDecl>(this) || 937 isa<TemplateTypeParmDecl>(this) || 938 isa<NonTypeTemplateParmDecl>(this) || 939 !getDeclContext() || 940 !isa<CXXRecordDecl>(getDeclContext()) || 941 isInvalidDecl() || 942 isa<StaticAssertDecl>(this) || 943 isa<BlockDecl>(this) || 944 // FIXME: a ParmVarDecl can have ClassTemplateSpecialization 945 // as DeclContext (?). 946 isa<ParmVarDecl>(this) || 947 // FIXME: a ClassTemplateSpecialization or CXXRecordDecl can have 948 // AS_none as access specifier. 949 isa<CXXRecordDecl>(this) || 950 isa<ClassScopeFunctionSpecializationDecl>(this)) 951 return true; 952 953 assert(Access != AS_none && 954 "Access specifier is AS_none inside a record decl"); 955 #endif 956 return true; 957 } 958 959 static Decl::Kind getKind(const Decl *D) { return D->getKind(); } 960 static Decl::Kind getKind(const DeclContext *DC) { return DC->getDeclKind(); } 961 962 int64_t Decl::getID() const { 963 return getASTContext().getAllocator().identifyKnownAlignedObject<Decl>(this); 964 } 965 966 const FunctionType *Decl::getFunctionType(bool BlocksToo) const { 967 QualType Ty; 968 if (const auto *D = dyn_cast<ValueDecl>(this)) 969 Ty = D->getType(); 970 else if (const auto *D = dyn_cast<TypedefNameDecl>(this)) 971 Ty = D->getUnderlyingType(); 972 else 973 return nullptr; 974 975 if (Ty->isFunctionPointerType()) 976 Ty = Ty->castAs<PointerType>()->getPointeeType(); 977 else if (Ty->isFunctionReferenceType()) 978 Ty = Ty->castAs<ReferenceType>()->getPointeeType(); 979 else if (BlocksToo && Ty->isBlockPointerType()) 980 Ty = Ty->castAs<BlockPointerType>()->getPointeeType(); 981 982 return Ty->getAs<FunctionType>(); 983 } 984 985 /// Starting at a given context (a Decl or DeclContext), look for a 986 /// code context that is not a closure (a lambda, block, etc.). 987 template <class T> static Decl *getNonClosureContext(T *D) { 988 if (getKind(D) == Decl::CXXMethod) { 989 auto *MD = cast<CXXMethodDecl>(D); 990 if (MD->getOverloadedOperator() == OO_Call && 991 MD->getParent()->isLambda()) 992 return getNonClosureContext(MD->getParent()->getParent()); 993 return MD; 994 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) 995 return FD; 996 else if (auto *MD = dyn_cast<ObjCMethodDecl>(D)) 997 return MD; 998 else if (auto *BD = dyn_cast<BlockDecl>(D)) 999 return getNonClosureContext(BD->getParent()); 1000 else if (auto *CD = dyn_cast<CapturedDecl>(D)) 1001 return getNonClosureContext(CD->getParent()); 1002 else 1003 return nullptr; 1004 } 1005 1006 Decl *Decl::getNonClosureContext() { 1007 return ::getNonClosureContext(this); 1008 } 1009 1010 Decl *DeclContext::getNonClosureAncestor() { 1011 return ::getNonClosureContext(this); 1012 } 1013 1014 //===----------------------------------------------------------------------===// 1015 // DeclContext Implementation 1016 //===----------------------------------------------------------------------===// 1017 1018 DeclContext::DeclContext(Decl::Kind K) { 1019 DeclContextBits.DeclKind = K; 1020 setHasExternalLexicalStorage(false); 1021 setHasExternalVisibleStorage(false); 1022 setNeedToReconcileExternalVisibleStorage(false); 1023 setHasLazyLocalLexicalLookups(false); 1024 setHasLazyExternalLexicalLookups(false); 1025 setUseQualifiedLookup(false); 1026 } 1027 1028 bool DeclContext::classof(const Decl *D) { 1029 switch (D->getKind()) { 1030 #define DECL(NAME, BASE) 1031 #define DECL_CONTEXT(NAME) case Decl::NAME: 1032 #define DECL_CONTEXT_BASE(NAME) 1033 #include "clang/AST/DeclNodes.inc" 1034 return true; 1035 default: 1036 #define DECL(NAME, BASE) 1037 #define DECL_CONTEXT_BASE(NAME) \ 1038 if (D->getKind() >= Decl::first##NAME && \ 1039 D->getKind() <= Decl::last##NAME) \ 1040 return true; 1041 #include "clang/AST/DeclNodes.inc" 1042 return false; 1043 } 1044 } 1045 1046 DeclContext::~DeclContext() = default; 1047 1048 /// Find the parent context of this context that will be 1049 /// used for unqualified name lookup. 1050 /// 1051 /// Generally, the parent lookup context is the semantic context. However, for 1052 /// a friend function the parent lookup context is the lexical context, which 1053 /// is the class in which the friend is declared. 1054 DeclContext *DeclContext::getLookupParent() { 1055 // FIXME: Find a better way to identify friends. 1056 if (isa<FunctionDecl>(this)) 1057 if (getParent()->getRedeclContext()->isFileContext() && 1058 getLexicalParent()->getRedeclContext()->isRecord()) 1059 return getLexicalParent(); 1060 1061 // A lookup within the call operator of a lambda never looks in the lambda 1062 // class; instead, skip to the context in which that closure type is 1063 // declared. 1064 if (isLambdaCallOperator(this)) 1065 return getParent()->getParent(); 1066 1067 return getParent(); 1068 } 1069 1070 const BlockDecl *DeclContext::getInnermostBlockDecl() const { 1071 const DeclContext *Ctx = this; 1072 1073 do { 1074 if (Ctx->isClosure()) 1075 return cast<BlockDecl>(Ctx); 1076 Ctx = Ctx->getParent(); 1077 } while (Ctx); 1078 1079 return nullptr; 1080 } 1081 1082 bool DeclContext::isInlineNamespace() const { 1083 return isNamespace() && 1084 cast<NamespaceDecl>(this)->isInline(); 1085 } 1086 1087 bool DeclContext::isStdNamespace() const { 1088 if (!isNamespace()) 1089 return false; 1090 1091 const auto *ND = cast<NamespaceDecl>(this); 1092 if (ND->isInline()) { 1093 return ND->getParent()->isStdNamespace(); 1094 } 1095 1096 if (!getParent()->getRedeclContext()->isTranslationUnit()) 1097 return false; 1098 1099 const IdentifierInfo *II = ND->getIdentifier(); 1100 return II && II->isStr("std"); 1101 } 1102 1103 bool DeclContext::isDependentContext() const { 1104 if (isFileContext()) 1105 return false; 1106 1107 if (isa<ClassTemplatePartialSpecializationDecl>(this)) 1108 return true; 1109 1110 if (const auto *Record = dyn_cast<CXXRecordDecl>(this)) { 1111 if (Record->getDescribedClassTemplate()) 1112 return true; 1113 1114 if (Record->isDependentLambda()) 1115 return true; 1116 } 1117 1118 if (const auto *Function = dyn_cast<FunctionDecl>(this)) { 1119 if (Function->getDescribedFunctionTemplate()) 1120 return true; 1121 1122 // Friend function declarations are dependent if their *lexical* 1123 // context is dependent. 1124 if (cast<Decl>(this)->getFriendObjectKind()) 1125 return getLexicalParent()->isDependentContext(); 1126 } 1127 1128 // FIXME: A variable template is a dependent context, but is not a 1129 // DeclContext. A context within it (such as a lambda-expression) 1130 // should be considered dependent. 1131 1132 return getParent() && getParent()->isDependentContext(); 1133 } 1134 1135 bool DeclContext::isTransparentContext() const { 1136 if (getDeclKind() == Decl::Enum) 1137 return !cast<EnumDecl>(this)->isScoped(); 1138 else if (getDeclKind() == Decl::LinkageSpec || getDeclKind() == Decl::Export) 1139 return true; 1140 1141 return false; 1142 } 1143 1144 static bool isLinkageSpecContext(const DeclContext *DC, 1145 LinkageSpecDecl::LanguageIDs ID) { 1146 while (DC->getDeclKind() != Decl::TranslationUnit) { 1147 if (DC->getDeclKind() == Decl::LinkageSpec) 1148 return cast<LinkageSpecDecl>(DC)->getLanguage() == ID; 1149 DC = DC->getLexicalParent(); 1150 } 1151 return false; 1152 } 1153 1154 bool DeclContext::isExternCContext() const { 1155 return isLinkageSpecContext(this, LinkageSpecDecl::lang_c); 1156 } 1157 1158 const LinkageSpecDecl *DeclContext::getExternCContext() const { 1159 const DeclContext *DC = this; 1160 while (DC->getDeclKind() != Decl::TranslationUnit) { 1161 if (DC->getDeclKind() == Decl::LinkageSpec && 1162 cast<LinkageSpecDecl>(DC)->getLanguage() == LinkageSpecDecl::lang_c) 1163 return cast<LinkageSpecDecl>(DC); 1164 DC = DC->getLexicalParent(); 1165 } 1166 return nullptr; 1167 } 1168 1169 bool DeclContext::isExternCXXContext() const { 1170 return isLinkageSpecContext(this, LinkageSpecDecl::lang_cxx); 1171 } 1172 1173 bool DeclContext::Encloses(const DeclContext *DC) const { 1174 if (getPrimaryContext() != this) 1175 return getPrimaryContext()->Encloses(DC); 1176 1177 for (; DC; DC = DC->getParent()) 1178 if (DC->getPrimaryContext() == this) 1179 return true; 1180 return false; 1181 } 1182 1183 DeclContext *DeclContext::getPrimaryContext() { 1184 switch (getDeclKind()) { 1185 case Decl::TranslationUnit: 1186 case Decl::ExternCContext: 1187 case Decl::LinkageSpec: 1188 case Decl::Export: 1189 case Decl::Block: 1190 case Decl::Captured: 1191 case Decl::OMPDeclareReduction: 1192 case Decl::OMPDeclareMapper: 1193 case Decl::RequiresExprBody: 1194 // There is only one DeclContext for these entities. 1195 return this; 1196 1197 case Decl::Namespace: 1198 // The original namespace is our primary context. 1199 return static_cast<NamespaceDecl *>(this)->getOriginalNamespace(); 1200 1201 case Decl::ObjCMethod: 1202 return this; 1203 1204 case Decl::ObjCInterface: 1205 if (auto *OID = dyn_cast<ObjCInterfaceDecl>(this)) 1206 if (auto *Def = OID->getDefinition()) 1207 return Def; 1208 return this; 1209 1210 case Decl::ObjCProtocol: 1211 if (auto *OPD = dyn_cast<ObjCProtocolDecl>(this)) 1212 if (auto *Def = OPD->getDefinition()) 1213 return Def; 1214 return this; 1215 1216 case Decl::ObjCCategory: 1217 return this; 1218 1219 case Decl::ObjCImplementation: 1220 case Decl::ObjCCategoryImpl: 1221 return this; 1222 1223 default: 1224 if (getDeclKind() >= Decl::firstTag && getDeclKind() <= Decl::lastTag) { 1225 // If this is a tag type that has a definition or is currently 1226 // being defined, that definition is our primary context. 1227 auto *Tag = cast<TagDecl>(this); 1228 1229 if (TagDecl *Def = Tag->getDefinition()) 1230 return Def; 1231 1232 if (const auto *TagTy = dyn_cast<TagType>(Tag->getTypeForDecl())) { 1233 // Note, TagType::getDecl returns the (partial) definition one exists. 1234 TagDecl *PossiblePartialDef = TagTy->getDecl(); 1235 if (PossiblePartialDef->isBeingDefined()) 1236 return PossiblePartialDef; 1237 } else { 1238 assert(isa<InjectedClassNameType>(Tag->getTypeForDecl())); 1239 } 1240 1241 return Tag; 1242 } 1243 1244 assert(getDeclKind() >= Decl::firstFunction && 1245 getDeclKind() <= Decl::lastFunction && 1246 "Unknown DeclContext kind"); 1247 return this; 1248 } 1249 } 1250 1251 void 1252 DeclContext::collectAllContexts(SmallVectorImpl<DeclContext *> &Contexts){ 1253 Contexts.clear(); 1254 1255 if (getDeclKind() != Decl::Namespace) { 1256 Contexts.push_back(this); 1257 return; 1258 } 1259 1260 auto *Self = static_cast<NamespaceDecl *>(this); 1261 for (NamespaceDecl *N = Self->getMostRecentDecl(); N; 1262 N = N->getPreviousDecl()) 1263 Contexts.push_back(N); 1264 1265 std::reverse(Contexts.begin(), Contexts.end()); 1266 } 1267 1268 std::pair<Decl *, Decl *> 1269 DeclContext::BuildDeclChain(ArrayRef<Decl *> Decls, 1270 bool FieldsAlreadyLoaded) { 1271 // Build up a chain of declarations via the Decl::NextInContextAndBits field. 1272 Decl *FirstNewDecl = nullptr; 1273 Decl *PrevDecl = nullptr; 1274 for (auto *D : Decls) { 1275 if (FieldsAlreadyLoaded && isa<FieldDecl>(D)) 1276 continue; 1277 1278 if (PrevDecl) 1279 PrevDecl->NextInContextAndBits.setPointer(D); 1280 else 1281 FirstNewDecl = D; 1282 1283 PrevDecl = D; 1284 } 1285 1286 return std::make_pair(FirstNewDecl, PrevDecl); 1287 } 1288 1289 /// We have just acquired external visible storage, and we already have 1290 /// built a lookup map. For every name in the map, pull in the new names from 1291 /// the external storage. 1292 void DeclContext::reconcileExternalVisibleStorage() const { 1293 assert(hasNeedToReconcileExternalVisibleStorage() && LookupPtr); 1294 setNeedToReconcileExternalVisibleStorage(false); 1295 1296 for (auto &Lookup : *LookupPtr) 1297 Lookup.second.setHasExternalDecls(); 1298 } 1299 1300 /// Load the declarations within this lexical storage from an 1301 /// external source. 1302 /// \return \c true if any declarations were added. 1303 bool 1304 DeclContext::LoadLexicalDeclsFromExternalStorage() const { 1305 ExternalASTSource *Source = getParentASTContext().getExternalSource(); 1306 assert(hasExternalLexicalStorage() && Source && "No external storage?"); 1307 1308 // Notify that we have a DeclContext that is initializing. 1309 ExternalASTSource::Deserializing ADeclContext(Source); 1310 1311 // Load the external declarations, if any. 1312 SmallVector<Decl*, 64> Decls; 1313 setHasExternalLexicalStorage(false); 1314 Source->FindExternalLexicalDecls(this, Decls); 1315 1316 if (Decls.empty()) 1317 return false; 1318 1319 // We may have already loaded just the fields of this record, in which case 1320 // we need to ignore them. 1321 bool FieldsAlreadyLoaded = false; 1322 if (const auto *RD = dyn_cast<RecordDecl>(this)) 1323 FieldsAlreadyLoaded = RD->hasLoadedFieldsFromExternalStorage(); 1324 1325 // Splice the newly-read declarations into the beginning of the list 1326 // of declarations. 1327 Decl *ExternalFirst, *ExternalLast; 1328 std::tie(ExternalFirst, ExternalLast) = 1329 BuildDeclChain(Decls, FieldsAlreadyLoaded); 1330 ExternalLast->NextInContextAndBits.setPointer(FirstDecl); 1331 FirstDecl = ExternalFirst; 1332 if (!LastDecl) 1333 LastDecl = ExternalLast; 1334 return true; 1335 } 1336 1337 DeclContext::lookup_result 1338 ExternalASTSource::SetNoExternalVisibleDeclsForName(const DeclContext *DC, 1339 DeclarationName Name) { 1340 ASTContext &Context = DC->getParentASTContext(); 1341 StoredDeclsMap *Map; 1342 if (!(Map = DC->LookupPtr)) 1343 Map = DC->CreateStoredDeclsMap(Context); 1344 if (DC->hasNeedToReconcileExternalVisibleStorage()) 1345 DC->reconcileExternalVisibleStorage(); 1346 1347 (*Map)[Name].removeExternalDecls(); 1348 1349 return DeclContext::lookup_result(); 1350 } 1351 1352 DeclContext::lookup_result 1353 ExternalASTSource::SetExternalVisibleDeclsForName(const DeclContext *DC, 1354 DeclarationName Name, 1355 ArrayRef<NamedDecl*> Decls) { 1356 ASTContext &Context = DC->getParentASTContext(); 1357 StoredDeclsMap *Map; 1358 if (!(Map = DC->LookupPtr)) 1359 Map = DC->CreateStoredDeclsMap(Context); 1360 if (DC->hasNeedToReconcileExternalVisibleStorage()) 1361 DC->reconcileExternalVisibleStorage(); 1362 1363 StoredDeclsList &List = (*Map)[Name]; 1364 1365 // Clear out any old external visible declarations, to avoid quadratic 1366 // performance in the redeclaration checks below. 1367 List.removeExternalDecls(); 1368 1369 if (!List.isNull()) { 1370 // We have both existing declarations and new declarations for this name. 1371 // Some of the declarations may simply replace existing ones. Handle those 1372 // first. 1373 llvm::SmallVector<unsigned, 8> Skip; 1374 for (unsigned I = 0, N = Decls.size(); I != N; ++I) 1375 if (List.HandleRedeclaration(Decls[I], /*IsKnownNewer*/false)) 1376 Skip.push_back(I); 1377 Skip.push_back(Decls.size()); 1378 1379 // Add in any new declarations. 1380 unsigned SkipPos = 0; 1381 for (unsigned I = 0, N = Decls.size(); I != N; ++I) { 1382 if (I == Skip[SkipPos]) 1383 ++SkipPos; 1384 else 1385 List.AddSubsequentDecl(Decls[I]); 1386 } 1387 } else { 1388 // Convert the array to a StoredDeclsList. 1389 for (auto *D : Decls) { 1390 if (List.isNull()) 1391 List.setOnlyValue(D); 1392 else 1393 List.AddSubsequentDecl(D); 1394 } 1395 } 1396 1397 return List.getLookupResult(); 1398 } 1399 1400 DeclContext::decl_iterator DeclContext::decls_begin() const { 1401 if (hasExternalLexicalStorage()) 1402 LoadLexicalDeclsFromExternalStorage(); 1403 return decl_iterator(FirstDecl); 1404 } 1405 1406 bool DeclContext::decls_empty() const { 1407 if (hasExternalLexicalStorage()) 1408 LoadLexicalDeclsFromExternalStorage(); 1409 1410 return !FirstDecl; 1411 } 1412 1413 bool DeclContext::containsDecl(Decl *D) const { 1414 return (D->getLexicalDeclContext() == this && 1415 (D->NextInContextAndBits.getPointer() || D == LastDecl)); 1416 } 1417 1418 bool DeclContext::containsDeclAndLoad(Decl *D) const { 1419 if (hasExternalLexicalStorage()) 1420 LoadLexicalDeclsFromExternalStorage(); 1421 return containsDecl(D); 1422 } 1423 1424 /// shouldBeHidden - Determine whether a declaration which was declared 1425 /// within its semantic context should be invisible to qualified name lookup. 1426 static bool shouldBeHidden(NamedDecl *D) { 1427 // Skip unnamed declarations. 1428 if (!D->getDeclName()) 1429 return true; 1430 1431 // Skip entities that can't be found by name lookup into a particular 1432 // context. 1433 if ((D->getIdentifierNamespace() == 0 && !isa<UsingDirectiveDecl>(D)) || 1434 D->isTemplateParameter()) 1435 return true; 1436 1437 // Skip friends and local extern declarations unless they're the first 1438 // declaration of the entity. 1439 if ((D->isLocalExternDecl() || D->getFriendObjectKind()) && 1440 D != D->getCanonicalDecl()) 1441 return true; 1442 1443 // Skip template specializations. 1444 // FIXME: This feels like a hack. Should DeclarationName support 1445 // template-ids, or is there a better way to keep specializations 1446 // from being visible? 1447 if (isa<ClassTemplateSpecializationDecl>(D)) 1448 return true; 1449 if (auto *FD = dyn_cast<FunctionDecl>(D)) 1450 if (FD->isFunctionTemplateSpecialization()) 1451 return true; 1452 1453 return false; 1454 } 1455 1456 void DeclContext::removeDecl(Decl *D) { 1457 assert(D->getLexicalDeclContext() == this && 1458 "decl being removed from non-lexical context"); 1459 assert((D->NextInContextAndBits.getPointer() || D == LastDecl) && 1460 "decl is not in decls list"); 1461 1462 // Remove D from the decl chain. This is O(n) but hopefully rare. 1463 if (D == FirstDecl) { 1464 if (D == LastDecl) 1465 FirstDecl = LastDecl = nullptr; 1466 else 1467 FirstDecl = D->NextInContextAndBits.getPointer(); 1468 } else { 1469 for (Decl *I = FirstDecl; true; I = I->NextInContextAndBits.getPointer()) { 1470 assert(I && "decl not found in linked list"); 1471 if (I->NextInContextAndBits.getPointer() == D) { 1472 I->NextInContextAndBits.setPointer(D->NextInContextAndBits.getPointer()); 1473 if (D == LastDecl) LastDecl = I; 1474 break; 1475 } 1476 } 1477 } 1478 1479 // Mark that D is no longer in the decl chain. 1480 D->NextInContextAndBits.setPointer(nullptr); 1481 1482 // Remove D from the lookup table if necessary. 1483 if (isa<NamedDecl>(D)) { 1484 auto *ND = cast<NamedDecl>(D); 1485 1486 // Do not try to remove the declaration if that is invisible to qualified 1487 // lookup. E.g. template specializations are skipped. 1488 if (shouldBeHidden(ND)) 1489 return; 1490 1491 // Remove only decls that have a name 1492 if (!ND->getDeclName()) 1493 return; 1494 1495 auto *DC = D->getDeclContext(); 1496 do { 1497 StoredDeclsMap *Map = DC->getPrimaryContext()->LookupPtr; 1498 if (Map) { 1499 StoredDeclsMap::iterator Pos = Map->find(ND->getDeclName()); 1500 assert(Pos != Map->end() && "no lookup entry for decl"); 1501 // Remove the decl only if it is contained. 1502 StoredDeclsList::DeclsTy *Vec = Pos->second.getAsVector(); 1503 if ((Vec && is_contained(*Vec, ND)) || Pos->second.getAsDecl() == ND) 1504 Pos->second.remove(ND); 1505 } 1506 } while (DC->isTransparentContext() && (DC = DC->getParent())); 1507 } 1508 } 1509 1510 void DeclContext::addHiddenDecl(Decl *D) { 1511 assert(D->getLexicalDeclContext() == this && 1512 "Decl inserted into wrong lexical context"); 1513 assert(!D->getNextDeclInContext() && D != LastDecl && 1514 "Decl already inserted into a DeclContext"); 1515 1516 if (FirstDecl) { 1517 LastDecl->NextInContextAndBits.setPointer(D); 1518 LastDecl = D; 1519 } else { 1520 FirstDecl = LastDecl = D; 1521 } 1522 1523 // Notify a C++ record declaration that we've added a member, so it can 1524 // update its class-specific state. 1525 if (auto *Record = dyn_cast<CXXRecordDecl>(this)) 1526 Record->addedMember(D); 1527 1528 // If this is a newly-created (not de-serialized) import declaration, wire 1529 // it in to the list of local import declarations. 1530 if (!D->isFromASTFile()) { 1531 if (auto *Import = dyn_cast<ImportDecl>(D)) 1532 D->getASTContext().addedLocalImportDecl(Import); 1533 } 1534 } 1535 1536 void DeclContext::addDecl(Decl *D) { 1537 addHiddenDecl(D); 1538 1539 if (auto *ND = dyn_cast<NamedDecl>(D)) 1540 ND->getDeclContext()->getPrimaryContext()-> 1541 makeDeclVisibleInContextWithFlags(ND, false, true); 1542 } 1543 1544 void DeclContext::addDeclInternal(Decl *D) { 1545 addHiddenDecl(D); 1546 1547 if (auto *ND = dyn_cast<NamedDecl>(D)) 1548 ND->getDeclContext()->getPrimaryContext()-> 1549 makeDeclVisibleInContextWithFlags(ND, true, true); 1550 } 1551 1552 /// buildLookup - Build the lookup data structure with all of the 1553 /// declarations in this DeclContext (and any other contexts linked 1554 /// to it or transparent contexts nested within it) and return it. 1555 /// 1556 /// Note that the produced map may miss out declarations from an 1557 /// external source. If it does, those entries will be marked with 1558 /// the 'hasExternalDecls' flag. 1559 StoredDeclsMap *DeclContext::buildLookup() { 1560 assert(this == getPrimaryContext() && "buildLookup called on non-primary DC"); 1561 1562 if (!hasLazyLocalLexicalLookups() && 1563 !hasLazyExternalLexicalLookups()) 1564 return LookupPtr; 1565 1566 SmallVector<DeclContext *, 2> Contexts; 1567 collectAllContexts(Contexts); 1568 1569 if (hasLazyExternalLexicalLookups()) { 1570 setHasLazyExternalLexicalLookups(false); 1571 for (auto *DC : Contexts) { 1572 if (DC->hasExternalLexicalStorage()) { 1573 bool LoadedDecls = DC->LoadLexicalDeclsFromExternalStorage(); 1574 setHasLazyLocalLexicalLookups( 1575 hasLazyLocalLexicalLookups() | LoadedDecls ); 1576 } 1577 } 1578 1579 if (!hasLazyLocalLexicalLookups()) 1580 return LookupPtr; 1581 } 1582 1583 for (auto *DC : Contexts) 1584 buildLookupImpl(DC, hasExternalVisibleStorage()); 1585 1586 // We no longer have any lazy decls. 1587 setHasLazyLocalLexicalLookups(false); 1588 return LookupPtr; 1589 } 1590 1591 /// buildLookupImpl - Build part of the lookup data structure for the 1592 /// declarations contained within DCtx, which will either be this 1593 /// DeclContext, a DeclContext linked to it, or a transparent context 1594 /// nested within it. 1595 void DeclContext::buildLookupImpl(DeclContext *DCtx, bool Internal) { 1596 for (auto *D : DCtx->noload_decls()) { 1597 // Insert this declaration into the lookup structure, but only if 1598 // it's semantically within its decl context. Any other decls which 1599 // should be found in this context are added eagerly. 1600 // 1601 // If it's from an AST file, don't add it now. It'll get handled by 1602 // FindExternalVisibleDeclsByName if needed. Exception: if we're not 1603 // in C++, we do not track external visible decls for the TU, so in 1604 // that case we need to collect them all here. 1605 if (auto *ND = dyn_cast<NamedDecl>(D)) 1606 if (ND->getDeclContext() == DCtx && !shouldBeHidden(ND) && 1607 (!ND->isFromASTFile() || 1608 (isTranslationUnit() && 1609 !getParentASTContext().getLangOpts().CPlusPlus))) 1610 makeDeclVisibleInContextImpl(ND, Internal); 1611 1612 // If this declaration is itself a transparent declaration context 1613 // or inline namespace, add the members of this declaration of that 1614 // context (recursively). 1615 if (auto *InnerCtx = dyn_cast<DeclContext>(D)) 1616 if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace()) 1617 buildLookupImpl(InnerCtx, Internal); 1618 } 1619 } 1620 1621 NamedDecl *const DeclContextLookupResult::SingleElementDummyList = nullptr; 1622 1623 DeclContext::lookup_result 1624 DeclContext::lookup(DeclarationName Name) const { 1625 assert(getDeclKind() != Decl::LinkageSpec && 1626 getDeclKind() != Decl::Export && 1627 "should not perform lookups into transparent contexts"); 1628 1629 const DeclContext *PrimaryContext = getPrimaryContext(); 1630 if (PrimaryContext != this) 1631 return PrimaryContext->lookup(Name); 1632 1633 // If we have an external source, ensure that any later redeclarations of this 1634 // context have been loaded, since they may add names to the result of this 1635 // lookup (or add external visible storage). 1636 ExternalASTSource *Source = getParentASTContext().getExternalSource(); 1637 if (Source) 1638 (void)cast<Decl>(this)->getMostRecentDecl(); 1639 1640 if (hasExternalVisibleStorage()) { 1641 assert(Source && "external visible storage but no external source?"); 1642 1643 if (hasNeedToReconcileExternalVisibleStorage()) 1644 reconcileExternalVisibleStorage(); 1645 1646 StoredDeclsMap *Map = LookupPtr; 1647 1648 if (hasLazyLocalLexicalLookups() || 1649 hasLazyExternalLexicalLookups()) 1650 // FIXME: Make buildLookup const? 1651 Map = const_cast<DeclContext*>(this)->buildLookup(); 1652 1653 if (!Map) 1654 Map = CreateStoredDeclsMap(getParentASTContext()); 1655 1656 // If we have a lookup result with no external decls, we are done. 1657 std::pair<StoredDeclsMap::iterator, bool> R = 1658 Map->insert(std::make_pair(Name, StoredDeclsList())); 1659 if (!R.second && !R.first->second.hasExternalDecls()) 1660 return R.first->second.getLookupResult(); 1661 1662 if (Source->FindExternalVisibleDeclsByName(this, Name) || !R.second) { 1663 if (StoredDeclsMap *Map = LookupPtr) { 1664 StoredDeclsMap::iterator I = Map->find(Name); 1665 if (I != Map->end()) 1666 return I->second.getLookupResult(); 1667 } 1668 } 1669 1670 return {}; 1671 } 1672 1673 StoredDeclsMap *Map = LookupPtr; 1674 if (hasLazyLocalLexicalLookups() || 1675 hasLazyExternalLexicalLookups()) 1676 Map = const_cast<DeclContext*>(this)->buildLookup(); 1677 1678 if (!Map) 1679 return {}; 1680 1681 StoredDeclsMap::iterator I = Map->find(Name); 1682 if (I == Map->end()) 1683 return {}; 1684 1685 return I->second.getLookupResult(); 1686 } 1687 1688 DeclContext::lookup_result 1689 DeclContext::noload_lookup(DeclarationName Name) { 1690 assert(getDeclKind() != Decl::LinkageSpec && 1691 getDeclKind() != Decl::Export && 1692 "should not perform lookups into transparent contexts"); 1693 1694 DeclContext *PrimaryContext = getPrimaryContext(); 1695 if (PrimaryContext != this) 1696 return PrimaryContext->noload_lookup(Name); 1697 1698 loadLazyLocalLexicalLookups(); 1699 StoredDeclsMap *Map = LookupPtr; 1700 if (!Map) 1701 return {}; 1702 1703 StoredDeclsMap::iterator I = Map->find(Name); 1704 return I != Map->end() ? I->second.getLookupResult() 1705 : lookup_result(); 1706 } 1707 1708 // If we have any lazy lexical declarations not in our lookup map, add them 1709 // now. Don't import any external declarations, not even if we know we have 1710 // some missing from the external visible lookups. 1711 void DeclContext::loadLazyLocalLexicalLookups() { 1712 if (hasLazyLocalLexicalLookups()) { 1713 SmallVector<DeclContext *, 2> Contexts; 1714 collectAllContexts(Contexts); 1715 for (auto *Context : Contexts) 1716 buildLookupImpl(Context, hasExternalVisibleStorage()); 1717 setHasLazyLocalLexicalLookups(false); 1718 } 1719 } 1720 1721 void DeclContext::localUncachedLookup(DeclarationName Name, 1722 SmallVectorImpl<NamedDecl *> &Results) { 1723 Results.clear(); 1724 1725 // If there's no external storage, just perform a normal lookup and copy 1726 // the results. 1727 if (!hasExternalVisibleStorage() && !hasExternalLexicalStorage() && Name) { 1728 lookup_result LookupResults = lookup(Name); 1729 Results.insert(Results.end(), LookupResults.begin(), LookupResults.end()); 1730 return; 1731 } 1732 1733 // If we have a lookup table, check there first. Maybe we'll get lucky. 1734 // FIXME: Should we be checking these flags on the primary context? 1735 if (Name && !hasLazyLocalLexicalLookups() && 1736 !hasLazyExternalLexicalLookups()) { 1737 if (StoredDeclsMap *Map = LookupPtr) { 1738 StoredDeclsMap::iterator Pos = Map->find(Name); 1739 if (Pos != Map->end()) { 1740 Results.insert(Results.end(), 1741 Pos->second.getLookupResult().begin(), 1742 Pos->second.getLookupResult().end()); 1743 return; 1744 } 1745 } 1746 } 1747 1748 // Slow case: grovel through the declarations in our chain looking for 1749 // matches. 1750 // FIXME: If we have lazy external declarations, this will not find them! 1751 // FIXME: Should we CollectAllContexts and walk them all here? 1752 for (Decl *D = FirstDecl; D; D = D->getNextDeclInContext()) { 1753 if (auto *ND = dyn_cast<NamedDecl>(D)) 1754 if (ND->getDeclName() == Name) 1755 Results.push_back(ND); 1756 } 1757 } 1758 1759 DeclContext *DeclContext::getRedeclContext() { 1760 DeclContext *Ctx = this; 1761 1762 // In C, a record type is the redeclaration context for its fields only. If 1763 // we arrive at a record context after skipping anything else, we should skip 1764 // the record as well. Currently, this means skipping enumerations because 1765 // they're the only transparent context that can exist within a struct or 1766 // union. 1767 bool SkipRecords = getDeclKind() == Decl::Kind::Enum && 1768 !getParentASTContext().getLangOpts().CPlusPlus; 1769 1770 // Skip through contexts to get to the redeclaration context. Transparent 1771 // contexts are always skipped. 1772 while ((SkipRecords && Ctx->isRecord()) || Ctx->isTransparentContext()) 1773 Ctx = Ctx->getParent(); 1774 return Ctx; 1775 } 1776 1777 DeclContext *DeclContext::getEnclosingNamespaceContext() { 1778 DeclContext *Ctx = this; 1779 // Skip through non-namespace, non-translation-unit contexts. 1780 while (!Ctx->isFileContext()) 1781 Ctx = Ctx->getParent(); 1782 return Ctx->getPrimaryContext(); 1783 } 1784 1785 RecordDecl *DeclContext::getOuterLexicalRecordContext() { 1786 // Loop until we find a non-record context. 1787 RecordDecl *OutermostRD = nullptr; 1788 DeclContext *DC = this; 1789 while (DC->isRecord()) { 1790 OutermostRD = cast<RecordDecl>(DC); 1791 DC = DC->getLexicalParent(); 1792 } 1793 return OutermostRD; 1794 } 1795 1796 bool DeclContext::InEnclosingNamespaceSetOf(const DeclContext *O) const { 1797 // For non-file contexts, this is equivalent to Equals. 1798 if (!isFileContext()) 1799 return O->Equals(this); 1800 1801 do { 1802 if (O->Equals(this)) 1803 return true; 1804 1805 const auto *NS = dyn_cast<NamespaceDecl>(O); 1806 if (!NS || !NS->isInline()) 1807 break; 1808 O = NS->getParent(); 1809 } while (O); 1810 1811 return false; 1812 } 1813 1814 void DeclContext::makeDeclVisibleInContext(NamedDecl *D) { 1815 DeclContext *PrimaryDC = this->getPrimaryContext(); 1816 DeclContext *DeclDC = D->getDeclContext()->getPrimaryContext(); 1817 // If the decl is being added outside of its semantic decl context, we 1818 // need to ensure that we eagerly build the lookup information for it. 1819 PrimaryDC->makeDeclVisibleInContextWithFlags(D, false, PrimaryDC == DeclDC); 1820 } 1821 1822 void DeclContext::makeDeclVisibleInContextWithFlags(NamedDecl *D, bool Internal, 1823 bool Recoverable) { 1824 assert(this == getPrimaryContext() && "expected a primary DC"); 1825 1826 if (!isLookupContext()) { 1827 if (isTransparentContext()) 1828 getParent()->getPrimaryContext() 1829 ->makeDeclVisibleInContextWithFlags(D, Internal, Recoverable); 1830 return; 1831 } 1832 1833 // Skip declarations which should be invisible to name lookup. 1834 if (shouldBeHidden(D)) 1835 return; 1836 1837 // If we already have a lookup data structure, perform the insertion into 1838 // it. If we might have externally-stored decls with this name, look them 1839 // up and perform the insertion. If this decl was declared outside its 1840 // semantic context, buildLookup won't add it, so add it now. 1841 // 1842 // FIXME: As a performance hack, don't add such decls into the translation 1843 // unit unless we're in C++, since qualified lookup into the TU is never 1844 // performed. 1845 if (LookupPtr || hasExternalVisibleStorage() || 1846 ((!Recoverable || D->getDeclContext() != D->getLexicalDeclContext()) && 1847 (getParentASTContext().getLangOpts().CPlusPlus || 1848 !isTranslationUnit()))) { 1849 // If we have lazily omitted any decls, they might have the same name as 1850 // the decl which we are adding, so build a full lookup table before adding 1851 // this decl. 1852 buildLookup(); 1853 makeDeclVisibleInContextImpl(D, Internal); 1854 } else { 1855 setHasLazyLocalLexicalLookups(true); 1856 } 1857 1858 // If we are a transparent context or inline namespace, insert into our 1859 // parent context, too. This operation is recursive. 1860 if (isTransparentContext() || isInlineNamespace()) 1861 getParent()->getPrimaryContext()-> 1862 makeDeclVisibleInContextWithFlags(D, Internal, Recoverable); 1863 1864 auto *DCAsDecl = cast<Decl>(this); 1865 // Notify that a decl was made visible unless we are a Tag being defined. 1866 if (!(isa<TagDecl>(DCAsDecl) && cast<TagDecl>(DCAsDecl)->isBeingDefined())) 1867 if (ASTMutationListener *L = DCAsDecl->getASTMutationListener()) 1868 L->AddedVisibleDecl(this, D); 1869 } 1870 1871 void DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal) { 1872 // Find or create the stored declaration map. 1873 StoredDeclsMap *Map = LookupPtr; 1874 if (!Map) { 1875 ASTContext *C = &getParentASTContext(); 1876 Map = CreateStoredDeclsMap(*C); 1877 } 1878 1879 // If there is an external AST source, load any declarations it knows about 1880 // with this declaration's name. 1881 // If the lookup table contains an entry about this name it means that we 1882 // have already checked the external source. 1883 if (!Internal) 1884 if (ExternalASTSource *Source = getParentASTContext().getExternalSource()) 1885 if (hasExternalVisibleStorage() && 1886 Map->find(D->getDeclName()) == Map->end()) 1887 Source->FindExternalVisibleDeclsByName(this, D->getDeclName()); 1888 1889 // Insert this declaration into the map. 1890 StoredDeclsList &DeclNameEntries = (*Map)[D->getDeclName()]; 1891 1892 if (Internal) { 1893 // If this is being added as part of loading an external declaration, 1894 // this may not be the only external declaration with this name. 1895 // In this case, we never try to replace an existing declaration; we'll 1896 // handle that when we finalize the list of declarations for this name. 1897 DeclNameEntries.setHasExternalDecls(); 1898 DeclNameEntries.AddSubsequentDecl(D); 1899 return; 1900 } 1901 1902 if (DeclNameEntries.isNull()) { 1903 DeclNameEntries.setOnlyValue(D); 1904 return; 1905 } 1906 1907 if (DeclNameEntries.HandleRedeclaration(D, /*IsKnownNewer*/!Internal)) { 1908 // This declaration has replaced an existing one for which 1909 // declarationReplaces returns true. 1910 return; 1911 } 1912 1913 // Put this declaration into the appropriate slot. 1914 DeclNameEntries.AddSubsequentDecl(D); 1915 } 1916 1917 UsingDirectiveDecl *DeclContext::udir_iterator::operator*() const { 1918 return cast<UsingDirectiveDecl>(*I); 1919 } 1920 1921 /// Returns iterator range [First, Last) of UsingDirectiveDecls stored within 1922 /// this context. 1923 DeclContext::udir_range DeclContext::using_directives() const { 1924 // FIXME: Use something more efficient than normal lookup for using 1925 // directives. In C++, using directives are looked up more than anything else. 1926 lookup_result Result = lookup(UsingDirectiveDecl::getName()); 1927 return udir_range(Result.begin(), Result.end()); 1928 } 1929 1930 //===----------------------------------------------------------------------===// 1931 // Creation and Destruction of StoredDeclsMaps. // 1932 //===----------------------------------------------------------------------===// 1933 1934 StoredDeclsMap *DeclContext::CreateStoredDeclsMap(ASTContext &C) const { 1935 assert(!LookupPtr && "context already has a decls map"); 1936 assert(getPrimaryContext() == this && 1937 "creating decls map on non-primary context"); 1938 1939 StoredDeclsMap *M; 1940 bool Dependent = isDependentContext(); 1941 if (Dependent) 1942 M = new DependentStoredDeclsMap(); 1943 else 1944 M = new StoredDeclsMap(); 1945 M->Previous = C.LastSDM; 1946 C.LastSDM = llvm::PointerIntPair<StoredDeclsMap*,1>(M, Dependent); 1947 LookupPtr = M; 1948 return M; 1949 } 1950 1951 void ASTContext::ReleaseDeclContextMaps() { 1952 // It's okay to delete DependentStoredDeclsMaps via a StoredDeclsMap 1953 // pointer because the subclass doesn't add anything that needs to 1954 // be deleted. 1955 StoredDeclsMap::DestroyAll(LastSDM.getPointer(), LastSDM.getInt()); 1956 } 1957 1958 void StoredDeclsMap::DestroyAll(StoredDeclsMap *Map, bool Dependent) { 1959 while (Map) { 1960 // Advance the iteration before we invalidate memory. 1961 llvm::PointerIntPair<StoredDeclsMap*,1> Next = Map->Previous; 1962 1963 if (Dependent) 1964 delete static_cast<DependentStoredDeclsMap*>(Map); 1965 else 1966 delete Map; 1967 1968 Map = Next.getPointer(); 1969 Dependent = Next.getInt(); 1970 } 1971 } 1972 1973 DependentDiagnostic *DependentDiagnostic::Create(ASTContext &C, 1974 DeclContext *Parent, 1975 const PartialDiagnostic &PDiag) { 1976 assert(Parent->isDependentContext() 1977 && "cannot iterate dependent diagnostics of non-dependent context"); 1978 Parent = Parent->getPrimaryContext(); 1979 if (!Parent->LookupPtr) 1980 Parent->CreateStoredDeclsMap(C); 1981 1982 auto *Map = static_cast<DependentStoredDeclsMap *>(Parent->LookupPtr); 1983 1984 // Allocate the copy of the PartialDiagnostic via the ASTContext's 1985 // BumpPtrAllocator, rather than the ASTContext itself. 1986 PartialDiagnostic::Storage *DiagStorage = nullptr; 1987 if (PDiag.hasStorage()) 1988 DiagStorage = new (C) PartialDiagnostic::Storage; 1989 1990 auto *DD = new (C) DependentDiagnostic(PDiag, DiagStorage); 1991 1992 // TODO: Maybe we shouldn't reverse the order during insertion. 1993 DD->NextDiagnostic = Map->FirstDiagnostic; 1994 Map->FirstDiagnostic = DD; 1995 1996 return DD; 1997 } 1998