aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2009-04-06 05:25:46 +0000
committerPaul Thomas <pault@gcc.gnu.org>2009-04-06 05:25:46 +0000
commit59e36b722194e1f49fe11f9bc670eb7cd2247f6d (patch)
tree5c4149762b06b86b82f6a93c8de2a1ff3013eb9c /gcc/fortran
parentecef6119cef58bc532fd4e326eb8c0afbd671dfc (diff)
downloadgcc-59e36b722194e1f49fe11f9bc670eb7cd2247f6d.zip
gcc-59e36b722194e1f49fe11f9bc670eb7cd2247f6d.tar.gz
gcc-59e36b722194e1f49fe11f9bc670eb7cd2247f6d.tar.bz2
re PR fortran/36091 (false positive in bounds checking with forall)
2009-04-06 Paul Thomas <pault@gcc.gnu.org> PR fortran/36091 * trans-array.c (gfc_conv_array_ref): If the symbol has the temporary attribute use the array_spec for the bounds. * gfortran.h : Add the temporary field to the structure 'symbol_attribute'. * trans-stmt.c (forall_make_variable_temp): Set the symbol's temporary attribute. 2009-04-06 Paul Thomas <pault@gcc.gnu.org PR fortran/36091 * gfortran.dg/forall_13.f90: Add -fbounds-check option. From-SVN: r145581
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog10
-rw-r--r--gcc/fortran/gfortran.h2
-rw-r--r--gcc/fortran/trans-array.c19
-rw-r--r--gcc/fortran/trans-stmt.c1
4 files changed, 31 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 0d9a935..1e5ebc6 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,13 @@
+2009-04-06 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/36091
+ * trans-array.c (gfc_conv_array_ref): If the symbol has the
+ temporary attribute use the array_spec for the bounds.
+ * gfortran.h : Add the temporary field to the structure
+ 'symbol_attribute'.
+ * trans-stmt.c (forall_make_variable_temp): Set the symbol's
+ temporary attribute.
+
2009-04-05 Daniel Franke <franke.daniel@gmail.com>
PR fortran/29458
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 7ea9aa7..4d04fda 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -621,7 +621,7 @@ typedef struct
{
/* Variable attributes. */
unsigned allocatable:1, dimension:1, external:1, intrinsic:1,
- optional:1, pointer:1, target:1, value:1, volatile_:1,
+ optional:1, pointer:1, target:1, value:1, volatile_:1, temporary:1,
dummy:1, result:1, assign:1, threadprivate:1, not_always_present:1,
implied_index:1, subref_array_pointer:1, proc_pointer:1;
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index bc045db..151f2ca 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -2452,6 +2452,7 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_symbol * sym,
tree tmp;
tree stride;
gfc_se indexse;
+ gfc_se tmpse;
/* Handle scalarized references separately. */
if (ar->type != AR_ELEMENT)
@@ -2482,6 +2483,15 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_symbol * sym,
/* Lower bound. */
tmp = gfc_conv_array_lbound (se->expr, n);
+ if (sym->attr.temporary)
+ {
+ gfc_init_se (&tmpse, se);
+ gfc_conv_expr_type (&tmpse, ar->as->lower[n],
+ gfc_array_index_type);
+ gfc_add_block_to_block (&se->pre, &tmpse.pre);
+ tmp = tmpse.expr;
+ }
+
cond = fold_build2 (LT_EXPR, boolean_type_node,
indexse.expr, tmp);
asprintf (&msg, "%s for array '%s', "
@@ -2499,6 +2509,15 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_symbol * sym,
|| (ar->as->type != AS_ASSUMED_SIZE && !ar->as->cp_was_assumed))
{
tmp = gfc_conv_array_ubound (se->expr, n);
+ if (sym->attr.temporary)
+ {
+ gfc_init_se (&tmpse, se);
+ gfc_conv_expr_type (&tmpse, ar->as->upper[n],
+ gfc_array_index_type);
+ gfc_add_block_to_block (&se->pre, &tmpse.pre);
+ tmp = tmpse.expr;
+ }
+
cond = fold_build2 (GT_EXPR, boolean_type_node,
indexse.expr, tmp);
asprintf (&msg, "%s for array '%s', "
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 24e7b80..dd473ef 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -1754,6 +1754,7 @@ forall_make_variable_temp (gfc_code *c, stmtblock_t *pre, stmtblock_t *post)
new_sym = gfc_new_symbol (old_sym->name, NULL);
new_sym->ts = old_sym->ts;
new_sym->attr.referenced = 1;
+ new_sym->attr.temporary = 1;
new_sym->attr.dimension = old_sym->attr.dimension;
new_sym->attr.flavor = old_sym->attr.flavor;