diff --git a/lldb/include/lldb/Symbol/ClangASTImporter.h b/lldb/include/lldb/Symbol/ClangASTImporter.h --- a/lldb/include/lldb/Symbol/ClangASTImporter.h +++ b/lldb/include/lldb/Symbol/ClangASTImporter.h @@ -231,6 +231,8 @@ clang::Decl *GetOriginalDecl(clang::Decl *To) override; + void SetCompleted(clang::Decl *from); + void SetImportListener(NewDeclListener *listener) { assert(m_new_decl_listener == nullptr && "Already attached a listener?"); m_new_decl_listener = listener; @@ -246,6 +248,7 @@ /// were created from the 'std' C++ module to prevent that the Importer /// tries to sync them with the broken equivalent in the debug info AST. llvm::SmallPtrSet m_decls_to_ignore; + llvm::SmallPtrSet m_completed_decls; ClangASTImporter &m_master; clang::ASTContext *m_source_ctx; CxxModuleHandler *m_std_handler = nullptr; @@ -257,6 +260,7 @@ typedef llvm::DenseMap DelegateMap; typedef llvm::DenseMap NamespaceMetaMap; + typedef std::set CompletedRecordSet; struct ASTContextMetadata { ASTContextMetadata(clang::ASTContext *dst_ctx) diff --git a/lldb/source/Symbol/ClangASTImporter.cpp b/lldb/source/Symbol/ClangASTImporter.cpp --- a/lldb/source/Symbol/ClangASTImporter.cpp +++ b/lldb/source/Symbol/ClangASTImporter.cpp @@ -42,9 +42,12 @@ if (!delegate_sp) return CompilerType(); + delegate_sp->SetCompleted(src_qual_type->getAsTagDecl()); + ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, &dst_clang_ast); llvm::Expected ret_or_error = delegate_sp->Import(src_qual_type); + if (!ret_or_error) { Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS); @@ -252,6 +255,7 @@ if (auto *tag_decl = dyn_cast(decl)) { if (auto *original_tag_decl = dyn_cast(original_decl)) { if (original_tag_decl->isCompleteDefinition()) { + m_delegate->SetCompleted(original_tag_decl); m_delegate->ImportDefinitionTo(tag_decl, original_tag_decl); tag_decl->setCompleteDefinition(true); } @@ -584,6 +588,8 @@ ImporterDelegateSP delegate_sp( GetDelegate(&decl->getASTContext(), decl_origin.ctx)); + delegate_sp->SetCompleted(decl_origin.decl); + ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, &decl->getASTContext()); if (delegate_sp) @@ -855,6 +861,10 @@ ClangASTImporter::MapCompleter::~MapCompleter() { return; } +void ClangASTImporter::ASTImporterDelegate::SetCompleted(Decl *from) { + m_completed_decls.insert(from); +} + llvm::Expected ClangASTImporter::ASTImporterDelegate::ImportImpl(Decl *From) { if (m_std_handler) { @@ -903,7 +913,20 @@ } } - return ASTImporter::ImportImpl(From); + CXXRecordDecl *record_decl_to_set_complete = nullptr; + if (CXXRecordDecl *record_decl = dyn_cast(From)) { + if (record_decl->isCompleteDefinition() && + !record_decl->isAnonymousStructOrUnion() && + m_completed_decls.find(From) == m_completed_decls.end()) { + record_decl->setCompleteDefinition(false); + record_decl_to_set_complete = record_decl; + } + } + llvm::Expected result = ASTImporter::ImportImpl(From); + if (record_decl_to_set_complete) { + record_decl_to_set_complete->setCompleteDefinition(true); + } + return result; } void ClangASTImporter::ASTImporterDelegate::ImportDefinitionTo(