diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1f2f26ae5dd..aac02b9d05c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2007-02-20 Tobias Burnus + + PR fortran/30783 + * resolve.c (resolve_symbol): Add character dummy VALUE check. + 2007-02-19 Thomas Koenig PR libfortran/30533 @@ -29,8 +34,8 @@ 2007-02-18 Roger Sayle Paul Thomas - PR fortran/30400 - * match.c (match_forall_iterator): Use gfc_match_expr instead + PR fortran/30400 + * match.c (match_forall_iterator): Use gfc_match_expr instead of gfc_match_variable to match the iterator variable. Return MATCH_NO if not a variable. Remove the reset of the symbol's flavor in cleanup. diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 84d42ee34f3..8db36b5f2c0 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -6153,10 +6153,22 @@ resolve_symbol (gfc_symbol *sym) if (sym->attr.value && !sym->attr.dummy) { gfc_error ("'%s' at %L cannot have the VALUE attribute because " - "it is not a dummy", sym->name, &sym->declared_at); + "it is not a dummy argument", sym->name, &sym->declared_at); return; } + if (sym->attr.value && sym->ts.type == BT_CHARACTER) + { + gfc_charlen *cl = sym->ts.cl; + if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT) + { + gfc_error ("Character dummy variable '%s' at %L with VALUE " + "attribute must have constant length", + sym->name, &sym->declared_at); + return; + } + } + /* If a derived type symbol has reached this point, without its type being declared, we have an error. Notice that most conditions that produce undefined derived types have already