aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2008-04-23 05:50:54 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2008-04-23 05:50:54 +0000
commit7edc89d4c168867a240e54533b2214bbc2a1987c (patch)
treebd46eec170f8c0e3cf03ec5971a682da2e37e83a
parentd5555b955d4a769168475e623597cf822d8fd82a (diff)
downloadgcc-7edc89d4c168867a240e54533b2214bbc2a1987c.zip
gcc-7edc89d4c168867a240e54533b2214bbc2a1987c.tar.gz
gcc-7edc89d4c168867a240e54533b2214bbc2a1987c.tar.bz2
re PR fortran/35988 (run-time abort for MATMUL of run-time zero sized array)
2008-04-23 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/35988 * m4/matmul.m4: Only issue a runtime error if extents are non-zero. * generated/matmul_i1.c: Regenerated. * generated/matmul_i2.c: Regenerated. * generated/matmul_i4.c: Regenerated. * generated/matmul_i8.c: Regenerated. * generated/matmul_i16.c: Regenerated. * generated/matmul_r4.c: Regenerated. * generated/matmul_r8.c: Regenerated. * generated/matmul_r10.c: Regenerated. * generated/matmul_r16.c: Regenerated. * generated/matmul_c4.c: Regenerated. * generated/matmul_c8.c: Regenerated. * generated/matmul_c10.c: Regenerated. * generated/matmul_c16.c: Regenerated. 2008-04-23 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/35988 * gfortran.dg/matmul_7.f90: New test. From-SVN: r134579
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/matmul_7.f9040
-rw-r--r--libgfortran/ChangeLog19
-rw-r--r--libgfortran/generated/matmul_c10.c5
-rw-r--r--libgfortran/generated/matmul_c16.c5
-rw-r--r--libgfortran/generated/matmul_c4.c5
-rw-r--r--libgfortran/generated/matmul_c8.c5
-rw-r--r--libgfortran/generated/matmul_i1.c5
-rw-r--r--libgfortran/generated/matmul_i16.c5
-rw-r--r--libgfortran/generated/matmul_i2.c5
-rw-r--r--libgfortran/generated/matmul_i4.c5
-rw-r--r--libgfortran/generated/matmul_i8.c5
-rw-r--r--libgfortran/generated/matmul_r10.c5
-rw-r--r--libgfortran/generated/matmul_r16.c5
-rw-r--r--libgfortran/generated/matmul_r4.c5
-rw-r--r--libgfortran/generated/matmul_r8.c5
-rw-r--r--libgfortran/m4/matmul.m45
17 files changed, 120 insertions, 14 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ff78770..7896b74 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-04-23 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR libfortran/35988
+ * gfortran.dg/matmul_7.f90: New test.
+
2008-04-22 Steve Ellcey <sje@cup.hp.com>
* gcc.dg/struct/wo_prof_global_var.c: Initialize array.
diff --git a/gcc/testsuite/gfortran.dg/matmul_7.f90 b/gcc/testsuite/gfortran.dg/matmul_7.f90
new file mode 100644
index 0000000..b3f925a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/matmul_7.f90
@@ -0,0 +1,40 @@
+! { dg-do run }
+! PR 35988 - failure on some zero-sized matmuls.
+! Test case contributed by Dick Hendrickson.
+
+ program try_gf1003
+
+ call gf1003a( 9, 8, 6)
+ call gf1003b( 9, 8, 6)
+ call gf1003c( 9, 8, 6) !fails
+ call gf1003d( 9, 8, 6) !fails
+ end program
+
+
+ SUBROUTINE GF1003a(nf9,nf8,nf6)
+ REAL RDA(3,2)
+ REAL RDA1(3,5)
+ REAL RDA2(5,2)
+ RDA = MATMUL(RDA1(:, 9:8),RDA2( 8:6,:))
+ END SUBROUTINE
+
+ SUBROUTINE GF1003b(nf9,nf8,nf6)
+ REAL RDA(3,2)
+ REAL RDA1(3,0)
+ REAL RDA2(0,2)
+ RDA = MATMUL(RDA1(:,NF9:NF8),RDA2(NF9:NF8,:))
+ END SUBROUTINE
+
+ SUBROUTINE GF1003c(nf9,nf8,nf6)
+ REAL RDA(3,2)
+ REAL RDA1(3,0)
+ REAL RDA2(0,2)
+ RDA = MATMUL(RDA1(:,NF9:NF8),RDA2(NF8:NF6,:))
+ END SUBROUTINE
+
+ SUBROUTINE GF1003d(nf9,nf8,nf6)
+ REAL RDA(3,2)
+ REAL RDA1(3,5)
+ REAL RDA2(5,2)
+ RDA = MATMUL(RDA1(:,NF9:NF8),RDA2(NF8:NF6,:))
+ END SUBROUTINE
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 434f9df..3d6ed1a 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,22 @@
+2008-04-23 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR libfortran/35988
+ * m4/matmul.m4: Only issue a runtime error if extents are
+ non-zero.
+ * generated/matmul_i1.c: Regenerated.
+ * generated/matmul_i2.c: Regenerated.
+ * generated/matmul_i4.c: Regenerated.
+ * generated/matmul_i8.c: Regenerated.
+ * generated/matmul_i16.c: Regenerated.
+ * generated/matmul_r4.c: Regenerated.
+ * generated/matmul_r8.c: Regenerated.
+ * generated/matmul_r10.c: Regenerated.
+ * generated/matmul_r16.c: Regenerated.
+ * generated/matmul_c4.c: Regenerated.
+ * generated/matmul_c8.c: Regenerated.
+ * generated/matmul_c10.c: Regenerated.
+ * generated/matmul_c16.c: Regenerated.
+
2008-04-21 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* acinclude.m4 (LIBGFOR_CHECK_ATTRIBUTE_VISIBILITY)
diff --git a/libgfortran/generated/matmul_c10.c b/libgfortran/generated/matmul_c10.c
index 84c6c5d..08c2044 100644
--- a/libgfortran/generated/matmul_c10.c
+++ b/libgfortran/generated/matmul_c10.c
@@ -170,7 +170,10 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_c16.c b/libgfortran/generated/matmul_c16.c
index 79ca578..6a2a639 100644
--- a/libgfortran/generated/matmul_c16.c
+++ b/libgfortran/generated/matmul_c16.c
@@ -170,7 +170,10 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_c4.c b/libgfortran/generated/matmul_c4.c
index f6b1579..6dcf6fe 100644
--- a/libgfortran/generated/matmul_c4.c
+++ b/libgfortran/generated/matmul_c4.c
@@ -170,7 +170,10 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_c8.c b/libgfortran/generated/matmul_c8.c
index 5f4bdec..8bc619d 100644
--- a/libgfortran/generated/matmul_c8.c
+++ b/libgfortran/generated/matmul_c8.c
@@ -170,7 +170,10 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_i1.c b/libgfortran/generated/matmul_i1.c
index 7c2e95e..ca16ed4 100644
--- a/libgfortran/generated/matmul_i1.c
+++ b/libgfortran/generated/matmul_i1.c
@@ -170,7 +170,10 @@ matmul_i1 (gfc_array_i1 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_i16.c b/libgfortran/generated/matmul_i16.c
index 9c33cc7..33c62ae 100644
--- a/libgfortran/generated/matmul_i16.c
+++ b/libgfortran/generated/matmul_i16.c
@@ -170,7 +170,10 @@ matmul_i16 (gfc_array_i16 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_i2.c b/libgfortran/generated/matmul_i2.c
index 143f783..e3119ac 100644
--- a/libgfortran/generated/matmul_i2.c
+++ b/libgfortran/generated/matmul_i2.c
@@ -170,7 +170,10 @@ matmul_i2 (gfc_array_i2 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_i4.c b/libgfortran/generated/matmul_i4.c
index b90c438..a1b8c50 100644
--- a/libgfortran/generated/matmul_i4.c
+++ b/libgfortran/generated/matmul_i4.c
@@ -170,7 +170,10 @@ matmul_i4 (gfc_array_i4 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_i8.c b/libgfortran/generated/matmul_i8.c
index b326075..eee73ac 100644
--- a/libgfortran/generated/matmul_i8.c
+++ b/libgfortran/generated/matmul_i8.c
@@ -170,7 +170,10 @@ matmul_i8 (gfc_array_i8 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_r10.c b/libgfortran/generated/matmul_r10.c
index ee404b1..58dfe75 100644
--- a/libgfortran/generated/matmul_r10.c
+++ b/libgfortran/generated/matmul_r10.c
@@ -170,7 +170,10 @@ matmul_r10 (gfc_array_r10 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_r16.c b/libgfortran/generated/matmul_r16.c
index 1d5f41e..a6a93be 100644
--- a/libgfortran/generated/matmul_r16.c
+++ b/libgfortran/generated/matmul_r16.c
@@ -170,7 +170,10 @@ matmul_r16 (gfc_array_r16 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_r4.c b/libgfortran/generated/matmul_r4.c
index dc89f55..1154d41 100644
--- a/libgfortran/generated/matmul_r4.c
+++ b/libgfortran/generated/matmul_r4.c
@@ -170,7 +170,10 @@ matmul_r4 (gfc_array_r4 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/generated/matmul_r8.c b/libgfortran/generated/matmul_r8.c
index 5b23f28..7bce253 100644
--- a/libgfortran/generated/matmul_r8.c
+++ b/libgfortran/generated/matmul_r8.c
@@ -170,7 +170,10 @@ matmul_r8 (gfc_array_r8 * const restrict retarray,
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{
diff --git a/libgfortran/m4/matmul.m4 b/libgfortran/m4/matmul.m4
index a290bfe..181efa3 100644
--- a/libgfortran/m4/matmul.m4
+++ b/libgfortran/m4/matmul.m4
@@ -172,7 +172,10 @@ sinclude(`matmul_asm_'rtype_code`.m4')dnl
}
if (count != b->dim[0].ubound + 1 - b->dim[0].lbound)
- runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ {
+ if (count > 0 || b->dim[0].ubound + 1 - b->dim[0].lbound > 0)
+ runtime_error ("dimension of array B incorrect in MATMUL intrinsic");
+ }
if (GFC_DESCRIPTOR_RANK (b) == 1)
{