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