]> granicus.if.org Git - clang/commitdiff
Handle returning complex types that get coerced. Fixes PR3131
authorAnders Carlsson <andersca@mac.com>
Tue, 25 Nov 2008 22:21:48 +0000 (22:21 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 25 Nov 2008 22:21:48 +0000 (22:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60058 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCall.cpp
test/CodeGen/complex.c

index 1fc4143d60a3830738e2863549c7b305ba3e983e..220586db58964c45866205a589857f6bf42766f4 100644 (file)
@@ -868,7 +868,10 @@ RValue CodeGenFunction::EmitCall(llvm::Value *Callee,
       llvm::PointerType::getUnqual(RetAI.getCoerceToType());
     llvm::Value *V = CreateTempAlloca(ConvertType(RetTy), "tmp");
     Builder.CreateStore(CI, Builder.CreateBitCast(V, CoerceToPTy));
-    return RValue::getAggregate(V);
+    if (RetTy->isAnyComplexType())
+      return RValue::getComplex(LoadComplexFromAddr(V, false));
+    else
+      return RValue::getAggregate(V);
   }
 
   case ABIArgInfo::ByVal:
index 93e25cf459c1da5a6ac552227e549c9361d1e175..9c0e3d5fc5f10d3f249f7891e2ae1424ddaaad1e 100644 (file)
@@ -51,3 +51,10 @@ void t3() {
   __complex__ long long v = 2;
 }
 
+// PR3131
+float _Complex t4();
+
+void t5() {
+  float _Complex x = t4();
+}
+