aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2008-02-05 13:33:35 +0000
committerPaul Thomas <pault@gcc.gnu.org>2008-02-05 13:33:35 +0000
commit52f5643130fe569c48beef68233e75d9db9b9eb7 (patch)
treeb5d8b0e680f3ba23ddc5185887ed545c9bc188f3 /gcc
parent1db54f4e49894663db378fe462590f7a91ae75ec (diff)
downloadgcc-52f5643130fe569c48beef68233e75d9db9b9eb7.zip
gcc-52f5643130fe569c48beef68233e75d9db9b9eb7.tar.gz
gcc-52f5643130fe569c48beef68233e75d9db9b9eb7.tar.bz2
re PR fortran/34945 (LBOUND fails for array with KIND(complex) used in zero-sized dimension)
2008-02-05 Paul Thomas <pault@gcc.gnu.org> PR fortran/34945 * array.c (match_array_element_spec): Remove check for negative array size. (gfc_resolve_array_spec): Add check for negative size. 2008-02-05 Paul Thomas <pault@gcc.gnu.org> PR fortran/34945 * gfortran.dg/bounds_check_13.f: New test. From-SVN: r132121
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/array.c24
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/bounds_check_13.f21
4 files changed, 48 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 97a1a17..b795f89 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,12 @@
2008-02-05 Paul Thomas <pault@gcc.gnu.org>
+ PR fortran/34945
+ * array.c (match_array_element_spec): Remove check for negative
+ array size.
+ (gfc_resolve_array_spec): Add check for negative size.
+
+2008-02-05 Paul Thomas <pault@gcc.gnu.org>
+
PR fortran/32315
* data.c (gfc_assign_data_value): Add bounds check for array
references.
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index 0c30b33..75f80ed 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -250,6 +250,21 @@ gfc_resolve_array_spec (gfc_array_spec *as, int check_constant)
e = as->upper[i];
if (resolve_array_bound (e, check_constant) == FAILURE)
return FAILURE;
+
+ if ((as->lower[i] == NULL) || (as->upper[i] == NULL))
+ continue;
+
+ /* If the size is negative in this dimension, set it to zero. */
+ if (as->lower[i]->expr_type == EXPR_CONSTANT
+ && as->upper[i]->expr_type == EXPR_CONSTANT
+ && mpz_cmp (as->upper[i]->value.integer,
+ as->lower[i]->value.integer) < 0)
+ {
+ gfc_free_expr (as->upper[i]);
+ as->upper[i] = gfc_copy_expr (as->lower[i]);
+ mpz_sub_ui (as->upper[i]->value.integer,
+ as->upper[i]->value.integer, 1);
+ }
}
return SUCCESS;
@@ -318,15 +333,6 @@ match_array_element_spec (gfc_array_spec *as)
if (m == MATCH_NO)
return AS_ASSUMED_SHAPE;
- /* If the size is negative in this dimension, set it to zero. */
- if ((*lower)->expr_type == EXPR_CONSTANT
- && (*upper)->expr_type == EXPR_CONSTANT
- && mpz_cmp ((*upper)->value.integer, (*lower)->value.integer) < 0)
- {
- gfc_free_expr (*upper);
- *upper = gfc_copy_expr (*lower);
- mpz_sub_ui ((*upper)->value.integer, (*upper)->value.integer, 1);
- }
return AS_EXPLICIT;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d51c3ed..daf3f07 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-02-05 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/34945
+ * gfortran.dg/bounds_check_13.f: New test.
+
2008-02-05 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR testsuite/33946
diff --git a/gcc/testsuite/gfortran.dg/bounds_check_13.f b/gcc/testsuite/gfortran.dg/bounds_check_13.f
new file mode 100644
index 0000000..3581a18
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/bounds_check_13.f
@@ -0,0 +1,21 @@
+! { dg-do compile }
+! Tests the fix for PR34945, in which the lbound = KIND(YDA) was not resolved
+! in time to set the size of TEST_ARRAY to zero.
+!
+! Contributed by Dick Hendrickson <dick.hendrickson@gmail.com>
+!
+ SUBROUTINE VF0009(IDA1,IDA2,YDA,HDA)
+ INTEGER(4) IDA1(4)
+ INTEGER(4) IDA2(4)
+ COMPLEX(8) YDA(2)
+ INTEGER(4) HDA(3)
+! I N I T I A L I Z A T I O N S E C T I O N
+ COMPLEX(KIND=4) :: TEST_ARRAY
+ $( 4:5,
+ $ KIND(YDA):5,
+ $ 4:5,
+ $ 4:5 )
+! T E S T S T A T E M E N T S
+ IDA1(1:4) = LBOUND(TEST_ARRAY)
+ END SUBROUTINE
+