From dea71ad06f751484f3eb5c52bf12622e4c06b33a Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Sun, 19 Feb 2017 18:27:14 +0000 Subject: re PR fortran/79402 (ICE with submodules: module procedure interface defined in parent module) 2017-02-19 Paul Thomas PR fortran/79402 * resolve.c (fixup_unique_dummy): New function. (gfc_resolve_expr): Call it for dummy variables with a unique symtree name. 2017-02-19 Paul Thomas PR fortran/79402 * gfortran.dg/submodule_23.f90: New test. From-SVN: r245580 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/resolve.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f7a89cc..82733be 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +017-02-19 Paul Thomas + + PR fortran/79402 + * resolve.c (fixup_unique_dummy): New function. + (gfc_resolve_expr): Call it for dummy variables with a unique + symtree name. + 2017-02-19 Andre Vehreschild PR fortran/79335 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index a5fe231..876f3cd 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -6433,6 +6433,31 @@ gfc_is_expandable_expr (gfc_expr *e) return false; } + +/* Sometimes variables in specification expressions of the result + of module procedures in submodules wind up not being the 'real' + dummy. Find this, if possible, in the namespace of the first + formal argument. */ + +static void +fixup_unique_dummy (gfc_expr *e) +{ + gfc_symtree *st = NULL; + gfc_symbol *s = NULL; + + if (e->symtree->n.sym->ns->proc_name + && e->symtree->n.sym->ns->proc_name->formal) + s = e->symtree->n.sym->ns->proc_name->formal->sym; + + if (s != NULL) + st = gfc_find_symtree (s->ns->sym_root, e->symtree->n.sym->name); + + if (st != NULL + && st->n.sym != NULL + && st->n.sym->attr.dummy) + e->symtree = st; +} + /* Resolve an expression. That is, make sure that types of operands agree with their operators, intrinsic operators are converted to function calls for overloaded types and unresolved function references are resolved. */ @@ -6457,6 +6482,14 @@ gfc_resolve_expr (gfc_expr *e) actual_arg = false; first_actual_arg = false; } + else if (e->symtree != NULL + && *e->symtree->name == '@' + && e->symtree->n.sym->attr.dummy) + { + /* Deal with submodule specification expressions that are not + found to be referenced in module.c(read_cleanup). */ + fixup_unique_dummy (e); + } switch (e->expr_type) { -- cgit v1.1