1 // Test for "contextually converted to bool"
2 // { dg-do compile { target c++11 } }
3 
4 struct A
5 {
6   explicit operator bool();
7 };
8 
9 void f (bool);
10 
11 struct B
12 {
13   bool b;
14 };
15 
16 struct C
17 {
18   operator int();
19 };
20 
21 struct D
22 {
23   operator int();
24 };
25 
main()26 int main()
27 {
28   A a; C c; D d;
29   // These contexts use an explicit bool conversion.
30   if (a) {}
31   for (; a; ) {}
32   do {} while (a);
33   while (a) {}
34   a ? 1 : 0;
35   a || true;
36   a && true;
37   !a;
38 
39   a ? c : 1;
40   a ? c : d;
41 
42   // These do not.
43   switch (a); 			// { dg-error "" }
44   bool b = a;			// { dg-error "" }
45   f(a);				// { dg-error "" }
46   B b2 = { a };			// { dg-error "" }
47   a + true;			// { dg-error "5:no match" }
48   b ? a : true;			// { dg-error "5:?:" }
49   a ? a : true;			// { dg-error "5:?:" }
50 }
51