| // PR c++/82165 |
| // { dg-do compile { target c++11 } } |
| |
| struct flags { |
| enum field { f0, f1, no_field }; |
| field b0 : 4; |
| field b1 : 4; |
| field a0, a1; |
| }; |
| |
| constexpr bool operator!(flags::field f) { |
| return f == flags::no_field; |
| } |
| |
| #define SA(X) static_assert ((X), #X) |
| |
| int main() { |
| constexpr flags f { flags::f0, flags::f1, flags::f0, flags::f1 }; |
| |
| SA( flags::f0 == 0 ); // 0 |
| SA( flags::f1 == 1 ); // 1 |
| SA( flags::no_field == 2 ); // 2 |
| SA( !flags::f0 == 0 ); // (!) 0 |
| SA( !flags::f1 == 0 ); // (!) 0 |
| SA( !flags::no_field == 1 ); // (!) 1 |
| |
| SA( f.a0 == 0 ); // 0 |
| SA( f.a1 == 1 ); // 1 |
| SA( !f.a0 == 0 ); // (!) 0 |
| SA( !f.a1 == 0 ); // (!) 0 |
| |
| SA( f.b0 == 0 ); // 0 |
| SA( f.b1 == 1 ); // 1 |
| SA( !f.b0 == 0 ); // expected "(!) 0", but got "1" |
| SA( !f.b1 == 0 ); // expected "(!) 0", but got "0" |
| } |