// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -Wno-bitfield-constant-conversion -verify %s // RUN: %clang_cc1 -verify=ref -Wno-bitfield-constant-conversion %s // RUN: %clang_cc1 -std=c++20 -fexperimental-new-constant-interpreter -Wno-bitfield-constant-conversion -verify %s // RUN: %clang_cc1 -std=c++20 -verify=ref -Wno-bitfield-constant-conversion %s // expected-no-diagnostics // ref-no-diagnostics 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, ""); }