On 11/25/2015 02:10 PM, Jan Hubicka wrote:
The problem here is that we're trying to compare the TYPE_FIELDS of
two variants of an incomplete type, which doesn't make sense; we
shouldn't expect TYPE_FIELDS of an incomplete type to be meaningful.

Tested x86_64-pc-linux-gnu.  OK for trunk?

commit c6f5cd55d0bbebc2fa46628ebb8fdec2a44abf3a
Author: Jason Merrill <ja...@redhat.com>
Date:   Wed Nov 25 10:47:03 2015 -0500

        PR middle-end/66214

        * tree.c (gimple_canonical_types_compatible_p) [RECORD_TYPE]:
        Don't try to compare the fields of incomplete types.

This makes sense to me.  I would still add a check that incomplete types have to
TYPE_FIELDS during LTO so we are sure that all types are either completed or
have no fields at all once the frontends are done.

Like this?

commit f264166c7358de8eb1c499e2c0a80f8f7cf2d100
Author: Jason Merrill <ja...@redhat.com>
Date:   Wed Nov 25 17:05:47 2015 -0500

    assert

diff --git a/gcc/tree.c b/gcc/tree.c
index e918e1b..0108e80 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -13429,6 +13429,12 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2,
 	if (!COMPLETE_TYPE_P (t1) && !COMPLETE_TYPE_P (t2))
 	  return true;
 
+	/* In LTO, incomplete types should always have null TYPE_FIELDS.  */
+	if (in_lto_p)
+	  gcc_checking_assert
+	    ((COMPLETE_TYPE_P (t1) || TYPE_FIELDS (t1) == NULL_TREE)
+	     && (COMPLETE_TYPE_P (t2) || TYPE_FIELDS (t2) == NULL_TREE));
+
 	if (TYPE_REVERSE_STORAGE_ORDER (t1) != TYPE_REVERSE_STORAGE_ORDER (t2))
 	  return false;
 

Reply via email to