This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[Patch, fortran] PR35698 and PR35702
- From: "Paul Richard Thomas" <paul dot richard dot thomas at gmail dot com>
- To: "Fortran List" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 27 Mar 2008 22:42:26 +0100
- Subject: [Patch, fortran] PR35698 and PR35702
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type; bh=8GIZVqc8IRVZCrcxDms6eCQCFCPgMBRV1oaJAb+opoo=; b=LRZAA1sGAPkRFdx07QMr/jt12igzku7jjpbfwcuZ4M9JVhSibNfLSKk4JAd6wS1OtRVADuAzpwr4SaAjdsGIxLDDsF0y/GspXaaGWSV6KQtMgcCLRoBU2xeltlPX2AJhXlNe4PnIhI8WMNjI44xKSjLqX8KrU9RTRlJMYirp/Es=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=message-id:date:from:to:subject:mime-version:content-type; b=m3pXl2TmgmWACojacrZKXqHvQ9zL8ykKKYxtJ5VTb9dzviQxJacmg2WtFps/g+YBNKzLP4UIM2ajgh1NJzML0dNJbbReP/sxVDWgLMQm06y3Y0Aml5T5etlN6WODaKLqp+OkNun2H6mR4pZ3TRomwOXlYHMW9rnisAMJdHCW/5U=
:ADDPATCH fortran:
These two patches are entirely self explanatory. I have to confess
that the fix for PR35702 is a bit of a cop out in that, in principle,
the casting should be done to make the assignement... somewhere.
However, these corner cases keep cropping up and this fixes them once
and for always. The alternative is to spend an incommensurate amount
of effort to track down where each comes from. If desired, a TODO
could be added.
Bootstrapped and regteste x86_ia64/FC8 - OK for trunk?
Paul
2008-03-27 Paul Thomas <pault@gcc.gnu.org>
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-27 Paul Thomas <pault@gcc.gnu.org>
PR fortran/35698
* gfortran.dg/allocate_zerosize_3.f: New test.
PR fortran/35702
* gfortran.dg/character_assign_1.f90: New test.
--
The knack of flying is learning how to throw yourself at the ground and miss.
--Hitchhikers Guide to the Galaxy
Index: gcc/fortran/trans-expr.c
===================================================================
*** gcc/fortran/trans-expr.c (revision 133653)
--- gcc/fortran/trans-expr.c (working copy)
*************** gfc_trans_string_copy (stmtblock_t * blo
*** 2858,2864 ****
dsc = gfc_to_single_character (dlen, dest);
! if (dsc != NULL_TREE && ssc != NULL_TREE)
{
gfc_add_modify_expr (block, dsc, ssc);
return;
--- 2858,2866 ----
dsc = gfc_to_single_character (dlen, dest);
! /* 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;
Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c (revision 133653)
--- gcc/fortran/trans-array.c (working copy)
*************** gfc_conv_loop_setup (gfc_loopinfo * loop
*** 3505,3511 ****
size = 1 - lbound;
a.ubound[n] = specified_upper_bound;
a.stride[n] = stride;
! size = ubound + size; //size = ubound + 1 - lbound
stride = stride * size;
}
return (stride);
--- 3505,3511 ----
size = 1 - lbound;
a.ubound[n] = specified_upper_bound;
a.stride[n] = stride;
! size = siz >= 0 ? ubound + size : 0; //size = ubound + 1 - lbound
stride = stride * size;
}
return (stride);
*************** gfc_array_init_size (tree descriptor, in
*** 3605,3610 ****
--- 3605,3613 ----
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);
Index: gcc/testsuite/gfortran.dg/allocate_zerosize_3.f
===================================================================
*** gcc/testsuite/gfortran.dg/allocate_zerosize_3.f (revision 0)
--- gcc/testsuite/gfortran.dg/allocate_zerosize_3.f (revision 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 <dick.hendrickson@gmail.com>
+ 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
Index: gcc/testsuite/gfortran.dg/character_assign_1.f90
===================================================================
*** gcc/testsuite/gfortran.dg/character_assign_1.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/character_assign_1.f90 (revision 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 <dick.hendrickson@gmail.com>
+ !
+ 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" } }