summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-12-06 09:26:33 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-12-06 09:26:33 +0000
commiteddf1213e2ae7c163870108da5b088c0039af3ce (patch)
treedc19942e918cc138606843c9552df7281a74d0e3 /clang
parent58ecb2ab518fcaf9dc8842d41ca77ed435911b63 (diff)
downloadbcm5719-llvm-eddf1213e2ae7c163870108da5b088c0039af3ce.tar.gz
bcm5719-llvm-eddf1213e2ae7c163870108da5b088c0039af3ce.zip
Fix a slight oversight in computing whether a copy constructor is elidable.
Fixes PR5695. llvm-svn: 90702
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp6
-rw-r--r--clang/test/CodeGenCXX/elide-call-reference.cpp11
2 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 652b92db5ed..e1150955666 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -3369,8 +3369,10 @@ Sema::BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType,
if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
if (ICE->getCastKind() == CastExpr::CK_NoOp)
E = ICE->getSubExpr();
-
- if (isa<CallExpr>(E) || isa<CXXTemporaryObjectExpr>(E))
+
+ if (CallExpr *CE = dyn_cast<CallExpr>(E))
+ Elidable = !CE->getCallReturnType()->isReferenceType();
+ else if (isa<CXXTemporaryObjectExpr>(E))
Elidable = true;
}
diff --git a/clang/test/CodeGenCXX/elide-call-reference.cpp b/clang/test/CodeGenCXX/elide-call-reference.cpp
new file mode 100644
index 00000000000..863e69c9cc0
--- /dev/null
+++ b/clang/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
OpenPOWER on IntegriCloud