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