In implementing Jason's suggested direction for 93933, the compiler exploded in a surprising way. Turns out an assert had been passing NULLS to comptypes, and therefore not checking what it intended.

Further comptypes, could silently accept such nulls under most circumstances.

Applying this this to fix the original assert, and assert nulls never make it to comptypes.

nathan
--
Nathan Sidwell
2020-02-27  Nathan Sidwell  <nat...@acm.org>

	* class.c (adjust_clone_args): Correct arg-checking assert.
	* typeck.c (comptypes): Assert not nulls.

diff --git i/gcc/cp/class.c w/gcc/cp/class.c
index 6b779da0495..b3787f75d7b 100644
--- i/gcc/cp/class.c
+++ w/gcc/cp/class.c
@@ -4900,8 +4900,8 @@ adjust_clone_args (tree decl)
 	      break;
 	    }
 
-	  gcc_assert (same_type_p (TREE_TYPE (decl_parms),
-				   TREE_TYPE (clone_parms)));
+	  gcc_checking_assert (same_type_p (TREE_VALUE (decl_parms),
+					    TREE_VALUE (clone_parms)));
 
 	  if (TREE_PURPOSE (decl_parms) && !TREE_PURPOSE (clone_parms))
 	    {
diff --git i/gcc/cp/typeck.c w/gcc/cp/typeck.c
index 103a1a439ec..42d0b47cf1b 100644
--- i/gcc/cp/typeck.c
+++ w/gcc/cp/typeck.c
@@ -1483,10 +1483,13 @@ structural_comptypes (tree t1, tree t2, int strict)
 bool
 comptypes (tree t1, tree t2, int strict)
 {
+  gcc_checking_assert (t1 && t2);
+
   if (strict == COMPARE_STRICT && comparing_specializations
       && (t1 != TYPE_CANONICAL (t1) || t2 != TYPE_CANONICAL (t2)))
     /* If comparing_specializations, treat dependent aliases as distinct.  */
     strict = COMPARE_STRUCTURAL;
+
   if (strict == COMPARE_STRICT)
     {
       if (t1 == t2)

Reply via email to