From 7edc89d4c168867a240e54533b2214bbc2a1987c Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Wed, 23 Apr 2008 05:50:54 +0000 Subject: [PATCH] re PR fortran/35988 (run-time abort for MATMUL of run-time zero sized array) 2008-04-23 Thomas Koenig 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 PR libfortran/35988 * gfortran.dg/matmul_7.f90: New test. From-SVN: r134579 --- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/matmul_7.f90 | 40 ++++++++++++++++++++++++++ libgfortran/ChangeLog | 19 ++++++++++++ libgfortran/generated/matmul_c10.c | 5 +++- libgfortran/generated/matmul_c16.c | 5 +++- libgfortran/generated/matmul_c4.c | 5 +++- libgfortran/generated/matmul_c8.c | 5 +++- libgfortran/generated/matmul_i1.c | 5 +++- libgfortran/generated/matmul_i16.c | 5 +++- libgfortran/generated/matmul_i2.c | 5 +++- libgfortran/generated/matmul_i4.c | 5 +++- libgfortran/generated/matmul_i8.c | 5 +++- libgfortran/generated/matmul_r10.c | 5 +++- libgfortran/generated/matmul_r16.c | 5 +++- libgfortran/generated/matmul_r4.c | 5 +++- libgfortran/generated/matmul_r8.c | 5 +++- libgfortran/m4/matmul.m4 | 5 +++- 17 files changed, 120 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/matmul_7.f90 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ff78770e9ce..7896b742e9e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-04-23 Thomas Koenig + + PR libfortran/35988 + * gfortran.dg/matmul_7.f90: New test. + 2008-04-22 Steve Ellcey * 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 00000000000..b3f925a2145 --- /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 434f9dff5bc..3d6ed1a8e1b 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,22 @@ +2008-04-23 Thomas Koenig + + 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 * acinclude.m4 (LIBGFOR_CHECK_ATTRIBUTE_VISIBILITY) diff --git a/libgfortran/generated/matmul_c10.c b/libgfortran/generated/matmul_c10.c index 84c6c5daabb..08c2044dd8b 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 79ca57858ab..6a2a6390967 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 f6b15796ad9..6dcf6fea56a 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 5f4bdec8670..8bc619d879f 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 7c2e95e8893..ca16ed40b2f 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 9c33cc77b82..33c62ae4152 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 143f7832941..e3119acbd41 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 b90c43851f1..a1b8c50f051 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 b3260757c6e..eee73ac88f0 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 ee404b1b789..58dfe75814f 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 1d5f41efae5..a6a93be91fb 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 dc89f5592f9..1154d41a33f 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 5b23f28d697..7bce2533b41 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 a290bfe1f06..181efa3b654 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) { -- 2.30.2