This is an archive of the discontinued LLVM Phabricator instance.

[ASTImporter] Import ctor initializers after setting flags.
ClosedPublic

Authored by balazske on Aug 8 2019, 3:27 AM.

Details

Summary

Code to import "ctor initializers" at import of functions
is moved to be after the flags in the newly created function
are imported. This fixes an error when the already created but
incomplete (flags are not set) function declaration is accessed.

Event Timeline

balazske created this revision.Aug 8 2019, 3:27 AM
Herald added a reviewer: shafik. · View Herald Transcript
Herald added a project: Restricted Project. · View Herald Transcript
martong edited reviewers, added: a_sidorin; removed: a.sidorin.Aug 8 2019, 5:31 AM

Hello Balazs,
Do I understand correctly that it was unset ToFunction->setLexicalDeclContext(LexicalDC); that caused lookup problems?

balazske added a comment.EditedAug 11 2019, 11:47 PM

In this case the problem was that some of the flags of the already created and inserted ToFunction are not initialized. During the import of some "ctor initializers" this non-complete ToFunction may be accessed somehow (by structural equivalence or other code) and an assert comes because invalid value. (Maybe in the test code the second constructor is imported as "ctor initializer" during the import of the first.) If I remember correctly the "access" value was the invalid one.

a_sidorin added inline comments.Aug 12 2019, 10:06 PM
clang/lib/AST/ASTImporter.cpp
3293

I suggest to move it closer to the function body import because import of ctor initializers is a part of function body import in fact.

balazske updated this revision to Diff 215056.Aug 14 2019, 2:07 AM
  • Moved 'ctor initializer' import before import of body.
shafik accepted this revision.Aug 15 2019, 1:18 PM

I was hoping to be able reproduce this in LLDB via an expression like this:

expr testImportOfDelegateConstructor(10) == 10

but it does not. I am assuming the test ctu test case invokes the issues without the patch? I wonder why we don't also see it in as well.

Otherwise LGTM.

This revision is now accepted and ready to land.Aug 15 2019, 1:18 PM

LLDB probably does the import in other way. CTU test fails without the fix:

FAIL: Clang :: Analysis/ctu-main.cpp (540 of 15341)
******************** TEST 'Clang :: Analysis/ctu-main.cpp' FAILED ********************
Script:
--
: 'RUN: at line 1';   rm -rf build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp && mkdir build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp
: 'RUN: at line 2';   mkdir -p build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp/ctudir
: 'RUN: at line 3';   build/Release/bin/clang -cc1 -internal-isystem build/Release/lib/clang/10.0.0/include -nostdsysteminc -triple x86_64-pc-linux-gnu    -emit-pch -o build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp/ctudir/ctu-other.cpp.ast llvm-project/clang/test/Analysis/Inputs/ctu-other.cpp
: 'RUN: at line 5';   build/Release/bin/clang -cc1 -internal-isystem build/Release/lib/clang/10.0.0/include -nostdsysteminc -triple x86_64-pc-linux-gnu    -emit-pch -o build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp/ctudir/ctu-chain.cpp.ast llvm-project/clang/test/Analysis/Inputs/ctu-chain.cpp
: 'RUN: at line 7';   cp llvm-project/clang/test/Analysis/Inputs/ctu-other.cpp.externalDefMap.txt build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp/ctudir/externalDefMap.txt
: 'RUN: at line 8';   build/Release/bin/clang -cc1 -internal-isystem build/Release/lib/clang/10.0.0/include -nostdsysteminc -analyze -analyzer-constraints=range -triple x86_64-pc-linux-gnu    -analyzer-checker=core,debug.ExprInspection    -analyzer-config experimental-enable-naive-ctu-analysis=true    -analyzer-config ctu-dir=build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp/ctudir    -verify llvm-project/clang/test/Analysis/ctu-main.cpp
: 'RUN: at line 13';   build/Release/bin/clang -cc1 -internal-isystem build/Release/lib/clang/10.0.0/include -nostdsysteminc -analyze -analyzer-constraints=range -triple x86_64-pc-linux-gnu    -analyzer-checker=core,debug.ExprInspection    -analyzer-config experimental-enable-naive-ctu-analysis=true    -analyzer-config ctu-dir=build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp/ctudir    -analyzer-config display-ctu-progress=true 2>&1 llvm-project/clang/test/Analysis/ctu-main.cpp | build/Release/bin/FileCheck llvm-project/clang/test/Analysis/ctu-main.cpp
--
Exit Code: 134

Command Output (stderr):
--
clang: llvm-project/clang/lib/AST/DeclBase.cpp:939: bool clang::Decl::AccessDeclContextSanity() const: Assertion `Access != AS_none && "Access specifier is AS_none inside a record decl"' failed.
Stack dump:
0.      Program arguments: build/Release/bin/clang -cc1 -internal-isystem build/Release/lib/clang/10.0.0/include -nostdsysteminc -analyze -analyzer-constraints=range -triple x86_64-pc-linux-gnu -analyzer-checker=core,debug.ExprInspection -analyzer-config experimental-enable-naive-ctu-analysis=true -analyzer-config ctu-dir=build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp/ctudir -verify llvm-project/clang/test/Analysis/ctu-main.cpp 
1.      <eof> parser at end of file
2.      While analyzing stack: 
        #0 Calling main
3.      llvm-project/clang/test/Analysis/ctu-main.cpp:164:23: Error evaluating statement
4.      llvm-project/clang/test/Analysis/ctu-main.cpp:164:23: Error evaluating statement
 #0 0x00007f30c91a5efa llvm::sys::PrintStackTrace(llvm::raw_ostream&) (build/Release/lib/libLLVMSupport.so.10svn+0x191efa)
 #1 0x00007f30c91a3bd4 llvm::sys::RunSignalHandlers() (build/Release/lib/libLLVMSupport.so.10svn+0x18fbd4)
 #2 0x00007f30c91a3d12 SignalHandler(int) (build/Release/lib/libLLVMSupport.so.10svn+0x18fd12)
 #3 0x00007f30c6347f20 (/lib/x86_64-linux-gnu/libc.so.6+0x3ef20)
 #4 0x00007f30c6347e97 raise /build/glibc-OTsEL5/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
 #5 0x00007f30c6349801 abort /build/glibc-OTsEL5/glibc-2.27/stdlib/abort.c:81:0
 #6 0x00007f30c633939a __assert_fail_base /build/glibc-OTsEL5/glibc-2.27/assert/assert.c:89:0
 #7 0x00007f30c6339412 (/lib/x86_64-linux-gnu/libc.so.6+0x30412)
 #8 0x00007f30c24ad3fc (build/Release/lib/libclangAST.so.10svn+0x27c3fc)
 #9 0x00007f30c23c1f49 clang::Decl::getAccess() const (build/Release/lib/libclangAST.so.10svn+0x190f49)
#10 0x00007f30c2309f32 IsStructurallyEquivalent(clang::StructuralEquivalenceContext&, clang::CXXMethodDecl*, clang::CXXMethodDecl*) (build/Release/lib/libclangAST.so.10svn+0xd8f32)
#11 0x00007f30c243cda9 clang::StructuralEquivalenceContext::CheckKindSpecificEquivalence(clang::Decl*, clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x20bda9)
#12 0x00007f30c243d046 clang::StructuralEquivalenceContext::Finish() (build/Release/lib/libclangAST.so.10svn+0x20c046)
#13 0x00007f30c243da28 clang::StructuralEquivalenceContext::IsEquivalent(clang::Decl*, clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x20ca28)
#14 0x00007f30c23c43fb clang::ASTNodeImporter::IsStructuralMatch(clang::FunctionDecl*, clang::FunctionDecl*) (build/Release/lib/libclangAST.so.10svn+0x1933fb)
#15 0x00007f30c23d4689 clang::ASTNodeImporter::VisitFunctionDecl(clang::FunctionDecl*) (build/Release/lib/libclangAST.so.10svn+0x1a3689)
#16 0x00007f30c23d626d clang::ASTNodeImporter::VisitCXXMethodDecl(clang::CXXMethodDecl*) (build/Release/lib/libclangAST.so.10svn+0x1a526d)
#17 0x00007f30c23d62ad clang::ASTNodeImporter::VisitCXXConstructorDecl(clang::CXXConstructorDecl*) (build/Release/lib/libclangAST.so.10svn+0x1a52ad)
#18 0x00007f30c23d65d5 clang::declvisitor::Base<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Decl*> >::Visit(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a55d5)
#19 0x00007f30c23d6a4b clang::ASTImporter::Import(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a5a4b)
#20 0x00007f30c23dbec8 llvm::Expected<std::tuple<clang::CXXConstructorDecl*> > clang::ASTNodeImporter::importSeq<clang::CXXConstructorDecl*>(clang::CXXConstructorDecl* const&) (.isra.2408) (build/Release/lib/libclangAST.so.10svn+0x1aaec8)
#21 0x00007f30c241537b clang::ASTNodeImporter::VisitCXXConstructExpr(clang::CXXConstructExpr*) (build/Release/lib/libclangAST.so.10svn+0x1e437b)
#22 0x00007f30c23dcfbe clang::StmtVisitorBase<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Stmt*> >::Visit(clang::Stmt*) (build/Release/lib/libclangAST.so.10svn+0x1abfbe)
#23 0x00007f30c23dd3e7 clang::ASTImporter::Import(clang::Stmt*) (build/Release/lib/libclangAST.so.10svn+0x1ac3e7)
#24 0x00007f30c23e01e2 clang::ASTImporter::Import(clang::Expr*) (build/Release/lib/libclangAST.so.10svn+0x1af1e2)
#25 0x00007f30c241db2e clang::ASTImporter::Import(clang::CXXCtorInitializer*) (build/Release/lib/libclangAST.so.10svn+0x1ecb2e)
#26 0x00007f30c241e376 llvm::Error clang::ASTNodeImporter::ImportArrayChecked<clang::CXXCtorInitializer**, clang::CXXCtorInitializer**>(clang::CXXCtorInitializer**, clang::CXXCtorInitializer**, clang::CXXCtorInitializer**) (build/Release/lib/libclangAST.so.10svn+0x1ed376)
#27 0x00007f30c23d5b6e clang::ASTNodeImporter::VisitFunctionDecl(clang::FunctionDecl*) (build/Release/lib/libclangAST.so.10svn+0x1a4b6e)
#28 0x00007f30c23d626d clang::ASTNodeImporter::VisitCXXMethodDecl(clang::CXXMethodDecl*) (build/Release/lib/libclangAST.so.10svn+0x1a526d)
#29 0x00007f30c23d62ad clang::ASTNodeImporter::VisitCXXConstructorDecl(clang::CXXConstructorDecl*) (build/Release/lib/libclangAST.so.10svn+0x1a52ad)
#30 0x00007f30c23d65d5 clang::declvisitor::Base<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Decl*> >::Visit(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a55d5)
#31 0x00007f30c23d6a4b clang::ASTImporter::Import(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a5a4b)
#32 0x00007f30c23d82b5 llvm::Expected<clang::Decl*> clang::ASTNodeImporter::import<clang::Decl>(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a72b5)
#33 0x00007f30c24016df clang::ASTNodeImporter::ImportDeclContext(clang::DeclContext*, bool) (build/Release/lib/libclangAST.so.10svn+0x1d06df)
#34 0x00007f30c2400f07 clang::ASTNodeImporter::ImportDefinition(clang::RecordDecl*, clang::RecordDecl*, clang::ASTNodeImporter::ImportDefinitionKind) (build/Release/lib/libclangAST.so.10svn+0x1cff07)
#35 0x00007f30c240c2e9 clang::ASTNodeImporter::VisitRecordDecl(clang::RecordDecl*) (build/Release/lib/libclangAST.so.10svn+0x1db2e9)
#36 0x00007f30c23d6415 clang::declvisitor::Base<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Decl*> >::Visit(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a5415)
#37 0x00007f30c23d6a4b clang::ASTImporter::Import(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a5a4b)
#38 0x00007f30c23d9657 clang::ASTNodeImporter::VisitRecordType(clang::RecordType const*) (build/Release/lib/libclangAST.so.10svn+0x1a8657)
#39 0x00007f30c23e7ce5 clang::TypeVisitor<clang::ASTNodeImporter, llvm::Expected<clang::QualType> >::Visit(clang::Type const*) (build/Release/lib/libclangAST.so.10svn+0x1b6ce5)
#40 0x00007f30c23e7ec1 clang::ASTImporter::Import(clang::QualType) (build/Release/lib/libclangAST.so.10svn+0x1b6ec1)
#41 0x00007f30c23ebcd8 llvm::Expected<std::tuple<clang::QualType> > clang::ASTNodeImporter::importSeq<clang::QualType>(clang::QualType const&) (build/Release/lib/libclangAST.so.10svn+0x1bacd8)
#42 0x00007f30c2411c8d clang::ASTNodeImporter::VisitVarDecl(clang::VarDecl*) (build/Release/lib/libclangAST.so.10svn+0x1e0c8d)
#43 0x00007f30c23d63bd clang::declvisitor::Base<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Decl*> >::Visit(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a53bd)
#44 0x00007f30c23d6a4b clang::ASTImporter::Import(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a5a4b)
#45 0x00007f30c23d82b5 llvm::Expected<clang::Decl*> clang::ASTNodeImporter::import<clang::Decl>(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a72b5)
#46 0x00007f30c23d83ff llvm::Expected<clang::DeclGroupRef> clang::ASTNodeImporter::import<clang::DeclGroupRef>(clang::DeclGroupRef const&) (build/Release/lib/libclangAST.so.10svn+0x1a73ff)
#47 0x00007f30c23d8708 clang::ASTNodeImporter::VisitDeclStmt(clang::DeclStmt*) (build/Release/lib/libclangAST.so.10svn+0x1a7708)
#48 0x00007f30c23dd1e0 clang::StmtVisitorBase<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Stmt*> >::Visit(clang::Stmt*) (build/Release/lib/libclangAST.so.10svn+0x1ac1e0)
#49 0x00007f30c23dd3e7 clang::ASTImporter::Import(clang::Stmt*) (build/Release/lib/libclangAST.so.10svn+0x1ac3e7)
#50 0x00007f30c23dd685 llvm::Expected<clang::Stmt*> clang::ASTNodeImporter::import<clang::Stmt>(clang::Stmt*) (build/Release/lib/libclangAST.so.10svn+0x1ac685)
#51 0x00007f30c23dd904 clang::ASTNodeImporter::VisitCompoundStmt(clang::CompoundStmt*) (build/Release/lib/libclangAST.so.10svn+0x1ac904)
#52 0x00007f30c23dd214 clang::StmtVisitorBase<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Stmt*> >::Visit(clang::Stmt*) (build/Release/lib/libclangAST.so.10svn+0x1ac214)
#53 0x00007f30c23dd3e7 clang::ASTImporter::Import(clang::Stmt*) (build/Release/lib/libclangAST.so.10svn+0x1ac3e7)
#54 0x00007f30c23dd685 llvm::Expected<clang::Stmt*> clang::ASTNodeImporter::import<clang::Stmt>(clang::Stmt*) (build/Release/lib/libclangAST.so.10svn+0x1ac685)
#55 0x00007f30c23dd79f clang::ASTNodeImporter::ImportFunctionDeclBody(clang::FunctionDecl*, clang::FunctionDecl*) (build/Release/lib/libclangAST.so.10svn+0x1ac79f)
#56 0x00007f30c23d596b clang::ASTNodeImporter::VisitFunctionDecl(clang::FunctionDecl*) (build/Release/lib/libclangAST.so.10svn+0x1a496b)
#57 0x00007f30c23d63e5 clang::declvisitor::Base<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Decl*> >::Visit(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a53e5)
#58 0x00007f30c23d6a4b clang::ASTImporter::Import(clang::Decl*) (build/Release/lib/libclangAST.so.10svn+0x1a5a4b)
#59 0x00007f30be7a7e6d clang::cross_tu::CrossTranslationUnitContext::importDefinition(clang::FunctionDecl const*, clang::ASTUnit*) (build/Release/lib/libclangCrossTU.so.10svn+0xde6d)
#60 0x00007f30be7a8501 clang::cross_tu::CrossTranslationUnitContext::getCrossTUDefinition(clang::FunctionDecl const*, llvm::StringRef, llvm::StringRef, bool) (build/Release/lib/libclangCrossTU.so.10svn+0xe501)
#61 0x00007f30bdd0c985 clang::ento::AnyFunctionCall::getRuntimeDefinition() const (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0xaf985)
#62 0x00007f30bdd7479b clang::ento::ExprEngine::defaultEvalCall(clang::ento::NodeBuilder&, clang::ento::ExplodedNode*, clang::ento::CallEvent const&, clang::ento::ExprEngine::EvalCallOptions const&) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0x11779b)
#63 0x00007f30bdd1a0c9 clang::ento::CheckerManager::runCheckersForEvalCall(clang::ento::ExplodedNodeSet&, clang::ento::ExplodedNodeSet const&, clang::ento::CallEvent const&, clang::ento::ExprEngine&) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0xbd0c9)
#64 0x00007f30bdd70ebf clang::ento::ExprEngine::evalCall(clang::ento::ExplodedNodeSet&, clang::ento::ExplodedNode*, clang::ento::CallEvent const&) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0x113ebf)
#65 0x00007f30bdd711f8 clang::ento::ExprEngine::VisitCallExpr(clang::CallExpr const*, clang::ento::ExplodedNode*, clang::ento::ExplodedNodeSet&) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0x1141f8)
#66 0x00007f30bdd5598d clang::ento::ExprEngine::Visit(clang::Stmt const*, clang::ento::ExplodedNode*, clang::ento::ExplodedNodeSet&) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0xf898d)
#67 0x00007f30bdd56594 clang::ento::ExprEngine::ProcessStmt(clang::Stmt const*, clang::ento::ExplodedNode*) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0xf9594)
#68 0x00007f30bdd56782 clang::ento::ExprEngine::processCFGElement(clang::CFGElement, clang::ento::ExplodedNode*, unsigned int, clang::ento::NodeBuilderContext*) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0xf9782)
#69 0x00007f30bdd23cbb clang::ento::CoreEngine::HandlePostStmt(clang::CFGBlock const*, unsigned int, clang::ento::ExplodedNode*) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0xc6cbb)
#70 0x00007f30bdd23f27 clang::ento::CoreEngine::dispatchWorkItem(clang::ento::ExplodedNode*, clang::ProgramPoint, clang::ento::WorkListUnit const&) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0xc6f27)
#71 0x00007f30bdd241a4 clang::ento::CoreEngine::ExecuteWorkList(clang::LocationContext const*, unsigned int, llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>) (build/Release/lib/libclangStaticAnalyzerCore.so.10svn+0xc71a4)
#72 0x00007f30bf3e9339 (anonymous namespace)::AnalysisConsumer::HandleCode(clang::Decl*, unsigned int, clang::ento::ExprEngine::InliningModes, llvm::DenseSet<clang::Decl const*, llvm::DenseMapInfo<clang::Decl const*> >*) (build/Release/lib/libclangStaticAnalyzerFrontend.so.10svn+0x2f339)
#73 0x00007f30bf3f8868 (anonymous namespace)::AnalysisConsumer::runAnalysisOnTranslationUnit(clang::ASTContext&) (build/Release/lib/libclangStaticAnalyzerFrontend.so.10svn+0x3e868)
#74 0x00007f30bf3f963b (anonymous namespace)::AnalysisConsumer::HandleTranslationUnit(clang::ASTContext&) (build/Release/lib/libclangStaticAnalyzerFrontend.so.10svn+0x3f63b)
#75 0x00007f30c0da3e49 clang::ParseAST(clang::Sema&, bool, bool) (build/Release/lib/libclangParse.so.10svn+0x2fe49)
#76 0x00007f30c71c23a9 clang::FrontendAction::Execute() (build/Release/lib/libclangFrontend.so.10svn+0xf83a9)
#77 0x00007f30c717cab1 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (build/Release/lib/libclangFrontend.so.10svn+0xb2ab1)
#78 0x00007f30c6ec784f clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (build/Release/lib/libclangFrontendTool.so.10svn+0x484f)
#79 0x0000557bea4109cf cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (build/Release/bin/clang+0x129cf)
#80 0x0000557bea40b3c9 main (build/Release/bin/clang+0xd3c9)
#81 0x00007f30c632ab97 __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:344:0
#82 0x0000557bea40c1ba _start (build/Release/bin/clang+0xe1ba)
build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.script: line 7: 12535 Aborted                 (core dumped) build/Release/bin/clang -cc1 -internal-isystem build/Release/lib/clang/10.0.0/include -nostdsysteminc -analyze -analyzer-constraints=range -triple x86_64-pc-linux-gnu -analyzer-checker=core,debug.ExprInspection -analyzer-config experimental-enable-naive-ctu-analysis=true -analyzer-config ctu-dir=build/Release/tools/clang/test/Analysis/Output/ctu-main.cpp.tmp/ctudir -verify llvm-project/clang/test/Analysis/ctu-main.cpp
This revision was automatically updated to reflect the committed changes.
Herald added a project: Restricted Project. · View Herald TranscriptAug 16 2019, 5:13 AM