[Patch, fortran] PR 64757 - [5 Regression] ICE in fold_convert_loc, at fold-const.c:2353
Tobias Burnus
burnus@net-b.de
Wed Feb 4 21:18:00 GMT 2015
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 <pault@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 <pault@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.thomas@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 <dominiq@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
>
>
More information about the Gcc-patches
mailing list