https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108309
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target Milestone|--- |12.3 Keywords| |ice-on-valid-code, | |needs-bisection Known to fail| |12.2.0 Summary|ICE in in |[12 Regression] ICE in in |cxx_eval_component_referenc |cxx_eval_component_referenc |e, at cp/constexpr.cc:4136 |e, at cp/constexpr.cc:4136 Known to work| |11.3.0 Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Last reconfirmed| |2023-01-06 --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Reduced further: ``` struct _Enable_copy_move {}; struct h { union { int _M_value; }; }; struct m { constexpr m(...) : _M_payload() {} constexpr m(const m &) {} h _M_payload; }; struct optional : m, _Enable_copy_move { constexpr optional() {} template <typename _Up> constexpr optional(_Up __t) : m(__t) {} }; struct array { optional t[1]; }; optional page { array {} }; ``` >clang++-15 doesn't (not sure if it's related, but i thought it's worth >mentioning: That is a conditionally supported construct in C++. clang does not support it but GCC does. GCC does warn with -Wconditionally-supported : <source>: In instantiation of 'constexpr optional::optional(_Up) [with _Up = array]': <source>:20:1: required from here <source>:14:62: warning: passing objects of non-trivially-copyable type 'struct array' through '...' is conditionally supported [-Wconditionally-supported] 14 | template <typename _Up> constexpr optional(_Up __t) : m(__t) {} | ^ Anyways this is fixed on the trunk; though since it is a GCC 12.x regression it will/should be fixed on the GCC 12 branch too once someone figures out which patch fixed it.