]> granicus.if.org Git - clang/commitdiff
patch to ir-gen conversion function call used in
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 23 Sep 2009 22:34:00 +0000 (22:34 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 23 Sep 2009 22:34:00 +0000 (22:34 +0000)
initializing a reference class.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82664 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/CodeGenCXX/decl-ref-init.cpp [new file with mode: 0644]

index 4de2de2b647741adc02d0a1d6ee505160ac0fbab..3e832025752ac9cf90e0ffb7fcf4b38086649e79 100644 (file)
@@ -3527,10 +3527,15 @@ Sema::CheckReferenceInit(Expr *&Init, QualType DeclType,
                "Expected a direct reference binding!");
         return false;
       } else {
-        // Perform the conversion.
-        // FIXME: Binding to a subobject of the lvalue is going to require more
-        // AST annotation than this.
-        ImpCastExprToType(Init, T1, CastExpr::CK_Unknown, /*isLvalue=*/true);
+        OwningExprResult InitConversion =
+          BuildCXXCastArgument(Init->getLocStart(), QualType(),
+                               CastExpr::CK_UserDefinedConversion,
+                               cast<CXXMethodDecl>(Best->Function), 
+                               Owned(Init));
+        Init = InitConversion.takeAs<Expr>();
+                                    
+        ImpCastExprToType(Init, T1, CastExpr::CK_UserDefinedConversion, 
+                          /*isLvalue=*/true);
       }
       break;
 
diff --git a/test/CodeGenCXX/decl-ref-init.cpp b/test/CodeGenCXX/decl-ref-init.cpp
new file mode 100644 (file)
index 0000000..27d200f
--- /dev/null
@@ -0,0 +1,31 @@
+// RUN: clang-cc -triple x86_64-apple-darwin -S %s -o %t-64.s &&
+// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s &&
+// RUN: clang-cc -triple i386-apple-darwin -S %s -o %t-32.s &&
+// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s &&
+// RUN: true
+
+struct A {};
+
+struct B 
+{ 
+  operator A&();
+}; 
+
+
+struct D : public B {
+  operator A();
+};
+
+extern B f(); 
+extern D d(); 
+
+int main() {
+       const A& rca = f();
+       const A& rca2 = d();
+}
+
+// CHECK-LP64: call     __ZN1BcvR1AEv
+// CHECK-LP64: call     __ZN1BcvR1AEv
+
+// CHECK-LP32: call     L__ZN1BcvR1AEv
+// CHECK-LP32: call     L__ZN1BcvR1AEv