1// PR c++/7279 2// Test for the named return value optimization with inlining. 3// Contributed by Jakub Jelinek <jakub@redhat.com>. 4// { dg-do run } 5// { dg-options -O2 } 6 7enum E { E0, E1, E2, E3 }; 8 9struct S 10{ 11 E s0 : 2; 12 bool s1 : 1, s2 : 1, s3 : 1, s4 : 1, s5 : 1, s6 : 1; 13 S (); 14 void foo (E x); 15}; 16 17S::S() : s1 (true), s2 (false), s0 (E1), s3 (true), s4 (false), 18 s5 (true), s6 (false) {} 19void S::foo (E x) { this->s0 = x; } 20 21inline S foo () 22{ 23 S s; 24 s.foo (E0); 25 return s; 26} 27 28inline S bar () 29{ 30 S s; 31 s.foo (E2); 32 return s; 33} 34 35void check (S &s, bool isfoo); 36 37void test (bool isfoo) 38{ 39 S a = isfoo ? foo () : bar (); 40 check (a, isfoo); 41} 42 43extern "C" void abort (); 44 45void check (S &s, bool isfoo) 46{ 47 if (! s.s1 || s.s2 || ! s.s3 || s.s4 || ! s.s5 || s.s6) 48 abort (); 49 if (s.s0 != (isfoo ? E0 : E2)) 50 abort (); 51} 52 53int main () 54{ 55 test (true); 56 test (false); 57} 58