From 210879b85b09194934eabcf5777cf2cff6e8dedc Mon Sep 17 00:00:00 2001 From: Daniel Kraft Date: Wed, 21 Jan 2009 14:34:55 +0100 Subject: [PATCH] re PR fortran/38887 (run-time abort for MVBITS with run-time zero sized array arguments) 2009-01-21 Daniel Kraft * trans-stmt.c (gfc_conv_elemental_dependencies): Cleaned up comment. 2009-01-21 Daniel Kraft PR fortran/38887 * runtime/in_unpack_generic.c (internal_unpack): Return instead of abort when called with empty array. * m4/in_unpack.m4: Ditto. * generated/in_unpack_i1.c: Regenerated. * generated/in_unpack_i2.c: Regenerated. * generated/in_unpack_i4.c: Regenerated. * generated/in_unpack_i8.c: Regenerated. * generated/in_unpack_i16.c: Regenerated. * generated/in_unpack_r4.c: Regenerated. * generated/in_unpack_r8.c: Regenerated. * generated/in_unpack_r10.c: Regenerated. * generated/in_unpack_r16.c: Regenerated. * generated/in_unpack_c4.c: Regenerated. * generated/in_unpack_c8.c: Regenerated. * generated/in_unpack_c10.c: Regenerated. * generated/in_unpack_c16.c: Regenerated. 2009-01-21 Daniel Kraft PR fortran/38887 * gfortran.dg/mvbits_5.f90: New test. From-SVN: r143541 --- gcc/fortran/ChangeLog | 4 ++++ gcc/fortran/trans-stmt.c | 3 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/mvbits_5.f90 | 17 +++++++++++++++++ libgfortran/ChangeLog | 20 ++++++++++++++++++++ libgfortran/generated/in_unpack_c10.c | 6 +++--- libgfortran/generated/in_unpack_c16.c | 6 +++--- libgfortran/generated/in_unpack_c4.c | 6 +++--- libgfortran/generated/in_unpack_c8.c | 6 +++--- libgfortran/generated/in_unpack_i1.c | 6 +++--- libgfortran/generated/in_unpack_i16.c | 6 +++--- libgfortran/generated/in_unpack_i2.c | 6 +++--- libgfortran/generated/in_unpack_i4.c | 6 +++--- libgfortran/generated/in_unpack_i8.c | 6 +++--- libgfortran/generated/in_unpack_r10.c | 6 +++--- libgfortran/generated/in_unpack_r16.c | 6 +++--- libgfortran/generated/in_unpack_r4.c | 6 +++--- libgfortran/generated/in_unpack_r8.c | 6 +++--- libgfortran/m4/in_unpack.m4 | 6 +++--- libgfortran/runtime/in_unpack_generic.c | 6 +++--- 20 files changed, 91 insertions(+), 48 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/mvbits_5.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 7c56c004cd6..a744290e67d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,7 @@ +2009-01-21 Daniel Kraft + + * trans-stmt.c (gfc_conv_elemental_dependencies): Cleaned up comment. + 2009-01-20 Paul Thomas PR fortran/38907 diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 031fe88a496..82ecca80ac2 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -311,14 +311,11 @@ gfc_conv_elemental_dependencies (gfc_se * se, gfc_se * loopse, info->offset = gfc_create_var (gfc_array_index_type, NULL); gfc_add_modify (&se->pre, info->offset, offset); - /* Copy the result back using unpack. */ tmp = build_call_expr (gfor_fndecl_in_unpack, 2, parmse.expr, data); gfc_add_expr_to_block (&se->post, tmp); - /* XXX: This is possibly not needed; but isn't it cleaner this way? */ gfc_add_block_to_block (&se->pre, &parmse.pre); - gfc_add_block_to_block (&se->post, &parmse.post); gfc_add_block_to_block (&se->post, &temp_post); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4bf0f2fc856..cffbad4c949 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-01-21 Daniel Kraft + + PR fortran/38887 + * gfortran.dg/mvbits_5.f90: New test. + 2009-01-21 Bingfeng Mei * gcc.dg/sms-6.c: New test. diff --git a/gcc/testsuite/gfortran.dg/mvbits_5.f90 b/gcc/testsuite/gfortran.dg/mvbits_5.f90 new file mode 100644 index 00000000000..42d834668ec --- /dev/null +++ b/gcc/testsuite/gfortran.dg/mvbits_5.f90 @@ -0,0 +1,17 @@ +! { dg-do run } + +! PR fortran/38887 +! This aborted at runtime for the runtime zero-sized array arguments. + +! Contributed by Dick Hendrickson + +program try_ya0013 + integer ida(9) + call ya0013(ida,1,5,6) +end program + +SUBROUTINE YA0013(IDA,nf1,nf5,nf6) + INTEGER IDA(9) + IDA = 1 + CALL MVBITS(IDA(NF5:NF1), 0, 1, IDA(NF6:NF1),2) +END SUBROUTINE diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 7b1241d5fee..96fd675bf0e 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,23 @@ +2009-01-21 Daniel Kraft + + PR fortran/38887 + * runtime/in_unpack_generic.c (internal_unpack): Return instead of + abort when called with empty array. + * m4/in_unpack.m4: Ditto. + * generated/in_unpack_i1.c: Regenerated. + * generated/in_unpack_i2.c: Regenerated. + * generated/in_unpack_i4.c: Regenerated. + * generated/in_unpack_i8.c: Regenerated. + * generated/in_unpack_i16.c: Regenerated. + * generated/in_unpack_r4.c: Regenerated. + * generated/in_unpack_r8.c: Regenerated. + * generated/in_unpack_r10.c: Regenerated. + * generated/in_unpack_r16.c: Regenerated. + * generated/in_unpack_c4.c: Regenerated. + * generated/in_unpack_c8.c: Regenerated. + * generated/in_unpack_c10.c: Regenerated. + * generated/in_unpack_c16.c: Regenerated. + 2009-01-12 Jerry DeLisle PR libfortran/38772 diff --git a/libgfortran/generated/in_unpack_c10.c b/libgfortran/generated/in_unpack_c10.c index 2d971bf14cc..930cfae6dca 100644 --- a/libgfortran/generated/in_unpack_c10.c +++ b/libgfortran/generated/in_unpack_c10.c @@ -60,12 +60,12 @@ internal_unpack_c10 (gfc_array_c10 * d, const GFC_COMPLEX_10 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_c16.c b/libgfortran/generated/in_unpack_c16.c index f09b0b44faf..45927b831f0 100644 --- a/libgfortran/generated/in_unpack_c16.c +++ b/libgfortran/generated/in_unpack_c16.c @@ -60,12 +60,12 @@ internal_unpack_c16 (gfc_array_c16 * d, const GFC_COMPLEX_16 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_c4.c b/libgfortran/generated/in_unpack_c4.c index ed77a700ebf..1a7d707735e 100644 --- a/libgfortran/generated/in_unpack_c4.c +++ b/libgfortran/generated/in_unpack_c4.c @@ -60,12 +60,12 @@ internal_unpack_c4 (gfc_array_c4 * d, const GFC_COMPLEX_4 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_c8.c b/libgfortran/generated/in_unpack_c8.c index e1fada33802..5dbfca0a670 100644 --- a/libgfortran/generated/in_unpack_c8.c +++ b/libgfortran/generated/in_unpack_c8.c @@ -60,12 +60,12 @@ internal_unpack_c8 (gfc_array_c8 * d, const GFC_COMPLEX_8 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_i1.c b/libgfortran/generated/in_unpack_i1.c index 0e7ab116125..ccaa0d2cb06 100644 --- a/libgfortran/generated/in_unpack_i1.c +++ b/libgfortran/generated/in_unpack_i1.c @@ -60,12 +60,12 @@ internal_unpack_1 (gfc_array_i1 * d, const GFC_INTEGER_1 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_i16.c b/libgfortran/generated/in_unpack_i16.c index 36584859dbe..8d0ddf56fdc 100644 --- a/libgfortran/generated/in_unpack_i16.c +++ b/libgfortran/generated/in_unpack_i16.c @@ -60,12 +60,12 @@ internal_unpack_16 (gfc_array_i16 * d, const GFC_INTEGER_16 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_i2.c b/libgfortran/generated/in_unpack_i2.c index 246c3f3999d..cb5048fd53d 100644 --- a/libgfortran/generated/in_unpack_i2.c +++ b/libgfortran/generated/in_unpack_i2.c @@ -60,12 +60,12 @@ internal_unpack_2 (gfc_array_i2 * d, const GFC_INTEGER_2 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_i4.c b/libgfortran/generated/in_unpack_i4.c index d0c0f15640e..1295644c418 100644 --- a/libgfortran/generated/in_unpack_i4.c +++ b/libgfortran/generated/in_unpack_i4.c @@ -60,12 +60,12 @@ internal_unpack_4 (gfc_array_i4 * d, const GFC_INTEGER_4 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_i8.c b/libgfortran/generated/in_unpack_i8.c index 5f2975e7432..a228ded244c 100644 --- a/libgfortran/generated/in_unpack_i8.c +++ b/libgfortran/generated/in_unpack_i8.c @@ -60,12 +60,12 @@ internal_unpack_8 (gfc_array_i8 * d, const GFC_INTEGER_8 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_r10.c b/libgfortran/generated/in_unpack_r10.c index 66ebe82663d..5099b9a4bb9 100644 --- a/libgfortran/generated/in_unpack_r10.c +++ b/libgfortran/generated/in_unpack_r10.c @@ -60,12 +60,12 @@ internal_unpack_r10 (gfc_array_r10 * d, const GFC_REAL_10 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_r16.c b/libgfortran/generated/in_unpack_r16.c index 722dee76af5..d2e557909cb 100644 --- a/libgfortran/generated/in_unpack_r16.c +++ b/libgfortran/generated/in_unpack_r16.c @@ -60,12 +60,12 @@ internal_unpack_r16 (gfc_array_r16 * d, const GFC_REAL_16 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_r4.c b/libgfortran/generated/in_unpack_r4.c index 65bdb078c96..2c374592129 100644 --- a/libgfortran/generated/in_unpack_r4.c +++ b/libgfortran/generated/in_unpack_r4.c @@ -60,12 +60,12 @@ internal_unpack_r4 (gfc_array_r4 * d, const GFC_REAL_4 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/generated/in_unpack_r8.c b/libgfortran/generated/in_unpack_r8.c index 70c11b5f54f..e0e91e909da 100644 --- a/libgfortran/generated/in_unpack_r8.c +++ b/libgfortran/generated/in_unpack_r8.c @@ -60,12 +60,12 @@ internal_unpack_r8 (gfc_array_r8 * d, const GFC_REAL_8 * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/m4/in_unpack.m4 b/libgfortran/m4/in_unpack.m4 index 5c5b5b12a1b..a2a92d0e4e4 100644 --- a/libgfortran/m4/in_unpack.m4 +++ b/libgfortran/m4/in_unpack.m4 @@ -63,12 +63,12 @@ internal_unpack_'rtype_ccode` ('rtype` * d, const 'rtype_name` * src) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } if (dsize != 0) diff --git a/libgfortran/runtime/in_unpack_generic.c b/libgfortran/runtime/in_unpack_generic.c index 81d1f0485ec..b15f4dd9903 100644 --- a/libgfortran/runtime/in_unpack_generic.c +++ b/libgfortran/runtime/in_unpack_generic.c @@ -178,12 +178,12 @@ internal_unpack (gfc_array_char * d, const void * s) stride[n] = d->dim[n].stride; extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound; if (extent[n] <= 0) - abort (); + return; if (dsize == stride[n]) - dsize *= extent[n]; + dsize *= extent[n]; else - dsize = 0; + dsize = 0; } src = s;