https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124275
Bug ID: 124275
Summary: GCC rejects trivially copying a non-constexpr class
object containing nullptr_t in constant initialization
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Keywords: rejects-valid
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: de34 at live dot cn
Target Milestone: ---
GCC rejects this following code snippet (https://godbolt.org/z/qYdxjPjWo):
```
struct X {
constexpr X() = default;
constexpr X(const X&) = default;
decltype(nullptr) n;
};
extern X x;
constexpr X y = x;
```
But it accepts this one with the copy constructor is made non-trivial (while
still doing the same thing) (https://godbolt.org/z/z3edEWrYM):
```
struct X {
constexpr X() = default;
constexpr X(const X& other) noexcept : n(other.n) {}
decltype(nullptr) n;
};
extern X x;
constexpr X y = x;
```
Per https://eel.is/c++draft/expr.const ,
> - an lvalue-to-rvalue conversion unless it is applied to
> - a glvalue of type cv std::nullptr_t,
it should be valid to copy a non-constant `nullptr_t` object in constant
evaluation. Given the initialization of `y` selects a `constexpr` constructor,
it should be valid.
This might be related to PR 118661 but is not the same. It's strange that MSVC
and Clang behave similarly. Corresponding bugs are already reported.