summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/tc1/dr185.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/tc1/dr185.C')
-rw-r--r--gcc/testsuite/g++.dg/tc1/dr185.C26
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/tc1/dr185.C b/gcc/testsuite/g++.dg/tc1/dr185.C
new file mode 100644
index 000000000..2cd4e397f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tc1/dr185.C
@@ -0,0 +1,26 @@
+// { dg-do run }
+// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
+// DR185: "Named" temporaries and copy elision
+
+extern "C" void abort(void);
+
+struct A {
+ mutable int value;
+ explicit A(int i) : value(i) {}
+ void mutate(int i) const { value = i; }
+};
+
+int foo() {
+ A const& t = A(1);
+ A n(t); // can this copy be elided? NO!
+ t.mutate(2);
+ return n.value; // can this return 2? NO!
+}
+
+int main()
+{
+ int x = foo();
+ if (x != 1)
+ abort();
+ return 0;
+}