aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>2002-07-11 17:55:49 -0400
committerJason Merrill <jason@gcc.gnu.org>2002-07-11 17:55:49 -0400
commitc5386123677295d63cc927c7534a38ca746caba8 (patch)
tree91f99113ccda341ee9aef725945ca876e20f6a58 /gcc
parent34902e16e2c936b883135f7b472402de4240caec (diff)
downloadgcc-c5386123677295d63cc927c7534a38ca746caba8.zip
gcc-c5386123677295d63cc927c7534a38ca746caba8.tar.gz
gcc-c5386123677295d63cc927c7534a38ca746caba8.tar.bz2
re PR c++/7279 (NRV related miscompilation)
PR c++/7279 * tree.c (cp_copy_res_decl_for_inlining): Also copy TREE_ADDRESSABLE. From-SVN: r55407
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/g++.dg/opt/nrv5.C57
1 files changed, 57 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/opt/nrv5.C b/gcc/testsuite/g++.dg/opt/nrv5.C
new file mode 100644
index 0000000..7c3c059
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/nrv5.C
@@ -0,0 +1,57 @@
+// PR c++/7279
+// Test for the named return value optimization with inlining.
+// Contributed by Jakub Jelinek <jakub@redhat.com>.
+// { dg-do run }
+// { dg-options -O2 }
+
+enum E { E0, E1, E2, E3 };
+
+struct S
+{
+ E s0 : 2;
+ bool s1 : 1, s2 : 1, s3 : 1, s4 : 1, s5 : 1, s6 : 1;
+ S ();
+ void foo (E x);
+};
+
+S::S() : s1 (true), s2 (false), s0 (E1), s3 (true), s4 (false),
+ s5 (true), s6 (false) {}
+void S::foo (E x) { this->s0 = x; }
+
+inline S foo ()
+{
+ S s;
+ s.foo (E0);
+ return s;
+}
+
+inline S bar ()
+{
+ S s;
+ s.foo (E2);
+ return s;
+}
+
+void check (S &s, bool isfoo);
+
+void test (bool isfoo)
+{
+ S a = isfoo ? foo () : bar ();
+ check (a, isfoo);
+}
+
+extern "C" void abort ();
+
+void check (S &s, bool isfoo)
+{
+ if (! s.s1 || s.s2 || ! s.s3 || s.s4 || ! s.s5 || s.s6)
+ abort ();
+ if (s.s0 != (isfoo ? E0 : E2))
+ abort ();
+}
+
+int main ()
+{
+ test (true);
+ test (false);
+}