Fix broken type comparison assert
authorNathan Sidwell <nathan@acm.org>
Thu, 27 Feb 2020 14:34:23 +0000 (06:34 -0800)
committerNathan Sidwell <nathan@acm.org>
Thu, 27 Feb 2020 14:34:23 +0000 (06:34 -0800)
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.

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

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/typeck.c

index b2d952d822014ff7cedf2648a68227ea3161f172..5e9eeec17ee90cdd3c6dcaf920e40150b6bd5469 100644 (file)
@@ -1,3 +1,8 @@
+2020-02-27  Nathan Sidwell  <nathan@acm.org>
+
+       * class.c (adjust_clone_args): Correct arg-checking assert.
+       * typeck.c (comptypes): Assert not nulls.
+
 2020-02-26  Marek Polacek  <polacek@redhat.com>
 
        PR c++/93789 - ICE with invalid array bounds.
index 6b779da0495381271c091dfc502b8fa2ba0655ed..b3787f75d7b6aeab4cbc1f3ced917008b7f8794f 100644 (file)
@@ -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))
            {
index 103a1a439ecfb9def0eed20e416eec386475edf0..42d0b47cf1bf97b038364537cb7a658b5f663979 100644 (file)
@@ -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)