diff options
author | Tobias Burnus <burnus@gcc.gnu.org> | 2009-12-15 09:37:41 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2009-12-15 09:37:41 +0100 |
commit | d94be5e02d4a25241e6e3b1cfbf098b5f1b68b39 (patch) | |
tree | 92ef7de4a9cf22100b58f3b5c8cbf637eab6a487 /gcc/fortran/resolve.c | |
parent | 0857d1f0b1161a03207d64708f083c16880a65f8 (diff) | |
download | gcc-d94be5e02d4a25241e6e3b1cfbf098b5f1b68b39.zip gcc-d94be5e02d4a25241e6e3b1cfbf098b5f1b68b39.tar.gz gcc-d94be5e02d4a25241e6e3b1cfbf098b5f1b68b39.tar.bz2 |
re PR fortran/41235 (Missing explicit interface for variable-length character functions)
2009-12-15 Tobias Burnus <burnus@net-b.de>
Daniel Franke <franke.daniel@gmail.com>
PR fortran/41235
* resolve.c (resolve_global_procedure): Add check for
presence of an explicit interface for nonconstant,
nonassumed character-length functions.
(resolve_fl_procedure): Remove check for nonconstant
character-length functions.
2009-12-15 Tobias Burnus <burnus@net-b.de>
PR fortran/41235
* auto_char_len_1.f90: New test.
* auto_char_len_2.f90: New test.
* auto_char_len_4.f90: Correct test.
From-SVN: r155247
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 00bd441..78b0a78 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1830,6 +1830,21 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, gfc_error ("The reference to function '%s' at %L either needs an " "explicit INTERFACE or the rank is incorrect", sym->name, where); + + /* Non-assumed length character functions. */ + if (sym->attr.function && sym->ts.type == BT_CHARACTER + && gsym->ns->proc_name->ts.u.cl->length != NULL) + { + gfc_charlen *cl = sym->ts.u.cl; + + if (!sym->attr.entry_master && sym->attr.if_source == IFSRC_UNKNOWN + && cl && cl->length && cl->length->expr_type != EXPR_CONSTANT) + { + gfc_error ("Nonconstant character-length function '%s' at %L " + "must have an explicit interface", sym->name, + &sym->declared_at); + } + } if (gfc_option.flag_whole_file == 1 || ((gfc_option.warn_std & GFC_STD_LEGACY) @@ -9038,23 +9053,12 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag) && resolve_charlen (cl) == FAILURE) return FAILURE; - if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT) + if ((!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT) + && sym->attr.proc == PROC_ST_FUNCTION) { - if (sym->attr.proc == PROC_ST_FUNCTION) - { - gfc_error ("Character-valued statement function '%s' at %L must " - "have constant length", sym->name, &sym->declared_at); - return FAILURE; - } - - if (sym->attr.external && sym->formal == NULL - && cl && cl->length && cl->length->expr_type != EXPR_CONSTANT) - { - gfc_error ("Automatic character length function '%s' at %L must " - "have an explicit interface", sym->name, - &sym->declared_at); - return FAILURE; - } + gfc_error ("Character-valued statement function '%s' at %L must " + "have constant length", sym->name, &sym->declared_at); + return FAILURE; } } |