diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2006-08-30 05:18:36 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2006-08-30 05:18:36 +0000 |
commit | 8c086c9c6eceed0c8d1dbd8463272e1854e5b4e7 (patch) | |
tree | d537dbcb1097607a1a3c621891ffa482aa77638d /gcc/fortran/resolve.c | |
parent | a2ef097954b08063f1100d45c3d8499ac9fc46f8 (diff) | |
download | gcc-8c086c9c6eceed0c8d1dbd8463272e1854e5b4e7.zip gcc-8c086c9c6eceed0c8d1dbd8463272e1854e5b4e7.tar.gz gcc-8c086c9c6eceed0c8d1dbd8463272e1854e5b4e7.tar.bz2 |
re PR fortran/28885 (ICE passing components of array of derived type)
2006-08-30 Paul Thomas <pault@gcc.gnu.org>
PR fortran/28885
REGRESSION FIX
* trans-expr.c (gfc_conv_aliased_arg): Ensure that the temp
declaration is retained for INTENT(OUT) arguments.
PR fortran/28873
REGRESSION FIX
PR fortran/20067
* resolve.c (resolve_generic_f): Make error message more
comprehensible.
(resolve_generic_s): Restructure search for specific procedures
to be similar to resolve_generic_f and change to similar error
message. Ensure that symbol reference is refreshed, in case
the search produces a NULL.
(resolve_specific_s): Restructure search, as above and as
resolve_specific_f. Ensure that symbol reference is refreshed,
in case the search produces a NULL.
PR fortran/25077
PR fortran/25102
* interface.c (check_operator_interface): Throw error if the
interface assignment tries to change intrinsic type assigments
or has less than two arguments. Also, it is an error if an
interface operator contains an alternate return.
PR fortran/24866
* parse.c (gfc_fixup_sibling_symbols): Do not modify the symbol
if it is a dummy in the contained namespace.
2006-08-30 Paul Thomas <pault@gcc.gnu.org>
PR fortran/28885
* gfortran.dg/aliasing_dummy_2.f90: New test.
PR fortran/20067
* gfortran.dg/generic_5.f90: Change error message.
PR fortran/28873
* gfortran.dg/generic_6.f90: New test.
PR fortran/25077
* gfortran.dg/redefined_intrinsic_assignment.f90: New test.
PR fortran/25102
* gfortran.dg/invalid_interface_assignment.f90: New test.
PR fortran/24866
* gfortran.dg/module_proc_external_dummy.f90: New test.
From-SVN: r116578
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 55 |
1 files changed, 28 insertions, 27 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 3924dc6..f1606b1 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1181,7 +1181,7 @@ generic: if (!gfc_generic_intrinsic (expr->symtree->n.sym->name)) { - gfc_error ("Generic function '%s' at %L is not an intrinsic function", + gfc_error ("There is no specific function for the generic '%s' at %L", expr->symtree->n.sym->name, &expr->where); return FAILURE; } @@ -1614,31 +1614,31 @@ resolve_generic_s (gfc_code * c) sym = c->symtree->n.sym; - m = resolve_generic_s0 (c, sym); - if (m == MATCH_YES) - return SUCCESS; - if (m == MATCH_ERROR) - return FAILURE; - - if (sym->ns->parent != NULL && !sym->attr.use_assoc) + for (;;) { + m = resolve_generic_s0 (c, sym); + if (m == MATCH_YES) + return SUCCESS; + else if (m == MATCH_ERROR) + return FAILURE; + +generic: + if (sym->ns->parent == NULL) + break; gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym); - if (sym != NULL) - { - m = resolve_generic_s0 (c, sym); - if (m == MATCH_YES) - return SUCCESS; - if (m == MATCH_ERROR) - return FAILURE; - } + + if (sym == NULL) + break; + if (!generic_sym (sym)) + goto generic; } /* Last ditch attempt. */ - + sym = c->symtree->n.sym; if (!gfc_generic_intrinsic (sym->name)) { gfc_error - ("Generic subroutine '%s' at %L is not an intrinsic subroutine", + ("There is no specific subroutine for the generic '%s' at %L", sym->name, &c->loc); return FAILURE; } @@ -1708,23 +1708,24 @@ resolve_specific_s (gfc_code * c) sym = c->symtree->n.sym; - m = resolve_specific_s0 (c, sym); - if (m == MATCH_YES) - return SUCCESS; - if (m == MATCH_ERROR) - return FAILURE; - - gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym); - - if (sym != NULL) + for (;;) { m = resolve_specific_s0 (c, sym); if (m == MATCH_YES) return SUCCESS; if (m == MATCH_ERROR) return FAILURE; + + if (sym->ns->parent == NULL) + break; + + gfc_find_symbol (sym->name, sym->ns->parent, 1, &sym); + + if (sym == NULL) + break; } + sym = c->symtree->n.sym; gfc_error ("Unable to resolve the specific subroutine '%s' at %L", sym->name, &c->loc); |