// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -Wno-bitfield-constant-conversion -verify=expected,both %s // RUN: %clang_cc1 -verify=ref,both -Wno-bitfield-constant-conversion %s // RUN: %clang_cc1 -std=c++20 -fexperimental-new-constant-interpreter -Wno-bitfield-constant-conversion -verify=expected,both %s // RUN: %clang_cc1 -std=c++20 -verify=ref,both -Wno-bitfield-constant-conversion %s namespace Basic { struct A { unsigned int a : 2; constexpr A() : a(0) {} constexpr A(int a) : a(a) {} }; constexpr A a{1}; static_assert(a.a == 1, ""); constexpr A a2{10}; static_assert(a2.a == 2, ""); constexpr int storeA() { A a; a.a = 10; return a.a; } static_assert(storeA() == 2, ""); constexpr int storeA2() { A a; return a.a = 10; } static_assert(storeA2() == 2, ""); #if __cplusplus >= 202002 struct Init1 { unsigned a : 2 = 1; }; constexpr Init1 I1{}; static_assert(I1.a == 1, ""); struct Init2 { unsigned a : 2 = 100; }; constexpr Init2 I2{}; static_assert(I2.a == 0, ""); #endif struct Init3 { unsigned a : 2; constexpr Init3() : a(100) {} }; constexpr Init3 I3{}; static_assert(I3.a == 0, ""); } namespace Overflow { struct A {int c:3;}; constexpr int f() { A a1{3}; return a1.c++; } static_assert(f() == 3, ""); } namespace Compound { struct A { unsigned int a : 2; constexpr A() : a(0) {} constexpr A(int a) : a(a) {} }; constexpr unsigned add() { A a; a.a += 10; return a.a; } static_assert(add() == 2, ""); constexpr unsigned sub() { A a; a.a -= 10; return a.a; } static_assert(sub() == 2, ""); constexpr unsigned mul() { A a(1); a.a *= 5; return a.a; } static_assert(mul() == 1, ""); constexpr unsigned div() { A a(2); a.a /= 2; return a.a; } static_assert(div() == 1, ""); } namespace test0 { extern int int_source(); struct A { int aField; int bField; }; struct B { int onebit : 2; int twobit : 6; int intField; }; struct C : A, B { }; void b(C &c) { c.onebit = int_source(); } } namespace NonConstBitWidth { int n3 = 37; // both-note {{declared here}} struct S { int l : n3; // both-error {{constant expression}} \ // both-note {{read of non-const variable}} }; }