https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113207

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hubicka at gcc dot gnu.org

--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
#0  0x0000000001d381f4 in copy_node (node=<pointer_type 0x7ffff6fbe5e8>)
    at /space/rguenther/src/gcc/gcc/tree.cc:1361
#1  0x0000000001d4a2e5 in build_distinct_type_copy (
    type=<pointer_type 0x7ffff6fbe5e8>)
    at /space/rguenther/src/gcc/gcc/tree.cc:5765
#2  0x0000000001d4a45e in build_variant_type_copy (
    type=<pointer_type 0x7ffff6fbe5e8>)
    at /space/rguenther/src/gcc/gcc/tree.cc:5799
#3  0x0000000003423b7a in (anonymous namespace)::fld_type_variant (
    first=<pointer_type 0x7ffff6fbe5e8>, 
    t=<pointer_type 0x7ffff6fbe888 cl_object>, fld=0x7fffffffda90, 
    inner_type=<tree 0x0>)
    at /space/rguenther/src/gcc/gcc/ipa-free-lang-data.cc:154
#4  0x0000000003424656 in (anonymous namespace)::fld_incomplete_type_of (
    t=<pointer_type 0x7ffff6fbe888 cl_object>, fld=0x7fffffffda90)
    at /space/rguenther/src/gcc/gcc/ipa-free-lang-data.cc:261
#5  0x0000000003424e38 in (anonymous namespace)::fld_simplified_type (
    t=<pointer_type 0x7ffff6fbe888 cl_object>, fld=0x7fffffffda90)
    at /space/rguenther/src/gcc/gcc/ipa-free-lang-data.cc:344
#6  0x00000000034253d2 in (anonymous namespace)::free_lang_data_in_type (
    type=<function_type 0x7ffff6fbe930>, fld=0x7fffffffda90)
    at /space/rguenther/src/gcc/gcc/ipa-free-lang-data.cc:431

builts the two distinct pointers.  It goes all good up to the
fld_type_variant call where we fail to match up with
fld_simplified_type_name but then we build another variant through
the regular build_qualified_type in

437           for (tree p = TYPE_ARG_TYPES (type); p; p = TREE_CHAIN (p))
438             {
439               TREE_VALUE (p) = fld_simplified_type (TREE_VALUE (p), fld);
440               tree arg_type = TREE_VALUE (p);
441
442               if (TYPE_READONLY (arg_type) || TYPE_VOLATILE (arg_type))
443                 {
444                   int quals = TYPE_QUALS (arg_type)
445                     & ~TYPE_QUAL_CONST
(gdb) 
446                     & ~TYPE_QUAL_VOLATILE;
447                   TREE_VALUE (p) = build_qualified_type (arg_type, quals);

which we are able to pick up earlier before reaching the originally
built simplified type.

diff --git a/gcc/ipa-free-lang-data.cc b/gcc/ipa-free-lang-data.cc
index cb26e262f45..be96d2928d7 100644
--- a/gcc/ipa-free-lang-data.cc
+++ b/gcc/ipa-free-lang-data.cc
@@ -150,7 +150,12 @@ fld_type_variant (tree first, tree t, class
free_lang_data_d *fld,
     return t;
   for (tree v = first; v; v = TYPE_NEXT_VARIANT (v))
     if (fld_type_variant_equal_p (t, v, inner_type))
-      return v;
+      {
+       if (flag_checking)
+         for (tree v2 = TYPE_NEXT_VARIANT (v); v2; v2 = TYPE_NEXT_VARIANT
(v2))
+           gcc_assert (!fld_type_variant_equal_p (t, v2, inner_type));
+       return v;
+      }
   tree v = build_variant_type_copy (first);
   TYPE_READONLY (v) = TYPE_READONLY (t);
   TYPE_VOLATILE (v) = TYPE_VOLATILE (t);

shows this by ICEing there, finding two possible candidates.  I guess
we should never call build_qualified_type on a fld_simplified_type
type, or, we need to make sure fld_type_variant_equal_p also finds
regular qualified types.  The inconsistent differentiator here
seems to be fld_simplified_type_name.

I suspect the above checking would trip far more often than the old
failure mode.

Reply via email to