[PATCH] PR fortran/77505 -- Treat negative character length as LEN=0
Punnoose, Elizebeth
elizebeth.punnoose@hpe.com
Wed Nov 30 05:13:00 GMT 2016
Please excuse the messy formatting in my initial mail. Resending with proper formatting.
This patch checks for negative character length in the array constructor, and treats it as LEN=0.
A warning message is also printed if bounds checking is enabled.
Bootstrapped and regression tested the patch on x86_64-linux-gnu and aarch64-linux-gnu.
Index: ChangeLog
===================================================================
--- ChangeLog (revision 242906)
+++ ChangeLog (working copy)
@@ -1,3 +1,9 @@
+2016-11-30 Elizebeth Punnoose <elizebeth.punnoose@hpe.com>
+
+ PR fortran/77505
+ * trans-array.c (trans_array_constructor): Treat negative character
+ length as LEN=0.
+
2016-11-27 Paul Thomas <pault@gcc.gnu.org>
PR fortran/78474
Index: trans-array.c
===================================================================
--- trans-array.c (revision 242906)
+++ trans-array.c (working copy)
@@ -2226,6 +2226,8 @@ trans_array_constructor (gfc_ss * ss, lo
gfc_ss_info *ss_info;
gfc_expr *expr;
gfc_ss *s;
+ tree neg_len;
+ char *msg;
/* Save the old values for nested checking. */
old_first_len = first_len;
@@ -2271,6 +2273,28 @@ trans_array_constructor (gfc_ss * ss, lo
gfc_conv_expr_type (&length_se, expr->ts.u.cl->length,
gfc_charlen_type_node);
ss_info->string_length = length_se.expr;
+
+ /* Check if the character length is negative,
+ if so consider it as LEN=0. */
+ neg_len = fold_build2_loc (input_location, LT_EXPR,
+ boolean_type_node, ss_info->string_length,
+ build_int_cst (gfc_charlen_type_node, 0));
+ /* Print a warning if bounds checking is enabled. */
+ if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
+ {
+ msg = xasprintf ("Negative character length will be treated"
+ " as LEN=0");
+ gfc_trans_runtime_check (false, true, neg_len, &length_se.pre,
+ where, msg);
+ free (msg);
+ }
+ ss_info->string_length = fold_build3_loc (input_location, COND_EXPR,
+ gfc_charlen_type_node, neg_len,
+ build_int_cst (gfc_charlen_type_node, 0),
+ ss_info->string_length);
+ ss_info->string_length = gfc_evaluate_now (ss_info->string_length,
+ &length_se.pre);
+
gfc_add_block_to_block (&outer_loop->pre, &length_se.pre);
gfc_add_block_to_block (&outer_loop->post, &length_se.post);
}
Index: ChangeLog
===================================================================
--- ChangeLog (revision 242906)
+++ ChangeLog (working copy)
@@ -1,3 +1,9 @@
+2016-11-30 Elizebeth Punnoose <elizebeth.punnoose@hpe.com>
+
+ PR fortran/77505
+ * gfortran.dg/pr77505_1.f90: New test.
+ * gfortran.dg/pr77505_2.f90: New test.
+
2016-11-27 Paul Thomas <pault@gcc.gnu.org>
PR fortran/78474
Index: pr77505_1.f90
===================================================================
--- pr77505_1.f90 (nonexistent)
+++ pr77505_1.f90 (working copy)
@@ -0,0 +1,13 @@
+! { dg-do run }
+program rabbithole
+implicit none
+character(len=:),allocatable :: text_block(:) integer
+:: i integer :: ii
+character(len=10) :: cten='abcdefghij'
+character(len=20) :: ctwenty='abcdefghijabcdefghij'
+ii=-6
+text_block=[ character(len=ii) :: cten, ctwenty ] write(*,*)'WRITE IT'
+write(*,'(a)')(trim(text_block(i)),i=1,size(text_block))
+end program rabbithole
Index: pr77505_2.f90
===================================================================
--- pr77505_2.f90 (nonexistent)
+++ pr77505_2.f90 (working copy)
@@ -0,0 +1,14 @@
+! { dg-options "-fcheck=bounds" }
+! { dg-do run }
+program rabbithole
+implicit none
+character(len=:),allocatable :: text_block(:)
+integer :: i
+integer :: ii
+character(len=10) :: cten='abcdefghij'
+character(len=20) :: ctwenty='abcdefghijabcdefghij'
+ii=-6
+text_block=[ character(len=ii) :: cten, ctwenty ]
+write(*,*)'WRITE IT'
+write(*,'(a)')(trim(text_block(i)),i=1,size(text_block))
+end program rabbithole
Thanks,
Elizebeth
More information about the Fortran
mailing list