Skip to content

Commit 2a80d12

Browse files
committed
[lldb][Type Completion] Only create importer delegates if definition is valid
1 parent c6a3b0e commit 2a80d12

File tree

1 file changed

+33
-27
lines changed

1 file changed

+33
-27
lines changed

lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -824,23 +824,17 @@ bool ClangASTImporter::CompleteTagDecl(clang::TagDecl *decl) {
824824
if (!decl_origin.Valid())
825825
return false;
826826

827-
ImporterDelegateSP delegate_sp(
828-
GetDelegate(&decl->getASTContext(), decl_origin.ctx));
829-
830-
ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp,
831-
&decl->getASTContext());
832-
833-
if (!TypeSystemClang::UseRedeclCompletion()) {
834-
if (!TypeSystemClang::GetCompleteDecl(decl_origin.ctx, decl_origin.decl))
835-
return false;
836-
837-
if (delegate_sp)
838-
delegate_sp->ImportDefinitionTo(decl, decl_origin.decl);
839-
} else {
827+
if (TypeSystemClang::UseRedeclCompletion()) {
840828
auto *origin_def = llvm::cast<TagDecl>(decl_origin.decl)->getDefinition();
841829
if (!origin_def)
842830
return false;
843831

832+
ImporterDelegateSP delegate_sp(
833+
GetDelegate(&decl->getASTContext(), decl_origin.ctx));
834+
835+
ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp,
836+
&decl->getASTContext());
837+
844838
// This is expected to pull in a definition for result_decl (if in redecl
845839
// completion mode)
846840
llvm::Expected<Decl *> result = delegate_sp->Import(origin_def);
@@ -859,6 +853,18 @@ bool ClangASTImporter::CompleteTagDecl(clang::TagDecl *decl) {
859853
if (!decl->isThisDeclarationADefinition() && result_decl != decl)
860854
if (result_decl->getPreviousDecl() == nullptr)
861855
result_decl->setPreviousDecl(decl);
856+
} else {
857+
if (!TypeSystemClang::GetCompleteDecl(decl_origin.ctx, decl_origin.decl))
858+
return false;
859+
860+
ImporterDelegateSP delegate_sp(
861+
GetDelegate(&decl->getASTContext(), decl_origin.ctx));
862+
863+
ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp,
864+
&decl->getASTContext());
865+
866+
if (delegate_sp)
867+
delegate_sp->ImportDefinitionTo(decl, decl_origin.decl);
862868
}
863869

864870
return true;
@@ -880,27 +886,15 @@ bool ClangASTImporter::CompleteObjCInterfaceDecl(
880886
if (!decl_origin.Valid())
881887
return false;
882888

883-
ImporterDelegateSP delegate_sp(
884-
GetDelegate(&interface_decl->getASTContext(), decl_origin.ctx));
885-
886-
if (!TypeSystemClang::UseRedeclCompletion()) {
887-
if (!TypeSystemClang::GetCompleteDecl(decl_origin.ctx, decl_origin.decl))
888-
return false;
889-
890-
if (delegate_sp)
891-
delegate_sp->ImportDefinitionTo(interface_decl, decl_origin.decl);
892-
893-
if (ObjCInterfaceDecl *super_class = interface_decl->getSuperClass())
894-
RequireCompleteType(clang::QualType(super_class->getTypeForDecl(), 0));
895-
} else {
889+
if (TypeSystemClang::UseRedeclCompletion()) {
896890
ObjCInterfaceDecl *origin_decl =
897891
llvm::cast<ObjCInterfaceDecl>(decl_origin.decl);
898892

899893
origin_decl = origin_decl->getDefinition();
900894
if (!origin_decl)
901895
return false;
902896

903-
auto delegate_sp(
897+
ImporterDelegateSP delegate_sp(
904898
GetDelegate(&interface_decl->getASTContext(), decl_origin.ctx));
905899

906900
llvm::Expected<Decl *> result = delegate_sp->Import(origin_decl);
@@ -915,6 +909,18 @@ bool ClangASTImporter::CompleteObjCInterfaceDecl(
915909
return false;
916910
}
917911

912+
if (!TypeSystemClang::GetCompleteDecl(decl_origin.ctx, decl_origin.decl))
913+
return false;
914+
915+
ImporterDelegateSP delegate_sp(
916+
GetDelegate(&interface_decl->getASTContext(), decl_origin.ctx));
917+
918+
if (delegate_sp)
919+
delegate_sp->ImportDefinitionTo(interface_decl, decl_origin.decl);
920+
921+
if (ObjCInterfaceDecl *super_class = interface_decl->getSuperClass())
922+
RequireCompleteType(clang::QualType(super_class->getTypeForDecl(), 0));
923+
918924
return true;
919925
}
920926

0 commit comments

Comments
 (0)