https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88611
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- But given that the right type we want is already passed in type, I'd say: --- gcc/trans-expr.c.jj 2019-01-01 12:37:52.000000000 +0100 +++ gcc/trans-expr.c 2019-01-07 14:41:02.146885618 +0100 @@ -7085,21 +7085,7 @@ gfc_conv_initializer (gfc_expr * expr, g the 'expr' to be that for a (void *). */ if (expr != NULL && expr->ts.type == BT_DERIVED && expr->ts.is_iso_c && expr->ts.u.derived) - { - gfc_symbol *derived = expr->ts.u.derived; - - /* The derived symbol has already been converted to a (void *). Use - its kind. */ - if (derived->ts.kind == 0) - derived->ts.kind = gfc_default_integer_kind; - expr = gfc_get_int_expr (derived->ts.kind, NULL, 0); - expr->ts.f90_type = derived->ts.f90_type; - - gfc_init_se (&se, NULL); - gfc_conv_constant (&se, expr); - gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR); - return se.expr; - } + return build_int_cst (type, 0); if (array && !procptr) { is best.