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;