https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95690
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- (gdb) p t $1 = <paren_expr 0x7ffff6d67940> (gdb) p debug_generic_expr (t) ((erfc)) so that's the DECL_INITIAL of a CONST_DECL. The CONST_DECL is built that way by the FE: 8833 /* Create a temporary var to hold the value. */ 8834 if (TREE_CONSTANT (se->expr)) 8835 { 8836 tree tmp = se->expr; 8837 STRIP_TYPE_NOPS (tmp); 8838 var = build_decl (input_location, 8839 CONST_DECL, NULL, TREE_TYPE (tmp)); 8840 DECL_INITIAL (var) = tmp; and the middle-end doesn't really expect PAREN_EXPRs. I don't see any stripping of other codes on the path to the ICE so I'll amend what is already there. But IMHO build_constant_desc shouldn't pass the constant expression to be used as MEM_EXPR, instead passing down the type looks more appropriate and future-proof...