2002-07-11 Jakub Jelinek * g++.dg/opt/nrv5.C: New test. 2002-07-05 Jason Merrill * g++.dg/opt/nrv4.C: New test. 2002-04-09 Jason Merrill * g++.dg/opt/nrv3.C: New test. --- gcc/testsuite/g++.dg/opt/nrv3.C.jj Thu Apr 11 16:25:15 2002 +++ gcc/testsuite/g++.dg/opt/nrv3.C Tue Apr 9 19:02:43 2002 @@ -0,0 +1,24 @@ +// PR optimization/6189 +// Bug: we forgot about foo's nrv after writing it out. +// { dg-options -O3 } +// { dg-do run } + +struct A +{ + int i; +}; + + +A foo () +{ + A a; + a.i = 42; + return a; +} + + +int main() +{ + A b = foo(); + return b.i != 42; +} --- gcc/testsuite/g++.dg/opt/nrv4.C.jj Thu Apr 11 16:25:15 2002 +++ gcc/testsuite/g++.dg/opt/nrv4.C Fri Jul 5 17:16:56 2002 @@ -0,0 +1,23 @@ +// PR optimization/7145 +// Bug: The NRV optimization caused us to lose the initializer for 'ret'. +// { dg-options -O } +// { dg-do run } + +struct GdkColor { + long pixel; + short red; + short green; + short blue; +}; + +inline GdkColor mkcolor() { + GdkColor ret={0,1,2,3}; + return ret; +} + +int +main() +{ + GdkColor col=mkcolor(); + return (col.pixel != 0 || col.red != 1 || col.green != 2 || col.blue != 3); +} --- gcc/testsuite/g++.dg/opt/nrv5.C.jj Thu Apr 11 16:25:15 2002 +++ gcc/testsuite/g++.dg/opt/nrv5.C Thu Jul 11 11:29:33 2002 @@ -0,0 +1,52 @@ +// Test for the named return value optimization with inlining. +// Contributed by Jakub Jelinek . +// { 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 () : s1 (true), s2 (false), s0 (E1), s3 (true), s4 (false), s5 (true), s6 (false) {} + void 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); +}