Dear Paul, dear all,

Paul Richard Thomas wrote:
Please find attached a reworked version of the patch for this PR. [...]
In this version, the treatment of scalar and array components is cleanly
separated.

Bootstrapped and regtested on FC21/x86_64. OK for trunk?

Looks good to me. Thanks for the patch.

 * * *

However, as follow up, one should check also the initialization of a (polymorphic) pointer component. Quoting the standard:

"For a pointer component, the corresponding component-data-source shall be an allowable data-target or proctarget for such a pointer in a pointer assignment statement (7.2.2). If the component data source is a pointer, the association of the component is that of the pointer; otherwise, the component is pointer associated with the component data source."

Thus, one should check CLASS => CLASS and CLASS <-> TYPE.

 * * *

And, finally, I wonder whether we need to take care of:

type m
end type m
type t
  CLASS(m), allocatable :: caf[:]
end type t
type(t), save :: x = t(m())
end

We probably do. I think that's valid as it is (kind of) statically allocated. That means we need to call for -fcoarray=lib the _gfortran_caf_register function for x%caf as constructor (in the C sense) - such that the address is registered at program start up. The (pointer) assignment of that address to x%caf can be done later, e.g. when the procedure (or __MAIN) is actually entered.

Tobias

2015-02-04  Paul Thomas  <pa...@gcc.gnu.org>

     PR fortran/640757
     * resolve.c (resolve_structure_cons): Obtain the rank of class
     components.
     * trans-expr.c (gfc_trans_alloc_subarray_assign): Do the
     assignment to allocatable class array components.
     (alloc_scalar_allocatable_for_subcomponent_assignment): If comp
     is a class component, allocate to the _data field.
     (gfc_trans_subcomponent_assign): If a class component with a
     derived type expression set the _vptr field and for array
     components, call gfc_trans_alloc_subarray_assign. For scalars,
     the assignment is performed here.

2015-02-04  Paul Thomas  <pa...@gcc.gnu.org>

     PR fortran/640757
     * gfortran.dg/type_to_class_2.f90: New test
     * gfortran.dg/type_to_class_3.f90: New test

On 3 February 2015 at 22:36, Paul Richard Thomas
<paul.richard.tho...@gmail.com> wrote:
Dear Dominique,

I have fixed all the problems except the last one. For that case, the
other brand gives
type_to_class_30.f90(19): error #7822: Variables containing ultimate
allocatable array components are forbidden from appearing directly in
input/output lists.
print *, TestReference([Test(99), Test(199)])
---------^
compilation aborted for type_to_class_30.f90 (code 1)

which seems to me to be correct. I'll see what I can do to fix it.

Thanks for the help

Paul

On 2 February 2015 at 17:53, Dominique Dhumieres <domi...@lps.ens.fr> wrote:
Dear Paul,

I have tested your patch at 
https://gcc.gnu.org/ml/fortran/2015-01/txtwnaoa1115V.txt
(the latest version) and I found that the test type_to_class_3.f03 is 
miscompiled
(FAIL) with -flto -O0 -m64 (this does not happens with -flto -O0 -m32 or with 
-Ox and
x!=0).

In addition, while the reduced test

   type :: Test
     integer :: i
   end type

   type :: TestReference
      class(Test), allocatable :: test(:)
   end type

   type(TestReference) :: testList
   type(test), allocatable :: x(:)

  allocate (testList%test(2), source = [Test(99), Test(199)]) ! Works, of course
  print *, size(testList%test)
  x = testList%test
  print *, x
end

gives what I expect, i.e.,

            2
           99         199

   type :: Test
     integer :: i
   end type

   type :: TestReference
      class(Test), allocatable :: test(:)
   end type

   type(TestReference) :: testList
   type(test), allocatable :: x(:)

   testList = TestReference([Test(99), Test(199)])  ! Gave: The rank of the 
element in the
                                                    ! structure constructor at 
(1) does not
                                                    ! match that of the 
component (1/0)
   print *, size(testList%test)
   x = testList%test
   print *, x
end

gives

            1
           99

Last problem I see,

print *, TestReference([Test(99), Test(199)])

gives the following ICE

f951: internal compiler error: Bad IO basetype (7)

type_to_class_3_red_2.f03:12:0:

    print *, TestReference([Test(99), Test(199)])


Cheers,

Dominique


--
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx



Reply via email to