Dear Tobias,

Nit pick: I find that '(\\(integer\\(kind=8\\)\\) )?'  is easier to parse
than '(\\(integer\\(kind=8\\)\\) |)' (a matter of taste and I won't argue
about it).

> > /opt/gcc/work/gcc/testsuite/gfortran.dg/class_48.f90: In function 
> > '__final_test2_T.2138.constprop.0':
> > /opt/gcc/work/gcc/testsuite/gfortran.dg/class_48.f90:39:0: warning: 
> > iteration 2147483648 invokes undefined behavior 
> > [-Waggressive-loop-optimizations]
> >       class(t), allocatable :: a
>   ^
> 
> I have not fully understood why this happens.  It seems to have something
> to do with cloning/const propagation.  Looking at the original dump, the
> optimized dump at -O0, -O2 and -O3 - and at the FE code -, I believe the
> generated code is correct.
> 
> The cloning propagates the rank == 1 into the cloned finalizer, which
> permits to drastically simplify the scalarizer.  That allows to remove
> one loop (the one which is warned about?)  and to simplify another loop
> into a single trip.
> 
> Thus, my working hypothesis is that either the warning is wrong or that
> something goes wrong with the loop optimization, triggering the warning.

>From the above, I am not sure if you see the warning. Do you see it?
If yes, what are you planning?

If I comment the lines

allocate (two%a)
!  one = two
!  if (.not.allocated (one%a)) call abort ()
!  if (allocated (one%a%x)) call abort ()

allocate (two%a%x(2))
two%a%x(:) = 7890
!  one = two
!  if (any (one%a%x /= 7890)) call abort ()

the test compiles without warning and runs without failure while compiling
the following reduced test

subroutine test2 ()
  type t
    integer, allocatable :: x(:)
  end type t

  type t2
    class(t), allocatable :: a
  end type t2

  type(t2) :: one, two

  allocate (two%a)
  one = two
end subroutine test2

call test2 ()
end

gives the warning. If I grep for 'final' in 
class_48_red.f90.165t.optimized I see

;; Function __final_test2_T (__final_test2_T.1908, funcdef_no=1, decl_uid=1908, 
symbol_order=0)
__final_test2_T (struct array7_t & restrict array, integer(kind=8) byte_stride, 
logical(kind=1) fini_coarray)
  static struct __vtype_test2_T __vtab_test2_T = {._hash=84164405, ._size=48, 
._extends=0B, ._def_init=&__def_init_test2_T, ._copy=__copy_test2_T, 
._final=__final_test2_T};
  __final_test2_T (&desc.7, _25, 1);
  __final_test2_T (&desc.8, _25, 1);

with -O2 and -m64, but

;; Function __final_test2_T.1854.constprop.0 (__final_test2_T.1854.constprop.0, 
funcdef_no=5, decl_uid=2159, symbol_order=16)
__final_test2_T.1854.constprop.0 (struct array7_t & restrict array, 
integer(kind=4) byte_stride, logical(kind=1) fini_coarray)
  __final_test2_T.1854.constprop.0 (&desc.7, 24, 1);
  __final_test2_T.1854.constprop.0 (&desc.8, 24, 1);

with -O2 and -m32. With -O3 the last two lines of the above are no longer 
present with -m64, while there is no final with -m32.

Dominique


Reply via email to