From: Paul Thomas Date: Sat, 29 Mar 2008 08:11:02 +0000 (+0000) Subject: re PR fortran/35698 (lbound and ubound wrong for allocated run-time zero size array) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=067feae32fe285618807617acf418260c6e9cf12;p=gcc.git re PR fortran/35698 (lbound and ubound wrong for allocated run-time zero size array) 2008-03-29 Paul Thomas PR fortran/35698 * trans-array.c (gfc_array_init_size): Set 'size' zero if negative in one dimension. PR fortran/35702 * trans-expr.c (gfc_trans_string_copy): Only assign a char directly if the lhs and rhs types are the same. 2008-03-29 Paul Thomas PR fortran/35698 * gfortran.dg/allocate_zerosize_3.f: New test. PR fortran/35702 * gfortran.dg/character_assign_1.f90: New test. From-SVN: r133710 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 06589954ead..6615fd35051 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2008-03-29 Paul Thomas + + PR fortran/35698 + * trans-array.c (gfc_array_init_size): Set 'size' zero if + negative in one dimension. + + PR fortran/35702 + * trans-expr.c (gfc_trans_string_copy): Only assign a char + directly if the lhs and rhs types are the same. + 2008-03-28 Daniel Franke Paul Richard Thomas diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 30b2a1ca611..3de1fb71f20 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -3505,7 +3505,7 @@ gfc_conv_loop_setup (gfc_loopinfo * loop) size = 1 - lbound; a.ubound[n] = specified_upper_bound; a.stride[n] = stride; - size = ubound + size; //size = ubound + 1 - lbound + size = siz >= 0 ? ubound + size : 0; //size = ubound + 1 - lbound stride = stride * size; } return (stride); @@ -3605,6 +3605,9 @@ gfc_array_init_size (tree descriptor, int rank, tree * poffset, else or_expr = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, or_expr, cond); + size = fold_build3 (COND_EXPR, gfc_array_index_type, cond, + gfc_index_zero_node, size); + /* Multiply the stride by the number of elements in this dimension. */ stride = fold_build2 (MULT_EXPR, gfc_array_index_type, stride, size); stride = gfc_evaluate_now (stride, pblock); diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 9b33d378107..01672470331 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -2858,7 +2858,9 @@ gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest, dsc = gfc_to_single_character (dlen, dest); - if (dsc != NULL_TREE && ssc != NULL_TREE) + /* Assign directly if the types are compatible. */ + if (dsc != NULL_TREE && ssc != NULL_TREE + && TREE_TYPE (dsc) == TREE_TYPE (ssc)) { gfc_add_modify_expr (block, dsc, ssc); return; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 30384060444..079be17bc78 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-03-29 Paul Thomas + + PR fortran/35698 + * gfortran.dg/allocate_zerosize_3.f: New test. + + PR fortran/35702 + * gfortran.dg/character_assign_1.f90: New test. + 2008-03-28 Thomas Koenig PR libfortran/32972 diff --git a/gcc/testsuite/gfortran.dg/allocate_zerosize_3.f b/gcc/testsuite/gfortran.dg/allocate_zerosize_3.f new file mode 100644 index 00000000000..57f2d75b67c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocate_zerosize_3.f @@ -0,0 +1,40 @@ +C { dg-do run } +C Test the fix for PR35698, in which the negative size dimension would +C throw out the subsequent bounds. +C +C Contributed by Dick Hendrickson +C + program try_lf0030 + call LF0030(10) + end + + SUBROUTINE LF0030(nf10) + INTEGER ILA1(7) + INTEGER ILA2(7) + LOGICAL LLA(:,:,:,:,:,:,:) + INTEGER ICA(7) + ALLOCATABLE LLA + + + ALLOCATE (LLA(2:3, 4, 0:5, + $ NF10:1, -2:7, -3:8, + $ -4:9)) + + ILA1 = LBOUND(LLA) + ILA2 = UBOUND(LLA) +C CORRECT FOR THE ZERO DIMENSIONED TERM TO ALLOW AN EASIER VERIFY + ILA1(4) = ILA1(4) - 2 ! 1 - 2 = -1 + ILA2(4) = ILA2(4) + 6 ! 0 + 6 = 6 + + DO J1 = 1,7 + IVAL = 3-J1 + IF (ILA1(J1) .NE. IVAL) call abort () + 100 ENDDO + + DO J1 = 1,7 + IVAL = 2+J1 + IF (ILA2(J1) .NE. IVAL) call abort () + 101 ENDDO + + END SUBROUTINE + \ No newline at end of file diff --git a/gcc/testsuite/gfortran.dg/character_assign_1.f90 b/gcc/testsuite/gfortran.dg/character_assign_1.f90 new file mode 100644 index 00000000000..a4e073299b3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/character_assign_1.f90 @@ -0,0 +1,17 @@ +! { dg-do compile } +! Tests the fix for PR35702, which caused an ICE because the types in the assignment +! were not translated to be the same. +! +! Contributed by Dick Hendrickson +! +MODULE TESTS + TYPE UNSEQ + CHARACTER(1) :: C + END TYPE UNSEQ +CONTAINS + SUBROUTINE CG0028 (TDA1L, TDA1R, nf0, nf1, nf2, nf3) + TYPE(UNSEQ) TDA1L(NF3) + TDA1L(NF1:NF2:NF1)%C = TDA1L(NF0+2:NF3:NF2/2)%C + END SUBROUTINE +END MODULE TESTS +! { dg-final { cleanup-modules "tests" } }