From 6b200d0b3e3541010cbc2b7016f7796fee784449 Mon Sep 17 00:00:00 2001 From: Sean Callanan Date: Thu, 21 Mar 2013 22:15:41 +0000 Subject: [PATCH] Modified the way we report fields of records. Clang requires them to have complete types, but we were previously only completing them if they were of tag or Objective-C object types. I have implemented a method on the ASTImporter whose job is to complete a type. It handles not only the cases mentioned above, but also array and atomic types. llvm-svn: 177672 --- lldb/include/lldb/Symbol/ClangASTImporter.h | 3 +++ lldb/source/Expression/ClangASTSource.cpp | 6 +----- lldb/source/Symbol/ClangASTImporter.cpp | 29 +++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lldb/include/lldb/Symbol/ClangASTImporter.h b/lldb/include/lldb/Symbol/ClangASTImporter.h index 15f5cc3..280b5c4 100644 --- a/lldb/include/lldb/Symbol/ClangASTImporter.h +++ b/lldb/include/lldb/Symbol/ClangASTImporter.h @@ -129,6 +129,9 @@ public: CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl); bool + RequireCompleteType (clang::QualType type); + + bool ResolveDeclOrigin (const clang::Decl *decl, clang::Decl **original_decl, clang::ASTContext **original_ctx) { DeclOrigin origin = GetDeclOrigin(decl); diff --git a/lldb/source/Expression/ClangASTSource.cpp b/lldb/source/Expression/ClangASTSource.cpp index 69d7b05..419988f 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 2c7de73..f7527d1 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) { -- 2.7.4