Updated Clang to take an enhancement to the way
we handle Objective-C method calls. Currently,
LLDB treats the result of an Objective-C method
as unknown if the type information doesn't have
the method's signature. Now Clang can cast the
result to id if it isn't explicitly cast.
I also added a test case for this, as well as a
fix for a type import problem that this feature
exposed.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@146756 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/ClangExpressionDeclMap.cpp b/source/Expression/ClangExpressionDeclMap.cpp
index 12833ca..e019334 100644
--- a/source/Expression/ClangExpressionDeclMap.cpp
+++ b/source/Expression/ClangExpressionDeclMap.cpp
@@ -444,9 +444,9 @@
ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
- TypeFromUser user_type(m_ast_importer->CopyType(context,
- parser_type.GetASTContext(),
- parser_type.GetOpaqueQualType()),
+ TypeFromUser user_type(m_ast_importer->DeportType(context,
+ parser_type.GetASTContext(),
+ parser_type.GetOpaqueQualType()),
context);
if (!user_type.GetOpaqueQualType())
diff --git a/source/Symbol/ClangASTImporter.cpp b/source/Symbol/ClangASTImporter.cpp
index 3bbd9c6..2cee0ae 100644
--- a/source/Symbol/ClangASTImporter.cpp
+++ b/source/Symbol/ClangASTImporter.cpp
@@ -71,6 +71,39 @@
return NULL;
}
+lldb::clang_type_t
+ClangASTImporter::DeportType (clang::ASTContext *dst_ctx,
+ clang::ASTContext *src_ctx,
+ lldb::clang_type_t type)
+{
+ lldb::clang_type_t result = CopyType(dst_ctx, src_ctx, type);
+
+ if (!result)
+ return NULL;
+
+ QualType qual_type = QualType::getFromOpaquePtr(type);
+
+ if (const TagType *tag_type = qual_type->getAs<TagType>())
+ {
+ TagDecl *tag_decl = tag_type->getDecl();
+ const TagType *result_tag_type = QualType::getFromOpaquePtr(result)->getAs<TagType>();
+ TagDecl *result_tag_decl = result_tag_type->getDecl();
+
+ if (tag_decl)
+ {
+ MinionSP minion_sp (GetMinion (dst_ctx, src_ctx));
+
+ minion_sp->ImportDefinition(tag_decl);
+
+ ASTContextMetadataSP to_context_md = GetContextMetadata(dst_ctx);
+
+ to_context_md->m_origins.erase(result_tag_decl);
+ }
+ }
+
+ return result;
+}
+
clang::Decl *
ClangASTImporter::DeportDecl (clang::ASTContext *dst_ctx,
clang::ASTContext *src_ctx,
@@ -398,7 +431,7 @@
if (to_interface_decl->isForwardDecl())
to_interface_decl->completedForwardDecl();
-
+
to_interface_decl->setExternallyCompleted();
if (log)