diff mbox series

Fix failure with the odr-1.C test

Message ID 20181026074652.GE42273@kam.mff.cuni.cz
State New
Headers show
Series Fix failure with the odr-1.C test | expand

Commit Message

Jan Hubicka Oct. 26, 2018, 7:46 a.m. UTC
Hi,
this patch fixes issues with the odr test I made yesterday.  One problem is that
I got the template wrong which made dg to crash and I did not notice it fails.
Other problem is that it still trips an sanity check in ipa-devirt.  This is fixed
now. It is bit surprising that one can make C++ non-anonymous type that uses anonymous
type inside and get to warning at all.

Bootstrapped/regtested x86_64-linux, re-running with lto-bootstrap.

Honza

	* ipa-devirt.c (odr_subtypes_equivalent_p): Fix recursion.
	(warn_types_mismatch): Fix walk of DECL_NAME.
	(odr_types_equivalent_p): Fix overactive assert.
	* lto/lto-symtab.c (lto_symtab_merge_decls_2): Fix extra space.

	* g++.dg/lto/odr-1_0.C: Fix template.
	* g++.dg/lto/odr-1_1.C: Fix template.

Comments

Bernhard Reutner-Fischer Oct. 26, 2018, 4:41 p.m. UTC | #1
On 26 October 2018 09:46:52 CEST, Jan Hubicka <hubicka@ucw.cz> wrote:
>Hi,

>@@ -1138,7 +1139,7 @@ warn_types_mismatch (tree t1, tree t2, l
>       if (TREE_CODE (n1) == TYPE_DECL)
> 	n1 = DECL_NAME (n1);
>       if (TREE_CODE (n2) == TYPE_DECL)
>-	n1 = DECL_NAME (n2);
>+	n2 = DECL_NAME (n2);
> /* Most of the time, the type names will match, do not be unnecesarily
>          verbose.  */


You fixed it here, so never mind, sorry..
diff mbox series

Patch

Index: ipa-devirt.c
===================================================================
--- ipa-devirt.c	(revision 265519)
+++ ipa-devirt.c	(working copy)
@@ -719,9 +719,10 @@  odr_subtypes_equivalent_p (tree t1, tree
     }
   if (visited->add (pair))
     return true;
-  if (odr_types_equivalent_p (TYPE_MAIN_VARIANT (t1), TYPE_MAIN_VARIANT (t2),
-			      false, NULL, visited, loc1, loc2)
-      && !type_variants_equivalent_p (t1, t2, warn, warned))
+  if (!odr_types_equivalent_p (TYPE_MAIN_VARIANT (t1), TYPE_MAIN_VARIANT (t2),
+			      false, NULL, visited, loc1, loc2))
+    return false;
+  if (!type_variants_equivalent_p (t1, t2, warn, warned))
     return false;
   return true;
 }
@@ -1138,7 +1139,7 @@  warn_types_mismatch (tree t1, tree t2, l
       if (TREE_CODE (n1) == TYPE_DECL)
 	n1 = DECL_NAME (n1);
       if (TREE_CODE (n2) == TYPE_DECL)
-	n1 = DECL_NAME (n2);
+	n2 = DECL_NAME (n2);
       /* Most of the time, the type names will match, do not be unnecesarily
          verbose.  */
       if (IDENTIFIER_POINTER (n1) != IDENTIFIER_POINTER (n2))
@@ -1292,10 +1293,6 @@  odr_types_equivalent_p (tree t1, tree t2
   /* Check first for the obvious case of pointer identity.  */
   if (t1 == t2)
     return true;
-  gcc_assert (!type_with_linkage_p (TYPE_MAIN_VARIANT (t1))
-	      || !type_in_anonymous_namespace_p (TYPE_MAIN_VARIANT (t1)));
-  gcc_assert (!type_with_linkage_p (TYPE_MAIN_VARIANT (t2))
-	      || !type_in_anonymous_namespace_p (TYPE_MAIN_VARIANT (t2)));
 
   /* Can't be the same type if the types don't have the same code.  */
   if (TREE_CODE (t1) != TREE_CODE (t2))
Index: lto/lto-symtab.c
===================================================================
--- lto/lto-symtab.c	(revision 265517)
+++ lto/lto-symtab.c	(working copy)
@@ -698,7 +698,7 @@  lto_symtab_merge_decls_2 (symtab_node *f
 	  if (level & 2)
 	    diag = warning_at (DECL_SOURCE_LOCATION (decl),
 			       OPT_Wodr,
-			       "%qD violates the C++ One Definition Rule ",
+			       "%qD violates the C++ One Definition Rule",
 			       decl);
 	  if (!diag && (level & 1))
 	    diag = warning_at (DECL_SOURCE_LOCATION (decl),
Index: testsuite/g++.dg/lto/odr-1_0.C
===================================================================
--- testsuite/g++.dg/lto/odr-1_0.C	(revision 265517)
+++ testsuite/g++.dg/lto/odr-1_0.C	(working copy)
@@ -3,6 +3,6 @@ 
 struct a { // { dg-lto-warning "8: type 'struct a' violates the C\\+\\+ One Definition Rule" }
   struct b *ptr; // { dg-lto-message "13: the first difference of corresponding definitions is field 'ptr'" }
 };
-void test(struct a *) // { dg-lto-warning "6: warning: 'test' violates the C++ One Definition Rule" }
+void test(struct a *)
 {
 }
Index: testsuite/g++.dg/lto/odr-1_1.C
===================================================================
--- testsuite/g++.dg/lto/odr-1_1.C	(revision 265517)
+++ testsuite/g++.dg/lto/odr-1_1.C	(working copy)
@@ -4,7 +4,7 @@  namespace {
 struct a {
   struct b *ptr;
 };
-void test(struct a *);
+void test(struct a *); // { dg-lto-warning "6: 'test' violates the C\\+\\+ One Definition Rule" }
 int
 main(void)
 {