OSDN Git Service

2009-01-05 Paul Thomas <pault@gcc.gnu.org>
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Jan 2009 19:46:06 +0000 (19:46 +0000)
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Jan 2009 19:46:06 +0000 (19:46 +0000)
PR fortran/38657
* module.c (write_common_0): Use the name of the symtree rather
than the common block, to determine if the common has been
written.

2009-01-05  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/38657
* gfortran.dg/module_commons_3.f90: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143090 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/module.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/module_commons_3.f90 [new file with mode: 0644]

index 8252bd4..ed66a73 100644 (file)
@@ -1,3 +1,10 @@
+2009-01-05  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/38657
+       * module.c (write_common_0): Use the name of the symtree rather
+       than the common block, to determine if the common has been
+       written.
+
 2009-01-05  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/37159
index 1b32ee2..7bbfa12 100644 (file)
@@ -4337,6 +4337,7 @@ write_common_0 (gfc_symtree *st)
 {
   gfc_common_head *p;
   const char * name;
+  const char * lname;
   int flags;
   const char *label;
   struct written_common *w;
@@ -4349,6 +4350,9 @@ write_common_0 (gfc_symtree *st)
 
   /* We will write out the binding label, or the name if no label given.  */
   name = st->n.common->name;
+
+  /* Use the symtree(local)name to check if the common has been written.  */ 
+  lname = st->name;
   p = st->n.common;
   label = p->is_bind_c ? p->binding_label : p->name;
 
@@ -4356,7 +4360,7 @@ write_common_0 (gfc_symtree *st)
   w = written_commons;
   while (w)
     {
-      int c = strcmp (name, w->name);
+      int c = strcmp (lname, w->name);
       c = (c != 0 ? c : strcmp (label, w->label));
       if (c == 0)
        write_me = false;
@@ -4384,7 +4388,7 @@ write_common_0 (gfc_symtree *st)
 
       /* Record that we have written this common.  */
       w = XCNEW (struct written_common);
-      w->name = p->name;
+      w->name = lname;
       w->label = label;
       gfc_insert_bbt (&written_commons, w, compare_written_commons);
     }
index fbb3529..b37d770 100644 (file)
@@ -1,3 +1,8 @@
+2009-01-05  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/38657
+       * gfortran.dg/module_commons_3.f90: New test.
+
 2009-01-05  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/37159
diff --git a/gcc/testsuite/gfortran.dg/module_commons_3.f90 b/gcc/testsuite/gfortran.dg/module_commons_3.f90
new file mode 100644 (file)
index 0000000..9ae6386
--- /dev/null
@@ -0,0 +1,57 @@
+! { dg-do run }\r
+!\r
+! PR fortran/38657, in which the mixture of PRIVATE and\r
+! COMMON in TEST4, would mess up the association with\r
+! TESTCHAR in TEST2.\r
+!\r
+! Contributed by Paul Thomas <pault@gcc.gnu.org>\r
+! From a report in clf by Chris Bradley.\r
+!\r
+MODULE TEST4\r
+  PRIVATE\r
+  CHARACTER(LEN=80) :: T1 = &\r
+    "Mary had a little lamb, Its fleece was white as snow;"\r
+  CHARACTER(LEN=80) :: T2 = &\r
+    "And everywhere that Mary went, The lamb was sure to go."\r
+  CHARACTER(LEN=80) :: TESTCHAR\r
+  COMMON /TESTCOMMON1/ TESTCHAR\r
+  PUBLIC T1, T2, FOOBAR\r
+CONTAINS\r
+  subroutine FOOBAR (CHECK)\r
+    CHARACTER(LEN=80) :: CHECK\r
+    IF (TESTCHAR .NE. CHECK) CALL ABORT\r
+  end subroutine\r
+END MODULE TEST4\r
+\r
+MODULE TEST3\r
+  CHARACTER(LEN=80) :: TESTCHAR\r
+  COMMON /TESTCOMMON1/ TESTCHAR\r
+END MODULE TEST3\r
+\r
+MODULE TEST2\r
+  use TEST4\r
+  USE TEST3, chr => testchar\r
+  PRIVATE\r
+  CHARACTER(LEN=80) :: TESTCHAR\r
+  COMMON /TESTCOMMON1/ TESTCHAR\r
+  PUBLIC TESTCHAR, FOO, BAR, CHR, T1, T2, FOOBAR
+contains
+  subroutine FOO
+    TESTCHAR = T1
+  end subroutine
+  subroutine BAR (CHECK)\r
+    CHARACTER(LEN=80) :: CHECK
+    IF (TESTCHAR .NE. CHECK) CALL ABORT\r
+    IF (CHR .NE. CHECK) CALL ABORT\r
+  end subroutine
+END MODULE TEST2\r
+\r
+PROGRAM TEST1\r
+  USE TEST2
+  call FOO
+  call BAR (T1)
+  TESTCHAR = T2
+  call BAR (T2)
+  CALL FOOBAR (T2)\r
+END PROGRAM TEST1\r
+! { dg-final { cleanup-modules "TEST2 TEST3 TEST4" } }\r