]> granicus.if.org Git - clang/commitdiff
Add support for emitting calls to functions that return references (as lvalues only...
authorAnders Carlsson <andersca@mac.com>
Wed, 27 May 2009 01:45:47 +0000 (01:45 +0000)
committerAnders Carlsson <andersca@mac.com>
Wed, 27 May 2009 01:45:47 +0000 (01:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72449 91177308-0d34-0410-b5e6-96231b3b80d8

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

index f6081c61f9c01b58f3b21c97ec9ce1d27cfd2440..45e19f139ac65f509ba189216a560444b4167a44 100644 (file)
@@ -1161,8 +1161,17 @@ LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) {
 }
 
 LValue CodeGenFunction::EmitCallExprLValue(const CallExpr *E) {
-  // Can only get l-value for call expression returning aggregate type
   RValue RV = EmitCallExpr(E);
+
+  if (RV.isScalar()) {
+    assert(E->getCallReturnType()->isReferenceType() &&
+           "Can't have a scalar return unless the return type is a "
+           "reference type!");
+    
+    return LValue::MakeAddr(RV.getScalarVal(), E->getType().getCVRQualifiers(), 
+                            getContext().getObjCGCAttrKind(E->getType()));
+  }
+  
   return LValue::MakeAddr(RV.getAggregateAddr(),
                           E->getType().getCVRQualifiers(),
                           getContext().getObjCGCAttrKind(E->getType()));
index 0124f695b3b03c43d579aea53cd35c1f9a07da5f..97fc15e0359a376d0cb45b9d1307810349f4b497 100644 (file)
@@ -24,13 +24,19 @@ void f(const int&);
 void f(const _Complex int&);
 void f(const C&);
 
-C structfunc();
+C aggregate_return();
+
+bool& bool_reference_return();
+int& int_reference_return();
+_Complex int& complex_int_reference_return();
 
 void test_bool() {
   bool a = true;
   f(a);
 
   f(true);
+  
+  bool_reference_return() = true;
 }
 
 void test_scalar() {
@@ -44,6 +50,8 @@ void test_scalar() {
 
   __attribute((vector_size(16))) typedef int vec4;
   f((vec4){1,2,3,4}[0]);
+  
+  int_reference_return() = 10;
 }
 
 void test_complex() {
@@ -51,12 +59,14 @@ void test_complex() {
   f(a);
   
   f(10i);
+  
+  complex_int_reference_return() = 10i;
 }
 
 void test_aggregate() {
   C c;
   f(c);
 
-  f(structfunc());
+  f(aggregate_return());
 }