[Bug lto/87754] [9 regression] ICE in odr_types_equivalent_p, at ipa-devirt.c:1250
hubicka at ucw dot cz
gcc-bugzilla@gcc.gnu.org
Fri Oct 26 07:46:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87754
--- Comment #6 from Jan Hubicka <hubicka at ucw dot cz> ---
Hi,
this patch fixes the ICE as well as the template. I will commit it after LTO
bootstrap converges.
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/ldr-1_0.C: Fix template.
* g++.dg/lto/ldr-1_1.C: Fix template.
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)
{
More information about the Gcc-bugs
mailing list