From 067feae32fe285618807617acf418260c6e9cf12 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Sat, 29 Mar 2008 08:11:02 +0000 Subject: 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 --- gcc/fortran/ChangeLog | 10 ++++++++++ gcc/fortran/trans-array.c | 5 ++++- gcc/fortran/trans-expr.c | 4 +++- 3 files changed, 17 insertions(+), 2 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0658995..6615fd3 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 30b2a1c..3de1fb71 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 9b33d37..0167247 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; -- cgit v1.1