Commit 5349080d by Tobias Burnus

re PR fortran/32359 (incorrect error: Threadprivate isn't SAVEd (implicit save…

re PR fortran/32359 (incorrect error: Threadprivate isn't SAVEd (implicit save attribute undefined))

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
parent 7e08fa35
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> 2007-07-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/32526 PR fortran/32526
......
...@@ -1232,6 +1232,7 @@ add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus) ...@@ -1232,6 +1232,7 @@ add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
} }
sym->value = init; sym->value = init;
sym->attr.save = SAVE_IMPLICIT;
*initp = NULL; *initp = NULL;
} }
......
...@@ -297,6 +297,12 @@ typedef enum ifsrc ...@@ -297,6 +297,12 @@ typedef enum ifsrc
} }
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 /* Strings for all symbol attributes. We use these for dumping the
parse tree, in error messages, and also when reading and writing parse tree, in error messages, and also when reading and writing
modules. In symbol.c. */ modules. In symbol.c. */
...@@ -620,10 +626,12 @@ typedef struct ...@@ -620,10 +626,12 @@ typedef struct
{ {
/* Variable attributes. */ /* Variable attributes. */
unsigned allocatable:1, dimension:1, external:1, intrinsic:1, 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, dummy:1, result:1, assign:1, threadprivate:1, not_always_present:1,
implied_index:1; implied_index:1;
ENUM_BITFIELD (save_state) save:2;
unsigned data:1, /* Symbol is named in a DATA statement. */ unsigned data:1, /* Symbol is named in a DATA statement. */
protected:1, /* Symbol has been marked as protected. */ protected:1, /* Symbol has been marked as protected. */
use_assoc:1, /* Symbol has been use-associated. */ use_assoc:1, /* Symbol has been use-associated. */
......
...@@ -6508,8 +6508,9 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag) ...@@ -6508,8 +6508,9 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
} }
} }
/* Also, they must not have the SAVE attribute. */ /* Also, they must not have the SAVE attribute.
if (flag && sym->attr.save) SAVE_IMPLICIT is checked below. */
if (flag && sym->attr.save == SAVE_EXPLICIT)
{ {
gfc_error (auto_save_msg, sym->name, &sym->declared_at); gfc_error (auto_save_msg, sym->name, &sym->declared_at);
return FAILURE; return FAILURE;
...@@ -7287,7 +7288,7 @@ resolve_symbol (gfc_symbol *sym) ...@@ -7287,7 +7288,7 @@ resolve_symbol (gfc_symbol *sym)
gfc_resolve (sym->formal_ns); gfc_resolve (sym->formal_ns);
/* Check threadprivate restrictions. */ /* 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->attr.in_common
&& sym->module == NULL && sym->module == NULL
&& (sym->ns->proc_name == NULL && (sym->ns->proc_name == NULL
......
...@@ -925,7 +925,7 @@ gfc_add_save (symbol_attribute *attr, const char *name, locus *where) ...@@ -925,7 +925,7 @@ gfc_add_save (symbol_attribute *attr, const char *name, locus *where)
return FAILURE; return FAILURE;
} }
if (attr->save) if (attr->save == SAVE_EXPLICIT)
{ {
if (gfc_notify_std (GFC_STD_LEGACY, if (gfc_notify_std (GFC_STD_LEGACY,
"Duplicate SAVE attribute specified at %L", "Duplicate SAVE attribute specified at %L",
...@@ -934,7 +934,7 @@ gfc_add_save (symbol_attribute *attr, const char *name, locus *where) ...@@ -934,7 +934,7 @@ gfc_add_save (symbol_attribute *attr, const char *name, locus *where)
return FAILURE; return FAILURE;
} }
attr->save = 1; attr->save = SAVE_EXPLICIT;
return check_conflict (attr, name, where); return check_conflict (attr, name, where);
} }
......
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> 2007-07-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/32526 PR fortran/32526
...@@ -10,5 +10,5 @@ program test ...@@ -10,5 +10,5 @@ program test
use foo use foo
print *, pi print *, pi
end program test end program test
! { dg-final { scan-module "foo" "MD5:10e58dd12566bfc60412da6f8f8f7a07" } } ! { dg-final { scan-module "foo" "MD5:6d026a84bb779a7b6789854d85d4f01f" } }
! { dg-final { cleanup-modules "foo" } } ! { dg-final { cleanup-modules "foo" } }
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> 2007-07-02 Jakub Jelinek <jakub@redhat.com>
PR libgomp/32468 PR libgomp/32468
......
! { 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
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