This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch, fortran] PR35698 and PR35702


: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" } }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]