On November 5, 2018 5:11:09 PM GMT+01:00, Jan Hubicka <hubi...@ucw.cz> wrote: >> Hi, >> this is patch I ended up testing. It ensures that canonical types of >> copies I create are same as of originals C++ FE has its own refernece >piece of mail got lost rendering the paragraph unreadable. I wanted to >say: > >This is patch I ended up testing. It ensures that canonical types of >copies I create are same as of originals. It however ICEs building >auto-profile.c because C++ FE has its own reference type construction >(cp_build_reference_type) and it creates additional pointer types with >TYPE_REF_IS_RVALUE set and it has different TYPE_CANONICAL.
Hmm. I guess we need to fix that, otherwise alias will be broken (or you need to resort to a FE specific routine for pointer building). Richard. >> Obviously we do not see this in middle-end and we end up merging the >> types despite fact they have different TYPE_CANONICAL. >> I guess I can immitate the behaviour in fld_incomplete_type_of by >> implementing my own variant of build_pointer_type that also matches >> TYPE_CANONICAL of the pointer it creates. I wonder if there are >better >> solutions? >> >> Honza >> >> Index: tree.c >> =================================================================== >> --- tree.c (revision 265807) >> +++ tree.c (working copy) >> @@ -5118,6 +5118,7 @@ fld_type_variant (tree first, tree t, st >> TYPE_ADDR_SPACE (v) = TYPE_ADDR_SPACE (t); >> TYPE_NAME (v) = TYPE_NAME (t); >> TYPE_ATTRIBUTES (v) = TYPE_ATTRIBUTES (t); >> + TYPE_CANONICAL (v) = TYPE_CANONICAL (t); >> add_tree_to_fld_list (v, fld); >> return v; >> } >> @@ -5146,6 +5147,10 @@ fld_incomplete_type_of (tree t, struct f >> else >> first = build_reference_type_for_mode (t2, TYPE_MODE (t), >> TYPE_REF_CAN_ALIAS_ALL (t)); >> + gcc_assert (TYPE_CANONICAL (t2) != t2 >> + && TYPE_CANONICAL (t2) == TYPE_CANONICAL (TREE_TYPE (t)) >> + && TYPE_CANONICAL (first) >> + == TYPE_CANONICAL (TYPE_MAIN_VARIANT (t))); >> add_tree_to_fld_list (first, fld); >> return fld_type_variant (first, t, fld); >> } >> @@ -5169,6 +5174,7 @@ fld_incomplete_type_of (tree t, struct f >> SET_TYPE_MODE (copy, VOIDmode); >> SET_TYPE_ALIGN (copy, BITS_PER_UNIT); >> TYPE_SIZE_UNIT (copy) = NULL; >> + TYPE_CANONICAL (copy) = TYPE_CANONICAL (t); >> if (AGGREGATE_TYPE_P (t)) >> { >> TYPE_FIELDS (copy) = NULL;