blob: d3a8a083063ab47f4023ed9798a32edfd164262f [file] [log] [blame]
// 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, "");
}