https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83692
--- Comment #5 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
There's a lot that goes on here but the gist is this. In C++17 cp_finish_decl
sees "o" initialized with "{}". check_initializer turns this into
o = TARGET_EXPR <D.2208, <<< Unknown tree: aggr_init_expr
4
__ct_comp
D.2208
(struct outer *) <<< Unknown tree: void_cst >>> >>>>
this goes to store_init_value and that calls cxx_constant_value on that
TARGET_EXPR (which means strict = true). That evaluates the AGGR_INIT_EXPR
inside by evaluating the constructor of outer:
if (m_x.value() != 0)
throw 0;
m_x.m_value = integer{1}.value();
if (m_x.value() != 1) throw 0;