diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2017-11-04 00:34:40 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2017-11-04 00:34:40 +0000 |
commit | 9cfdd48417dce7d29a410510d2fb0e9b74b66878 (patch) | |
tree | 7d73f7805a210e37799ecbeba06b8b41e8506e2e /gcc/fortran/resolve.c | |
parent | da768c5b5cb0a187ae01d2c12e7f7323ee77734c (diff) | |
download | gcc-9cfdd48417dce7d29a410510d2fb0e9b74b66878.zip gcc-9cfdd48417dce7d29a410510d2fb0e9b74b66878.tar.gz gcc-9cfdd48417dce7d29a410510d2fb0e9b74b66878.tar.bz2 |
re PR fortran/82796 (Private+equivalence in used module breaks compilation of pure function)
2017-11-01 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/82796
* resolve.c (resolve_equivalence): An entity in a common block within
a module cannot appear in an equivalence statement if the entity is
with a pure procedure.
2017-11-01 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/82796
* gfortran.dg/equiv_pure.f90: New test.
From-SVN: r254403
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 104c02f..40c1cd3 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -15936,9 +15936,22 @@ resolve_equivalence (gfc_equiv *eq) && sym->ns->proc_name->attr.pure && sym->attr.in_common) { - gfc_error ("Common block member %qs at %L cannot be an EQUIVALENCE " - "object in the pure procedure %qs", - sym->name, &e->where, sym->ns->proc_name->name); + /* Need to check for symbols that may have entered the pure + procedure via a USE statement. */ + bool saw_sym = false; + if (sym->ns->use_stmts) + { + gfc_use_rename *r; + for (r = sym->ns->use_stmts->rename; r; r = r->next) + if (strcmp(r->use_name, sym->name) == 0) saw_sym = true; + } + else + saw_sym = true; + + if (saw_sym) + gfc_error ("COMMON block member %qs at %L cannot be an " + "EQUIVALENCE object in the pure procedure %qs", + sym->name, &e->where, sym->ns->proc_name->name); break; } |