blob: 6e1eb68ff6889d6d5c04147ad4df1ec51f7d646c [file] [log] [blame]
// PR c++/96223
// { dg-do compile { target c++20 } }
// DR 1787 (if an indeterminate value is produced by an evaluation, the
// behavior is undefined except in certain cases)
// Note that P1331R2 explicitly disallows in a constant evaluation:
// - an lvalue-to-rvalue conversion that is applied to an object with
// indeterminate value ([basic.indet]).
#include <cstddef>
constexpr int
fn1 ()
{
unsigned char foo;
unsigned char u = foo; // { dg-error "not usable in a constant expression" }
return 0;
}
constexpr int
fn2 ()
{
unsigned char foo;
int i = foo; // { dg-error "not usable in a constant expression" }
return 0;
}
constexpr int
fn3 ()
{
unsigned char foo;
char8_t u = foo; // { dg-error "not usable in a constant expression" }
return 0;
}
constexpr int
fn4 ()
{
std::byte foo;
std::byte b = foo; // { dg-error "not usable in a constant expression" }
return 0;
}
constexpr int w1 = fn1 ();
constexpr int w2 = fn2 ();
constexpr int w3 = fn3 ();
constexpr int w4 = fn4 ();