re PR fortran/32359 (incorrect error: Threadprivate isn't SAVEd (implicit save attrib...
authorTobias Burnus <burnus@gcc.gnu.org>
Thu, 5 Jul 2007 12:51:51 +0000 (14:51 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 5 Jul 2007 12:51:51 +0000 (14:51 +0200)
gcc/fortran/
2007-07-05  Daniel Franke  <franke.daniel@gmail.com>
    Tobias Burnus  <burnus@net-b.de>

PR fortran/32359
* gfortran.h (symbol_attribute): Change save attribute into an enum.
* decl.c (add_init_expr_to_sym): Set it to SAVE_IMPLICIT.
* symbol.c (gfc_add_save): Check for SAVE_EXPLICIT.
* resolve.c (resolve_fl_variable): Check for SAVE_EXPLICIT.
(resolve_symbol): Allow OMP threadprivate with
initialization SAVEd and save_all variable.
* trans-decl.c (gfc_finish_var_decl): Remove obsolete sym->value check.

libgomp/
2007-07-05  Tobias Burnus  <burnus@net-b.de>

PR fortran/32359
* testsuite/libgomp.fortran/pr32359.f90: New.

gcc/testsuite/
2007-07-05  Tobias Burnus  <burnus@net-b.de>

PR fortran/32359
* gfortran.dg/module_md5_1.f90: Update MD5 number.

From-SVN: r126366

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/gfortran.h
gcc/fortran/resolve.c
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/module_md5_1.f90
libgomp/ChangeLog
libgomp/testsuite/libgomp.fortran/pr32359.f90 [new file with mode: 0644]

index 7504c715eee907d5657a826527c19bf7643b10a7..0173eb3d7ca9bc50215a6e2a13a81a073e447b07 100644 (file)
@@ -1,3 +1,15 @@
+2007-07-05  Daniel Franke  <franke.daniel@gmail.com>
+           Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/32359
+       * gfortran.h (symbol_attribute): Change save attribute into an enum.
+       * decl.c (add_init_expr_to_sym): Set it to SAVE_IMPLICIT.
+       * symbol.c (gfc_add_save): Check for SAVE_EXPLICIT.
+       * resolve.c (resolve_fl_variable): Check for SAVE_EXPLICIT.
+       (resolve_symbol): Allow OMP threadprivate with
+       initialization SAVEd and save_all variable.
+       * trans-decl.c (gfc_finish_var_decl): Remove obsolete sym->value check.
+
 2007-07-05  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/32526
index b3bbe75d162329752eef6ce7e2af97b4419b06d7..2c828bab08b866497a26e68610fc493d0dc3886c 100644 (file)
@@ -1232,6 +1232,7 @@ add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
        }
 
       sym->value = init;
+      sym->attr.save = SAVE_IMPLICIT;
       *initp = NULL;
     }
 
index 6a0fd091ec5484facb6c34cd8fae0abfbfd69be9..3c15c61a02e0d508ce43a6578970e6eb06c58980 100644 (file)
@@ -297,6 +297,12 @@ typedef enum ifsrc
 }
 ifsrc;
 
+/* Whether a SAVE attribute was set explicitly or implictly.  */
+typedef enum save_state
+{ SAVE_NONE = 0, SAVE_EXPLICIT, SAVE_IMPLICIT
+}
+save_state;
+
 /* Strings for all symbol attributes.  We use these for dumping the
    parse tree, in error messages, and also when reading and writing
    modules.  In symbol.c.  */
@@ -620,10 +626,12 @@ typedef struct
 {
   /* Variable attributes.  */
   unsigned allocatable:1, dimension:1, external:1, intrinsic:1,
-    optional:1, pointer:1, save:1, target:1, value:1, volatile_:1,
+    optional:1, pointer:1, target:1, value:1, volatile_:1,
     dummy:1, result:1, assign:1, threadprivate:1, not_always_present:1,
     implied_index:1;
 
+  ENUM_BITFIELD (save_state) save:2;
+
   unsigned data:1,             /* Symbol is named in a DATA statement.  */
     protected:1,               /* Symbol has been marked as protected.  */
     use_assoc:1,               /* Symbol has been use-associated.  */
index 158abe02327f6a8086cc30661cbb038f23d04505..299d4307a62278c003bf26d373e4b5910092690b 100644 (file)
@@ -6508,8 +6508,9 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
            }
        }
 
-      /* Also, they must not have the SAVE attribute.  */
-      if (flag && sym->attr.save)
+      /* Also, they must not have the SAVE attribute.
+        SAVE_IMPLICIT is checked below.  */
+      if (flag && sym->attr.save == SAVE_EXPLICIT)
        {
          gfc_error (auto_save_msg, sym->name, &sym->declared_at);
          return FAILURE;
@@ -7287,7 +7288,7 @@ resolve_symbol (gfc_symbol *sym)
     gfc_resolve (sym->formal_ns);
 
   /* Check threadprivate restrictions.  */
-  if (sym->attr.threadprivate && !sym->attr.save
+  if (sym->attr.threadprivate && !sym->attr.save && !sym->ns->save_all
       && (!sym->attr.in_common
          && sym->module == NULL
          && (sym->ns->proc_name == NULL
index c7527bfb1c11f5f094611b0f10dd07d27a81027e..42f7776dff63c0a84bca93cc96391f0bdf8d43b9 100644 (file)
@@ -925,7 +925,7 @@ gfc_add_save (symbol_attribute *attr, const char *name, locus *where)
       return FAILURE;
     }
 
-  if (attr->save)
+  if (attr->save == SAVE_EXPLICIT)
     {
        if (gfc_notify_std (GFC_STD_LEGACY, 
                            "Duplicate SAVE attribute specified at %L",
@@ -934,7 +934,7 @@ gfc_add_save (symbol_attribute *attr, const char *name, locus *where)
          return FAILURE;
     }
 
-  attr->save = 1;
+  attr->save = SAVE_EXPLICIT;
   return check_conflict (attr, name, where);
 }
 
index 034f9cd2ac3e7055bf7766f5eb03343bdd8301e1..e7888e1d2c1c3b717115c4b4249d50c00d7c77fc 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-05  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/32359
+       * gfortran.dg/module_md5_1.f90: Update MD5 number.
+
 2007-07-05  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/32526
index 45792bda38997a497a882823c246776b6b7d2854..6382df1eb3215f8c50d18f138e56e9c3e180fb1e 100644 (file)
@@ -10,5 +10,5 @@ program test
   use foo
   print *, pi
 end program test
-! { dg-final { scan-module "foo" "MD5:10e58dd12566bfc60412da6f8f8f7a07" } }
+! { dg-final { scan-module "foo" "MD5:6d026a84bb779a7b6789854d85d4f01f" } }
 ! { dg-final { cleanup-modules "foo" } }
index a9d1f5a40be5fb6da3929cf68df777029fae087d..c8c1247ada5525baf2de5be52ae7c375ec236c9c 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-05  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/32359
+       * testsuite/libgomp.fortran/pr32359.f90: New.
+
 2007-07-02  Jakub Jelinek  <jakub@redhat.com>
 
        PR libgomp/32468
diff --git a/libgomp/testsuite/libgomp.fortran/pr32359.f90 b/libgomp/testsuite/libgomp.fortran/pr32359.f90
new file mode 100644 (file)
index 0000000..e48a8a7
--- /dev/null
@@ -0,0 +1,34 @@
+! { dg-do compile }
+!
+! PR fortran/32359
+! Contributed by Bill Long <longb@cray.com>
+
+subroutine test
+      use omp_lib
+      implicit none
+      integer, parameter :: NT = 4
+      integer :: a
+      save
+!$omp threadprivate(a)
+      a = 1
+
+!$    call omp_set_num_threads(NT)
+!$omp parallel
+      print *, omp_get_thread_num(), a
+!$omp end parallel
+
+end subroutine test
+
+! Derived from OpenMP test omp1/F2_6_2_8_5i.f90
+      use omp_lib
+      implicit none
+      integer, parameter :: NT = 4
+      integer :: a = 1
+!$omp threadprivate(a)
+
+!$    call omp_set_num_threads(NT)
+!$omp parallel
+      print *, omp_get_thread_num(), a
+!$omp end parallel
+
+      END