Index: gcc/fortran/resolve.c =================================================================== --- gcc/fortran/resolve.c (revision 228700) +++ gcc/fortran/resolve.c (working copy) @@ -1134,7 +1134,8 @@ resolve_structure_cons (gfc_expr *expr, int init) t = true; if (expr->ts.type == BT_DERIVED) - resolve_fl_derived0 (expr->ts.u.derived); + if (!resolve_fl_derived0 (expr->ts.u.derived)) + return false; cons = gfc_constructor_first (expr->value.constructor); @@ -10882,6 +10883,13 @@ resolve_charlen (gfc_charlen *cl) } } + if (cl->length && cl->length->expr_type == EXPR_NULL) + { + gfc_error ("Character length is target of NULL pointer at %L", + &cl->length->where); + return false; + } + /* "If the character length parameter value evaluates to a negative value, the length of character entities declared is zero." */ if (cl->length && !gfc_extract_int (cl->length, &i) && i < 0) @@ -13090,10 +13098,16 @@ resolve_fl_derived0 (gfc_symbol *sym) || (!resolve_charlen(c->ts.u.cl)) || !gfc_is_constant_expr (c->ts.u.cl->length)) { - gfc_error ("Character length of component %qs needs to " - "be a constant specification expression at %L", + gfc_error (c->ts.u.cl->length && + c->ts.u.cl->length->expr_type == EXPR_NULL ? + "Character length of component %qs is target of " + "NULL pointer at %L" + : + "Character length of component %qs needs to " + "be a constant specification expression at %L", c->name, - c->ts.u.cl->length ? &c->ts.u.cl->length->where : &c->loc); + c->ts.u.cl->length ? + &c->ts.u.cl->length->where : &c->loc); return false; } }