2018-11-07 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / g++.dg / cpp0x / ref-qual19.C
blob50f92977c49d2a44ecb61f0c0936c5c75c903166
1 // PR c++/87109
2 // { dg-do run { target c++11 } }
4 #include <utility>
6 struct C { int i; };
7 struct D { int i; };
9 struct A {
10   int j;
11   operator C() & { return { 1 }; }
12   operator C() && { return { 2 }; }
15 struct B : public A {
16   operator D() & { return { 3 }; }
17   operator D() && { return { 4 }; }
21 f (A a)
23   return a;
27 f2 (A a)
29   return std::move (a);
33 f3 ()
35   A a;
36   return a;
40 f4 ()
42   A a;
43   return std::move (a);
47 f5 ()
49   return A();
53 f6 (B b)
55   return b;
59 f7 (B b)
61   return std::move (b);
65 f8 ()
67   B b;
68   return b;
72 f9 ()
74   B b;
75   return std::move (b);
79 f10 ()
81   return B();
84 int
85 main ()
87   C c1 = f (A());
88   if (c1.i != 2)
89     __builtin_abort ();
90   C c2 = f2 (A());
91   if (c2.i != 2)
92     __builtin_abort ();
93   C c3 = f3 ();
94   if (c3.i != 2)
95     __builtin_abort ();
96   C c4 = f4 ();
97   if (c4.i != 2)
98     __builtin_abort ();
99   C c5 = f5 ();
100   if (c5.i != 2)
101     __builtin_abort ();
102   D c6 = f6 (B());
103   if (c6.i != 4)
104     __builtin_abort ();
105   D c7 = f7 (B());
106   if (c7.i != 4)
107     __builtin_abort ();
108   D c8 = f8 ();
109   if (c8.i != 4)
110     __builtin_abort ();
111   D c9 = f9 ();
112   if (c9.i != 4)
113     __builtin_abort ();
114   D c10 = f10 ();
115   if (c10.i != 4)
116     __builtin_abort ();