aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@gcc.gnu.org>2007-07-05 14:51:51 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2007-07-05 14:51:51 +0200
commit5349080dd3851ea98ac1c9c8bf24279a7cd3ca97 (patch)
tree1281d63a921c00f8d91cb684061e182b7c459e18 /gcc
parent7e08fa357c2b918c28599f7d11dfc65165117de3 (diff)
downloadgcc-5349080dd3851ea98ac1c9c8bf24279a7cd3ca97.zip
gcc-5349080dd3851ea98ac1c9c8bf24279a7cd3ca97.tar.gz
gcc-5349080dd3851ea98ac1c9c8bf24279a7cd3ca97.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog12
-rw-r--r--gcc/fortran/decl.c1
-rw-r--r--gcc/fortran/gfortran.h10
-rw-r--r--gcc/fortran/resolve.c7
-rw-r--r--gcc/fortran/symbol.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/module_md5_1.f902
7 files changed, 34 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7504c71..0173eb3 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index b3bbe75..2c828ba 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -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;
}
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 6a0fd09..3c15c61 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -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. */
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 158abe0..299d430 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -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
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index c7527bf..42f7776 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -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);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 034f9cd..e7888e1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/module_md5_1.f90 b/gcc/testsuite/gfortran.dg/module_md5_1.f90
index 45792bd..6382df1 100644
--- a/gcc/testsuite/gfortran.dg/module_md5_1.f90
+++ b/gcc/testsuite/gfortran.dg/module_md5_1.f90
@@ -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" } }