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