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)