]> granicus.if.org Git - clang/commitdiff
Add IRGen support for return statements in functions with reference
authorEli Friedman <eli.friedman@gmail.com>
Wed, 27 May 2009 04:56:12 +0000 (04:56 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 27 May 2009 04:56:12 +0000 (04:56 +0000)
type.

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

lib/CodeGen/CGStmt.cpp
test/CodeGenCXX/references.cpp

index b13b9e529d3c7e8a65c2e54858a52a6c1f578ba6..b67996c676307a8abfee37a6818442d08180220a 100644 (file)
@@ -498,6 +498,10 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) {
       EmitAnyExpr(RV);
   } else if (RV == 0) {
     // Do nothing (return value is left uninitialized)
+  } 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);
   } else if (!hasAggregateLLVMType(RV->getType())) {
     Builder.CreateStore(EmitScalarExpr(RV), ReturnValue);
   } else if (RV->getType()->isAnyComplexType()) {
index e5db446faecf48ba0da888ebe204926b7271473a..5c5518b38bce6589184dc308c3cc34bc74027940 100644 (file)
@@ -75,3 +75,6 @@ void test_aggregate() {
   aggregate_reference_return().a = 10;
 }
 
+int& reference_return() {
+  return g;
+}