Hi Harald, sorry for being way behind my review duties :-(
On 10.06.21 20:52, Harald Anlauf via Fortran wrote:
+static bool +substring_has_constant_len (gfc_expr *e) +{ + ptrdiff_t istart, iend; + size_t length; + bool equal_length = false; + + if (e->ts.type != BT_CHARACTER + || !e->ref + || e->ref->type != REF_SUBSTRING
Is there a reason why you do not handle: type t character(len=5) :: str1 character(len=:), allocatable :: str2 end type type(t) :: x allocate(x%str2, source="abd") if (len (x%str)) /= 1) ... if (len (x%str2(1:2) /= 2) ... etc. Namely: Search the last_ref = expr->ref->next->next ...? and then check that lastref? * * * Slightly unrelated: I think the following does not violate F2018's R916 / C923 – but is rejected, namely: R916 type-param-inquiry is designator % type-param-name the latter is 'len' or 'kind' for intrinsic types. And: R901 designator is ... or substring But character(len=5) :: str print *, str(1:3)%len end fails with 2 | print *, str(1:3)%len | 1 Error: Syntax error in PRINT statement at (1) Assuming you don't want to handle it, can you open a new PR? Thanks! * * * That's in so far related to your patch as last_ref would then be the last ref before ref->next == NULL or before ref->next->type == REF_INQUIRY
+ istart = gfc_mpz_get_hwi (e->ref->u.ss.start->value.integer); + iend = gfc_mpz_get_hwi (e->ref->u.ss.end->value.integer); + length = gfc_mpz_get_hwi (e->ref->u.ss.length->length->value.integer); + + if (istart <= iend) + { + if (istart < 1) + { + gfc_error ("Substring start index (%ld) at %L below 1", + (long) istart, &e->ref->u.ss.start->where);
As mentioned by Bernhard, you could use HOST_WIDE_INT_PRINT_DEC. (It probably only matters on Windows which uses long == int = 32bit for strings longer than INT_MAX.) Thanks, Tobias ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf