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