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
This commit is contained in:
parent
7e08fa357c
commit
5349080dd3
9 changed files with 73 additions and 7 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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" } }
|
||||
|
|
|
@ -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
|
||||
|
|
34
libgomp/testsuite/libgomp.fortran/pr32359.f90
Normal file
34
libgomp/testsuite/libgomp.fortran/pr32359.f90
Normal file
|
@ -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
|
Loading…
Add table
Reference in a new issue