diff gcc/testsuite/g++.dg/opt/nrv5.C @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/testsuite/g++.dg/opt/nrv5.C	Fri Oct 27 22:46:09 2017 +0900
@@ -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);
+}