Le 29/01/2024 à 21:50, Harald Anlauf a écrit :
Am 29.01.24 um 18:25 schrieb Harald Anlauf:
I was talking about the generated format strings of runtime error
messages.

program p
   implicit none
   type t
      real :: zzz(10) = 42
   end type t
   class(t), allocatable :: xx(:)
   integer :: j
   j = 0
   allocate (t :: xx(1))
   print *, xx(1)% zzz(j)
end

This is generating the following error at runtime since at least gcc-7:

Fortran runtime error: Index '0' of dimension 1 of array 'xx%_data%zzz'
below lower bound of 1

Of course this is easily suppressed by:

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 1e0d698a949..fa0e00a28a6 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -4054,7 +4054,8 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref *
ar, gfc_expr *expr,
      {
        if (ref->type == REF_ARRAY && &ref->u.ar == ar)
          break;
-      if (ref->type == REF_COMPONENT)
+      if (ref->type == REF_COMPONENT
+          && strcmp (ref->u.c.component->name, "_data") != 0)
          {
            strcat (var_name, "%%");
            strcat (var_name, ref->u.c.component->name);


I have been contemplating the generation the full chain of references as
suggested by Mikael and supported by NAG.


To be clear, my suggestion was to have the question marks (or dashes, dots, stars, whatever) literally in the array reference, without the actual values of the array indexes.

Another (easier) way to clarify the data reference would be rephrasing the message so that the array part is separate from the scalar part, like so (there are too many 'of', but I lack inspiration):
Index '0' of dimension 1 of component 'zz' of element from 'x1%vv'
below lower bound of 1


The main issue is: how do I easily generate that call?

gfc_trans_runtime_check is a vararg function, but what I would rather
have is a function that takes either a (chained?) list of trees or
an array of trees holding the (co-)indices of the reference.

Is there an example, or a recommendation which variant to prefer?

None that I know.
For a scalarized expression, the values are present (among others) in the gfc_loopinfo::ss linked list, maybe just use that? In any case, I agree it would be nice to have, but it would probably be a non-negligible amount of new error-prone code; I would rather not attempt this during the stage4 stabilization phase as we are currently.

Reply via email to