From: Eli Friedman Date: Sun, 6 Dec 2009 09:26:33 +0000 (+0000) Subject: Fix a slight oversight in computing whether a copy constructor is elidable. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0336843eb0d04f2d4423189c26ec55b7654b1dec;p=clang Fix a slight oversight in computing whether a copy constructor is elidable. Fixes PR5695. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90702 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 652b92db5e..e115095566 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -3369,8 +3369,10 @@ Sema::BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, if (ImplicitCastExpr *ICE = dyn_cast(E)) if (ICE->getCastKind() == CastExpr::CK_NoOp) E = ICE->getSubExpr(); - - if (isa(E) || isa(E)) + + if (CallExpr *CE = dyn_cast(E)) + Elidable = !CE->getCallReturnType()->isReferenceType(); + else if (isa(E)) Elidable = true; } diff --git a/test/CodeGenCXX/elide-call-reference.cpp b/test/CodeGenCXX/elide-call-reference.cpp new file mode 100644 index 0000000000..863e69c9cc --- /dev/null +++ b/test/CodeGenCXX/elide-call-reference.cpp @@ -0,0 +1,11 @@ +// RUN: clang-cc %s -emit-llvm -o - | FileCheck %s +// PR5695 + +struct A { A(const A&); ~A(); }; +A& a(); +void b() { + A x = a(); +} + +// CHECK: call void @_ZN1AC1ERKS_ +// CHECK: call void @_ZN1AD1Ev