Commit e5609c8f by Steven G. Kargl

[multiple changes]

2015-06-03  Russell Whitesides  <russelldub@gmail.com>
	    Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/40958
	PR fortran/60780
	PR fortran/66377
	* module.c (load_equiv): Add check for loading duplicate EQUIVALENCEs
	from different modules.  Eliminate the pruning of unused
	equivalence-objects


2015-06-03  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/66377
	gfortran.dg/equiv_9.f90: New test.

From-SVN: r224159
parent 71226651
2015-06-05 Russell Whitesides <russelldub@gmail.com>
Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/40958
PR fortran/60780
PR fortran/66377
* module.c (load_equiv): Add check for loading duplicate EQUIVALENCEs
from different modules. Eliminate the pruning of unused
equivalence-objects
2015-06-04 Thomas Koenig <tkoenig@netcologne.de> 2015-06-04 Thomas Koenig <tkoenig@netcologne.de>
PR fortran/58749 PR fortran/58749
......
...@@ -4476,8 +4476,8 @@ load_commons (void) ...@@ -4476,8 +4476,8 @@ load_commons (void)
static void static void
load_equiv (void) load_equiv (void)
{ {
gfc_equiv *head, *tail, *end, *eq; gfc_equiv *head, *tail, *end, *eq, *equiv;
bool unused; bool duplicate;
mio_lparen (); mio_lparen ();
in_load_equiv = true; in_load_equiv = true;
...@@ -4504,23 +4504,19 @@ load_equiv (void) ...@@ -4504,23 +4504,19 @@ load_equiv (void)
mio_expr (&tail->expr); mio_expr (&tail->expr);
} }
/* Unused equivalence members have a unique name. In addition, it /* Check for duplicate equivalences being loaded from different modules */
must be checked that the symbols are from the same module. */ duplicate = false;
unused = true; for (equiv = gfc_current_ns->equiv; equiv; equiv = equiv->next)
for (eq = head; eq; eq = eq->eq)
{ {
if (eq->expr->symtree->n.sym->module if (equiv->module && head->module
&& head->expr->symtree->n.sym->module && strcmp (equiv->module, head->module) == 0)
&& strcmp (head->expr->symtree->n.sym->module,
eq->expr->symtree->n.sym->module) == 0
&& !check_unique_name (eq->expr->symtree->name))
{ {
unused = false; duplicate = true;
break; break;
} }
} }
if (unused) if (duplicate)
{ {
for (eq = head; eq; eq = head) for (eq = head; eq; eq = head)
{ {
......
2015-06-05 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/66377
gfortran.dg/equiv_9.f90: New test.
2015-06-05 Tom de Vries <tom@codesourcery.com> 2015-06-05 Tom de Vries <tom@codesourcery.com>
merge from gomp4 branch: merge from gomp4 branch:
......
! { dg-do run }
! PR fortran/66377
!
module constant
integer x1, x2, x3
integer x(3)
equivalence (x(1),x1), (x2,x(2)), (x3,x(3))
end module
program test
use constant
implicit none
x = (/1, 2, 3/)
call another()
end program
subroutine another()
use constant, only : x2
implicit none
if (x2 /= 2) call abort
end subroutine
! { dg-final { cleanup-modules "constant" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment