[PATCH] D58920: [Modules][PR39287] Consolidate multiple std's

Brian Gesiak via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon May 13 10:47:34 PDT 2019


modocache added a comment.

Thanks @rsmith for the guidance here! I appreciate it very much. One snag I ran into after following your suggestion, though, is that when I modify `ASTDeclReader::findExisting` to return Sema's existing implicit std namespace, I run into an assertion later on, when the decl chain is being marked as incomplete. That is, the following patch (debug output included):

  diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp
  index 32bd82d077..9d447952e1 100644
  --- a/lib/Serialization/ASTReaderDecl.cpp
  +++ b/lib/Serialization/ASTReaderDecl.cpp
  @@ -47,6 +47,7 @@
   #include "clang/Basic/SourceLocation.h"
   #include "clang/Basic/Specifiers.h"
   #include "clang/Sema/IdentifierResolver.h"
  +#include "clang/Sema/Sema.h"
   #include "clang/Serialization/ASTBitCodes.h"
   #include "clang/Serialization/ASTReader.h"
   #include "clang/Serialization/ContinuousRangeMap.h"
  @@ -3401,6 +3402,22 @@ ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
             return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
                                       TypedefNameForLinkage);
       }
  +    if (isa<NamespaceDecl>(D) && D->getName() == "std") {
  +      llvm::outs() << "Found std namespace: ";
  +      D->dump();
  +      llvm::outs() << "Merging into Sema std namespace: ";
  +      Sema *S = Reader.getSema();
  +      S->getStdNamespace()->dump();
  +      NamedDecl *Existing =
  +          getDeclForMerging(S->getStdNamespace(), TypedefNameForLinkage);
  +      llvm::outs() << "Found Existing: ";
  +      Existing->dump();
  +      if (isSameEntity(Existing, D)) {
  +        llvm::outs() << "isSameEntity is true\n";
  +        return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
  +                                  TypedefNameForLinkage);
  +      }
  +    }
     } else {
       // Not in a mergeable context.
       return FindExistingResult(Reader);

Results in the expected output, along with an unexpected assert:

  Found std namespace: NamespaceDecl 0x55a391530910 <mod-virtual-destructor-bug/a.h:1:1, col:16> col:11 imported in a.h std
  Merging into Sema std namespace: NamespaceDecl 0x55a391501ec8 <<invalid sloc>> <invalid sloc> implicit std
  Found Existing: NamespaceDecl 0x55a391501ec8 <<invalid sloc>> <invalid sloc> implicit std
  isSameEntity is true
  clang-9: ../include/llvm/ADT/PointerUnion.h:135: T llvm::PointerUnion<PT1, PT2>::get() const [with T = clang::LazyGenerationalUpdatePtr<const clang::Decl*, clang::Decl*, &clang::ExternalASTSource::CompleteRedeclChain>; PT1 = llvm::PointerUnion<clang::Decl*, const void*>; PT2 = clang::LazyGenerationalUpdatePtr<const clang::Decl*, clang::Decl*, &clang::ExternalASTSource::CompleteRedeclChain>]: Assertion `is<T>() && "Invalid accessor called"' failed.
  Stack dump:
  0.      Program arguments: /home/modocache/Source/llvm/git/dev/llvm/build/bin/clang-9 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -main-file-name mod-virtual-destructor-bug.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -resource-dir /home/modocache/Source/llvm/git/dev/llvm/build/lib/clang/9.0.0 -I mod-virtual-destructor-bug -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/x86_64-linux-gnu/c++/8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/x86_64-linux-gnu/c++/8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/backward -internal-isystem /usr/local/include -internal-isystem /home/modocache/Source/llvm/git/dev/llvm/build/lib/clang/9.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -std=c++17 -fdeprecated-macro -fdebug-compilation-dir /home/modocache/Source/tmp/mod -ferror-limit 19 -fmessage-length 195 -fmodules -fimplicit-module-maps -fmodules-cache-path=mod-virtual-destructor-cache -fmodules-validate-system-headers -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/mod-virtual-destructor-bug-0da92f.o -x c++ mod-virtual-destructor-bug.cpp -faddrsig
  1.      mod-virtual-destructor-bug.cpp:10:17: current parser token 'class'
   #0 0x000055a388bfaaa5 llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/modocache/Source/llvm/git/dev/llvm/build/../lib/Support/Unix/Signals.inc:494:22
   #1 0x000055a388bfab38 PrintStackTraceSignalHandler(void*) /home/modocache/Source/llvm/git/dev/llvm/build/../lib/Support/Unix/Signals.inc:558:1
   #2 0x000055a388bf8b32 llvm::sys::RunSignalHandlers() /home/modocache/Source/llvm/git/dev/llvm/build/../lib/Support/Signals.cpp:68:20
   #3 0x000055a388bfa4fb SignalHandler(int) /home/modocache/Source/llvm/git/dev/llvm/build/../lib/Support/Unix/Signals.inc:357:1
   #4 0x00007f909ab86dd0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12dd0)
   #5 0x00007f909a249077 raise /build/glibc-B9XfQf/glibc-2.28/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
   #6 0x00007f909a22a535 abort /build/glibc-B9XfQf/glibc-2.28/stdlib/abort.c:81:7
   #7 0x00007f909a22a40f get_sysdep_segment_value /build/glibc-B9XfQf/glibc-2.28/intl/loadmsgcat.c:509:8
   #8 0x00007f909a22a40f _nl_load_domain /build/glibc-B9XfQf/glibc-2.28/intl/loadmsgcat.c:970:34
   #9 0x00007f909a23a142 (/lib/x86_64-linux-gnu/libc.so.6+0x32142)
  #10 0x000055a388ec8ee7 clang::LazyGenerationalUpdatePtr<clang::Decl const*, clang::Decl*, &(clang::ExternalASTSource::CompleteRedeclChain(clang::Decl const*))> llvm::PointerUnion<llvm::PointerUnion<clang::Decl*, void const*>, clang::LazyGenerationalUpdatePtr<clang::Decl const*, clang::Decl*, &(clang::ExternalASTSource::CompleteRedeclChain(clang::Decl const*))> >::get<clang::LazyGenerationalUpdatePtr<clang::Decl const*, clang::Decl*, &(clang::ExternalASTSource::CompleteRedeclChain(clang::Decl const*))> >() const /home/modocache/Source/llvm/git/dev/llvm/build/../include/llvm/ADT/PointerUnion.h:135:5
  #11 0x000055a38986268d clang::Redeclarable<clang::NamespaceDecl>::DeclLink::markIncomplete() /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/include/clang/AST/Redeclarable.h:156:50
  #12 0x000055a38985907a void clang::ASTDeclReader::markIncompleteDeclChainImpl<clang::NamespaceDecl>(clang::Redeclarable<clang::NamespaceDecl>*) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Serialization/ASTReaderDecl.cpp:3651:1
  #13 0x000055a38983e243 clang::ASTReader::markIncompleteDeclChain(clang::Decl*) /home/modocache/Source/llvm/git/dev/llvm/build/tools/clang/include/clang/AST/DeclNodes.inc:105:1
  #14 0x000055a389795c25 clang::ASTReader::finishPendingActions() /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Serialization/ASTReader.cpp:9309:5
  #15 0x000055a3897a27df clang::ASTReader::FinishedDeserializing() /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Serialization/ASTReader.cpp:11563:5
  #16 0x000055a3897ad297 clang::ExternalASTSource::Deserializing::~Deserializing() /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/include/clang/AST/ExternalASTSource.h:90:5
  #17 0x000055a38978d994 clang::ASTReader::FindExternalVisibleDeclsByName(clang::DeclContext const*, clang::DeclarationName) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Serialization/ASTReader.cpp:7561:35
  #18 0x000055a38c4c0fa8 clang::DeclContext::lookup(clang::DeclarationName) const (.localalias.2) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/AST/DeclBase.cpp:1635:60
  #19 0x000055a38bb9dd35 LookupDirect(clang::Sema&, clang::LookupResult&, clang::DeclContext const*) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Sema/SemaLookup.cpp:845:23
  #20 0x000055a38bba142f clang::Sema::LookupQualifiedName(clang::LookupResult&, clang::DeclContext*, bool) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Sema/SemaLookup.cpp:2055:3
  #21 0x000055a38b86d705 clang::Sema::ActOnStartNamespaceDef(clang::Scope*, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, clang::IdentifierInfo*,clang::SourceLocation, clang::ParsedAttributesView const&, clang::UsingDirectiveDecl*&) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Sema/SemaDeclCXX.cpp:8915:25
  #22 0x000055a38b41cbae clang::Parser::ParseNamespace(clang::DeclaratorContext, clang::SourceLocation&, clang::SourceLocation) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Parse/ParseDeclCXX.cpp:215:53
  #23 0x000055a38b3fe8a5 clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Parse/ParseDecl.cpp:1714:43
  #24 0x000055a38b3e11e6 clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) (.localalias.1) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Parse/Parser.cpp:856:77
  #25 0x000055a38b3e0861 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, bool) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Parse/Parser.cpp:674:42
  #26 0x000055a38b3dc6dc clang::ParseAST(clang::Sema&, bool, bool) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Parse/ParseAST.cpp:158:37
  #27 0x000055a3895f86ef clang::ASTFrontendAction::ExecuteAction() /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Frontend/FrontendAction.cpp:1035:11
  #28 0x000055a389e277f9 clang::CodeGenAction::ExecuteAction() /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/CodeGen/CodeGenAction.cpp:1057:1
  #29 0x000055a3895f80de clang::FrontendAction::Execute() /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Frontend/FrontendAction.cpp:938:38
  #30 0x000055a3895966d6 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/Frontend/CompilerInstance.cpp:945:24
  #31 0x000055a38974e262 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:271:38
  #32 0x000055a387732e03 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/tools/driver/cc1_main.cpp:225:40
  #33 0x000055a38772871d ExecuteCC1Tool(llvm::ArrayRef<char const*>, llvm::StringRef) /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/tools/driver/driver.cpp:309:64
  #34 0x000055a387728dfb main /home/modocache/Source/llvm/git/dev/llvm/build/../tools/clang/tools/driver/driver.cpp:381:26
  #35 0x00007f909a22c09b __libc_start_main /build/glibc-B9XfQf/glibc-2.28/csu/../csu/libc-start.c:342:3
  #36 0x000055a387726eea _start (/home/modocache/Source/llvm/git/dev/llvm/build/bin/clang-9+0x2070eea)
  fish: “"/home/modocache/Source/llvm/gi…” terminated by signal SIGABRT (Abort)

I'm looking into how to avoid this assertion, but for the time being I thought I'd post an update to let everyone know this patch isn't abandoned :)


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D58920/new/

https://reviews.llvm.org/D58920





More information about the cfe-commits mailing list