diff --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp index 3e28490f6ffa..618e446bf1c3 100644 --- a/clang/lib/CodeGen/CGExprComplex.cpp +++ b/clang/lib/CodeGen/CGExprComplex.cpp @@ -255,6 +255,9 @@ VisitImaginaryLiteral(const ImaginaryLiteral *IL) { ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) { + if (E->getCallReturnType()->isReferenceType()) + return EmitLoadOfLValue(E); + return CGF.EmitCallExpr(E).getComplexVal(); } diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 8cd84ecdb454..e14d40c3b6d3 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -223,6 +223,9 @@ public: Value *EmitCastExpr(const Expr *E, QualType T); Value *VisitCallExpr(const CallExpr *E) { + if (E->getCallReturnType()->isReferenceType()) + return EmitLoadOfLValue(E); + return CGF.EmitCallExpr(E).getScalarVal(); } diff --git a/clang/test/CodeGenCXX/references.cpp b/clang/test/CodeGenCXX/references.cpp index aee395251ead..e5db446faecf 100644 --- a/clang/test/CodeGenCXX/references.cpp +++ b/clang/test/CodeGenCXX/references.cpp @@ -38,6 +38,7 @@ void test_bool() { f(true); bool_reference_return() = true; + a = bool_reference_return(); } void test_scalar() { @@ -53,6 +54,7 @@ void test_scalar() { f((vec4){1,2,3,4}[0]); int_reference_return() = 10; + a = int_reference_return(); } void test_complex() { @@ -62,6 +64,7 @@ void test_complex() { f(10i); complex_int_reference_return() = 10i; + a = complex_int_reference_return(); } void test_aggregate() {