aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/expr/bitfield13.C
blob: 3f57d5f0397cf21779d63e9a87fccf4028b85d20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 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"
}