diff --git a/lldb/include/lldb/Symbol/ClangASTImporter.h b/lldb/include/lldb/Symbol/ClangASTImporter.h index 15f5cc37d821..280b5c4b87ed 100644 --- a/lldb/include/lldb/Symbol/ClangASTImporter.h +++ b/lldb/include/lldb/Symbol/ClangASTImporter.h @@ -128,6 +128,9 @@ public: bool CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl); + bool + RequireCompleteType (clang::QualType type); + bool ResolveDeclOrigin (const clang::Decl *decl, clang::Decl **original_decl, clang::ASTContext **original_ctx) { diff --git a/lldb/source/Expression/ClangASTSource.cpp b/lldb/source/Expression/ClangASTSource.cpp index 69d7b059e77f..419988fa1eb1 100644 --- a/lldb/source/Expression/ClangASTSource.cpp +++ b/lldb/source/Expression/ClangASTSource.cpp @@ -468,11 +468,7 @@ ClangASTSource::FindExternalLexicalDecls (const DeclContext *decl_context, { QualType copied_field_type = copied_field->getType(); - if (const TagType *copied_field_tag_type = copied_field_type->getAs()) - m_ast_importer->CompleteTagDecl(copied_field_tag_type->getDecl()); - if (const ObjCObjectType *copied_field_object_type = copied_field_type->getAs()) - if (ObjCInterfaceDecl *copied_field_objc_interface_decl = copied_field_object_type->getInterface()) - m_ast_importer->CompleteObjCInterfaceDecl(copied_field_objc_interface_decl); + m_ast_importer->RequireCompleteType(copied_field_type); } decls.push_back(copied_decl); diff --git a/lldb/source/Symbol/ClangASTImporter.cpp b/lldb/source/Symbol/ClangASTImporter.cpp index 2c7de7391455..f7527d1cb65d 100644 --- a/lldb/source/Symbol/ClangASTImporter.cpp +++ b/lldb/source/Symbol/ClangASTImporter.cpp @@ -302,6 +302,35 @@ ClangASTImporter::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface return true; } +bool +ClangASTImporter::RequireCompleteType (clang::QualType type) +{ + if (type.isNull()) + return false; + + if (const TagType *tag_type = type->getAs()) + { + return CompleteTagDecl(tag_type->getDecl()); + } + if (const ObjCObjectType *objc_object_type = type->getAs()) + { + if (ObjCInterfaceDecl *objc_interface_decl = objc_object_type->getInterface()) + return CompleteObjCInterfaceDecl(objc_interface_decl); + else + return false; + } + if (const ArrayType *array_type = type->getAsArrayTypeUnsafe()) + { + return RequireCompleteType(array_type->getElementType()); + } + if (const AtomicType *atomic_type = type->getAs()) + { + return RequireCompleteType(atomic_type->getPointeeType()); + } + + return true; +} + ClangASTMetadata * ClangASTImporter::GetDeclMetadata (const clang::Decl *decl) {