xref: /llvm-project/clang/test/AST/ByteCode/bitfields.cpp (revision a07aba5d44204a7ca0d891a3da05af9960081e4c)
1 // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -Wno-bitfield-constant-conversion -verify=expected,both %s
2 // RUN: %clang_cc1 -verify=ref,both -Wno-bitfield-constant-conversion %s
3 // RUN: %clang_cc1 -std=c++20 -fexperimental-new-constant-interpreter -Wno-bitfield-constant-conversion -verify=expected,both %s
4 // RUN: %clang_cc1 -std=c++20 -verify=ref,both -Wno-bitfield-constant-conversion %s
5 
6 namespace Basic {
7   struct A {
8     unsigned int a : 2;
9     constexpr A() : a(0) {}
10     constexpr A(int a) : a(a) {}
11   };
12 
13   constexpr A a{1};
14   static_assert(a.a == 1, "");
15 
16   constexpr A a2{10};
17   static_assert(a2.a == 2, "");
18 
19 
20   constexpr int storeA() {
21     A a;
22     a.a = 10;
23 
24     return a.a;
25   }
26   static_assert(storeA() == 2, "");
27 
28   constexpr int storeA2() {
29     A a;
30     return a.a = 10;
31   }
32   static_assert(storeA2() == 2, "");
33 
34 #if __cplusplus >= 202002
35   struct Init1 {
36     unsigned a : 2 = 1;
37   };
38   constexpr Init1 I1{};
39   static_assert(I1.a == 1, "");
40 
41   struct Init2 {
42     unsigned a : 2 = 100;
43   };
44   constexpr Init2 I2{};
45   static_assert(I2.a == 0, "");
46 #endif
47 
48   struct Init3 {
49     unsigned a : 2;
50     constexpr Init3() : a(100) {}
51   };
52   constexpr Init3 I3{};
53   static_assert(I3.a == 0, "");
54 }
55 
56 namespace Overflow {
57   struct A {int c:3;};
58 
59   constexpr int f() {
60     A a1{3};
61     return a1.c++;
62   }
63 
64   static_assert(f() == 3, "");
65 }
66 
67 namespace Compound {
68   struct A {
69     unsigned int a : 2;
70     constexpr A() : a(0) {}
71     constexpr A(int a) : a(a) {}
72   };
73 
74   constexpr unsigned add() {
75     A a;
76     a.a += 10;
77     return a.a;
78   }
79   static_assert(add() == 2, "");
80 
81   constexpr unsigned sub() {
82     A a;
83     a.a -= 10;
84     return a.a;
85   }
86   static_assert(sub() == 2, "");
87 
88   constexpr unsigned mul() {
89     A a(1);
90     a.a *= 5;
91     return a.a;
92   }
93   static_assert(mul() == 1, "");
94 
95   constexpr unsigned div() {
96     A a(2);
97     a.a /= 2;
98     return a.a;
99   }
100   static_assert(div() == 1, "");
101 }
102 
103 namespace test0 {
104   extern int int_source();
105   struct A {
106     int aField;
107     int bField;
108   };
109 
110   struct B {
111     int onebit : 2;
112     int twobit : 6;
113     int intField;
114   };
115 
116   struct C : A, B {
117   };
118 
119   void b(C &c) {
120     c.onebit = int_source();
121   }
122 }
123 
124 namespace NonConstBitWidth {
125   int n3 = 37; // both-note {{declared here}}
126   struct S {
127     int l : n3; // both-error {{constant expression}} \
128                 // both-note {{read of non-const variable}}
129   };
130 }
131