1 // { dg-do compile } 2 // { dg-options "-Wlogical-op" } 3 4 enum { a, b1, b2 }; 5 6 enum testenum { t1, t2}; 7 8 extern int c; 9 extern bool bool_a, bool_b; 10 11 template<typename Enum> 12 class QFlags 13 { 14 public: 15 typedef void **Zero; 16 int i; QFlags(Enum f)17 inline QFlags(Enum f) : i(f) {} 18 19 inline operator int() const 20 { return i;} 21 22 }; 23 24 QFlags<testenum> f(t2); 25 extern void do_something(int); 26 27 extern testenum testa(); 28 foo()29void foo() 30 { 31 if ( f && b2 ) // { dg-warning "logical" } 32 do_something(1); 33 if ( c && b2 ) // { dg-warning "logical" } 34 do_something(2); 35 36 if ( b2 && c == a ) // { dg-bogus "logical" } 37 do_something(101); 38 if ( 1 && c ) 39 do_something(102); // { dg-bogus "logical" } 40 if ( t2 && b2 ) // { dg-bogus "logical" } 41 do_something(103); 42 if ( true && c == a ) // { dg-bogus "logical" } 43 do_something(104); 44 if ( b2 && true ) // { dg-bogus "logical" } 45 do_something(105); 46 } 47 48 bar()49void bar() 50 { 51 if ( f || b2 ) // { dg-warning "logical" } 52 do_something(1); 53 if ( c || b2 ) // { dg-warning "logical" } 54 do_something(2); 55 56 if ( b2 || c == a ) // { dg-bogus "logical" } 57 do_something(101); 58 if ( 1 || c ) 59 do_something(102); // { dg-bogus "logical" } 60 if ( t2 || b2 ) // { dg-bogus "logical" } 61 do_something(103); 62 if ( true || c == a ) // { dg-bogus "logical" } 63 do_something(104); 64 if ( b2 || true ) // { dg-bogus "logical" } 65 do_something(105); 66 } 67