From: George Helffrich Date: Sat, 22 Sep 2001 10:35:05 +0000 (+0900) Subject: com.c (ffecom_subscript_check_): Loosen subscript checking rules for character strings... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2bc21ba588678796be5aa4981d6e3ebdabc1f6e8;p=gcc.git com.c (ffecom_subscript_check_): Loosen subscript checking rules for character strings... Thu Sep 20 15:05:20 JST 2001 George Helffrich * com.c (ffecom_subscript_check_): Loosen subscript checking rules for character strings, to permit substring expressions like string(1:0). * news.texi: Document this as a new feature. From-SVN: r45747 --- diff --git a/gcc/f/ChangeLog b/gcc/f/ChangeLog index 666001dff23..df0595c8440 100644 --- a/gcc/f/ChangeLog +++ b/gcc/f/ChangeLog @@ -1,3 +1,10 @@ +Thu Sep 20 15:05:20 JST 2001 George Helffrich + + * com.c (ffecom_subscript_check_): Loosen subscript checking rules + for character strings, to permit substring expressions like + string(1:0). + * news.texi: Document this as a new feature. + Thu Sep 13 10:33:27 2001 Kaveh R. Ghazi * bad.c (ffebad_finish): Const-ification and/or static-ization. diff --git a/gcc/f/com.c b/gcc/f/com.c index bdf3e7cee76..8d9ad8c217a 100644 --- a/gcc/f/com.c +++ b/gcc/f/com.c @@ -671,16 +671,46 @@ ffecom_subscript_check_ (tree array, tree element, int dim, int total_dims, } element = ffecom_save_tree (element); - cond = ffecom_2 (LE_EXPR, integer_type_node, - low, - element); - if (high) + if (total_dims == 0) { - cond = ffecom_2 (TRUTH_ANDIF_EXPR, integer_type_node, - cond, - ffecom_2 (LE_EXPR, integer_type_node, - element, - high)); + /* Special handling for substring range checks. Fortran allows the + end subscript < begin subscript, which means that expressions like + string(1:0) are valid (and yield a null string). In view of this, + enforce two simpler conditions: + 1) element<=high for end-substring; + 2) element>=low for start-substring. + Run-time character movement will enforce remaining conditions. + + More complicated checks would be better, but present structure only + provides one index element at a time, so it is not possible to + enforce a check of both i and j in string(i:j). If it were, the + complete set of rules would read, + if ( ((j