[cfe-commits] r99447 - in /cfe/trunk: lib/CodeGen/CGStmt.cpp test/CodeGenCXX/references.cpp

Douglas Gregor dgregor at apple.com
Wed Mar 24 16:14:04 PDT 2010


Author: dgregor
Date: Wed Mar 24 18:14:04 2010
New Revision: 99447

URL: http://llvm.org/viewvc/llvm-project?rev=99447&view=rev
Log:
When returning from a function that has a reference return type, use
EmitReferenceBindingToExpr() rather than assuming we have an
lvalue. This is just the lowest hanging fruit for PR6024, which still
requires a bit of work.


Modified:
    cfe/trunk/lib/CodeGen/CGStmt.cpp
    cfe/trunk/test/CodeGenCXX/references.cpp

Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=99447&r1=99446&r2=99447&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGStmt.cpp Wed Mar 24 18:14:04 2010
@@ -607,7 +607,8 @@
   } else if (FnRetTy->isReferenceType()) {
     // If this function returns a reference, take the address of the expression
     // rather than the value.
-    Builder.CreateStore(EmitLValue(RV).getAddress(), ReturnValue);
+    RValue Result = EmitReferenceBindingToExpr(RV, false);
+    Builder.CreateStore(Result.getScalarVal(), ReturnValue);
   } else if (!hasAggregateLLVMType(RV->getType())) {
     Builder.CreateStore(EmitScalarExpr(RV), ReturnValue);
   } else if (RV->getType()->isAnyComplexType()) {

Modified: cfe/trunk/test/CodeGenCXX/references.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/references.cpp?rev=99447&r1=99446&r2=99447&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/references.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/references.cpp Wed Mar 24 18:14:04 2010
@@ -147,3 +147,10 @@
 struct s0;
 struct s1 { struct s0 &s0; };
 void f0(s1 a) { s1 b = a; }
+
+// PR6024
+// CHECK: @_Z2f2v()
+// CHECK: alloca
+// CHECK: store
+// CHECK: load
+const int &f2() { return 0; }





More information about the cfe-commits mailing list