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