From: Anders Carlsson Date: Tue, 25 Nov 2008 22:21:48 +0000 (+0000) Subject: Handle returning complex types that get coerced. Fixes PR3131 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ad3d6917dabbdab3399ff8307240aad58247d2e3;p=clang Handle returning complex types that get coerced. Fixes PR3131 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60058 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 1fc4143d60..220586db58 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -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: diff --git a/test/CodeGen/complex.c b/test/CodeGen/complex.c index 93e25cf459..9c0e3d5fc5 100644 --- a/test/CodeGen/complex.c +++ b/test/CodeGen/complex.c @@ -51,3 +51,10 @@ void t3() { __complex__ long long v = 2; } +// PR3131 +float _Complex t4(); + +void t5() { + float _Complex x = t4(); +} +