https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84968
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Slightly adjusted testcase, so that it is less invalid. struct S { template <typename> void foo () try {} catch (int () noexcept (({ union B a; true; }))) {} }; With the template <typename> line commented out, we reject it aggregate ‘S::foo()::B a’ has incomplete type and cannot be defined If there is union B {}; before struct S, it is accepted both as a template or as non-template, with union B {} a; true; in template it is error-recovery: pr84968.C: In member function ‘void S::foo()’: pr84968.C:4:45: error: types may not be defined in an exception-specification try {} catch (int () noexcept (({ union B {} a; true; }))) {} ^ pr84968.C:4:59: internal compiler error: in strip_typedefs_expr, at cp/tree.c:1792 try {} catch (int () noexcept (({ union B {} a; true; }))) {} ^ Apparently strip_typedef_exprs isn't prepared to handle STMT_EXPR body, in particular STATEMENT_LIST. Is that the way to go?