summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/module.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/used_dummy_types_6.f9025
4 files changed, 47 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 12287bf5783..1ff3a604286 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2007-01-29 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/30554
+ * module.c (read_module): If a symbol is excluded by an ONLY
+ clause, check to see if there is a symtree already loaded. If
+ so, attach the symtree to the pointer_info.
+
2007-01-28 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/30389
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 1eed5e777bf..e76bd0e92db 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -3394,15 +3394,22 @@ read_module (void)
/* Get the jth local name for this symbol. */
p = find_use_name_n (name, &j);
- /* Skip symtree nodes not in an ONLY clause. */
+ /* Skip symtree nodes not in an ONLY clause, unless there
+ is an existing symtree loaded from another USE
+ statement. */
if (p == NULL)
- continue;
+ {
+ st = gfc_find_symtree (gfc_current_ns->sym_root, name);
+ if (st != NULL)
+ info->u.rsym.symtree = st;
+ continue;
+ }
- /* Check for ambiguous symbols. */
st = gfc_find_symtree (gfc_current_ns->sym_root, p);
if (st != NULL)
{
+ /* Check for ambiguous symbols. */
if (st->n.sym != info->u.rsym.sym)
st->ambiguous = 1;
info->u.rsym.symtree = st;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4482ad8e3d9..66501a914bc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-29 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/30554
+ * gfortran.dg/used_dummy_types_6.f90: New test.
+
2007-01-28 Jan Hubicka <jh@suse.cz>
* gcc.dg/tree-prof/val-prof-6.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/used_dummy_types_6.f90 b/gcc/testsuite/gfortran.dg/used_dummy_types_6.f90
new file mode 100644
index 00000000000..bcee65ac319
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/used_dummy_types_6.f90
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! Tests the fix for PR30554, the USE statements in potential_energy
+! would cause a segfault because the pointer_info for nfree coming
+! from constraint would not find the existing symtree coming directly
+! from atom.
+!
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+
+MODULE ATOMS
+INTEGER :: NFREE = 0
+END MODULE ATOMS
+
+MODULE CONSTRAINT
+USE ATOMS, ONLY: NFREE
+CONTAINS
+ SUBROUTINE ENERGY_CONSTRAINT ( HESSIAN )
+ REAL , DIMENSION(1:(3*NFREE*(3*NFREE+1))/2):: HESSIAN
+ END SUBROUTINE ENERGY_CONSTRAINT
+END MODULE CONSTRAINT
+
+MODULE POTENTIAL_ENERGY
+USE ATOMS
+USE CONSTRAINT, ONLY : ENERGY_CONSTRAINT
+END MODULE POTENTIAL_ENERGY
+! { dg-final { cleanup-modules "atoms constraint potential_energy" } }