Message ID | 4D566D1A.5060404@net-b.de |
---|---|
State | New |
Headers | show |
On 02/12/2011 03:20 AM, Tobias Burnus wrote: > The issue was found by Michael when working on the "restrict" issue of DT; see > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45586#c40 > > Without the patch, not only his draft patch fails, but one also gets - as Mikael > pointed out - strange dumps. For extends_1.f03 the result without patch is: > > new_person->service.education.person.service.education.person.education.person.person.ss > > = *ss; > > with the patch the result is the more reasonable: > > new_person->service.education.person.ss = *ss; > > Build and regtested on x86-64-linux. > OK for the trunk? > > Tobias > > PS: Michael plans to submit his restrict patch (comment 35) after this patch has > been committed; the draft patch has been already pre-reviewed by Mikael (comment > 38). OK, thanks for patch. Jerry
On Saturday 12 February 2011 12:20:58 Tobias Burnus wrote: > The issue was found by Michael when working on the "restrict" issue of > DT; see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45586#c40 > > Without the patch, not only his draft patch fails, but one also gets - > as Mikael pointed out - strange dumps. For extends_1.f03 the result > without patch is: > > new_person->service.education.person.service.education.person.education.per > son.person.ss = *ss; > > with the patch the result is the more reasonable: > > new_person->service.education.person.ss = *ss; > > Build and regtested on x86-64-linux. > OK for the trunk? > > Tobias > > PS: Michael plans to submit his restrict patch (comment 35) after this > patch has been committed; the draft patch has been already pre-reviewed > by Mikael (comment 38). Hello, I'm going to commit the attached testcase. Mikael 2011-02-12 Mikael Morin <mikael.morin@sfr.fr> PR fortran/45586 * gfortran.dg/extends_11.f03: New. ! { dg-do compile } ! { dg-options "-fdump-tree-original" } ! ! PR fortran/45586 ! Test that access to inherited components are properly generated ! ! Stripped down from extends_1.f03 ! type :: person integer :: ss = 1 end type person type, extends(person) :: education integer :: attainment = 0 end type education type, extends(education) :: service integer :: personnel_number = 0 end type service type, extends(service) :: person_record type (person_record), pointer :: supervisor => NULL () end type person_record type(person_record) :: recruit ! Check that references by ultimate component and by parent type work ! All the following component access are equivalent recruit%ss = 2 recruit%person%ss = 3 recruit%education%ss = 4 recruit%education%person%ss = 5 recruit%service%ss = 6 recruit%service%person%ss = 7 recruit%service%education%ss = 8 recruit%service%education%person%ss = 9 end ! { dg-final { scan-tree-dump-times " +recruit\\.service\\.education\\.person\\.ss =" 8 "original"} } ! { dg-final { cleanup-tree-dump "original" } }
2011-02-12 Michael Matz <matz@suse.de> Janus Weil <janus@gcc.gnu.org> Tobias Burnus <burnus@net-b.de> PR fortran/45586 * trans-expr.c (conv_parent_component_references): Avoid unintendent skipping of parent compounds. diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index f19c015..b7d7ed9 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -538,6 +538,11 @@ conv_parent_component_references (gfc_se * se, gfc_ref * ref) dt = ref->u.c.sym; c = ref->u.c.component; + /* Return if the component is not in the parent type. */ + for (cmp = dt->components; cmp; cmp = cmp->next) + if (strcmp (c->name, cmp->name) == 0) + return; + /* Build a gfc_ref to recursively call gfc_conv_component_ref. */ parent.type = REF_COMPONENT; parent.next = NULL; @@ -547,23 +552,11 @@ conv_parent_component_references (gfc_se * se, gfc_ref * ref) if (dt->backend_decl == NULL) gfc_get_derived_type (dt); - if (dt->attr.extension && dt->components) - { - if (dt->attr.is_class) - cmp = dt->components; - else - cmp = dt->components->next; - /* Return if the component is not in the parent type. */ - for (; cmp; cmp = cmp->next) - if (strcmp (c->name, cmp->name) == 0) - return; - - /* Otherwise build the reference and call self. */ - gfc_conv_component_ref (se, &parent); - parent.u.c.sym = dt->components->ts.u.derived; - parent.u.c.component = c; - conv_parent_component_references (se, &parent); - } + /* Build the reference and call self. */ + gfc_conv_component_ref (se, &parent); + parent.u.c.sym = dt->components->ts.u.derived; + parent.u.c.component = c; + conv_parent_component_references (se, &parent); } /* Return the contents of a variable. Also handles reference/pointer