aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2018-12-24 12:12:42 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2018-12-24 11:12:42 +0000
commitd840d7a2bbbfd97d054baa7462ada09215d93974 (patch)
treecab919fda937ce1b1f3730f8c18624be83205c8f
parentc23f39f8481305a53216bf0f4b8b33e637157387 (diff)
downloadgcc-d840d7a2bbbfd97d054baa7462ada09215d93974.zip
gcc-d840d7a2bbbfd97d054baa7462ada09215d93974.tar.gz
gcc-d840d7a2bbbfd97d054baa7462ada09215d93974.tar.bz2
lto-symtab.c (lto_symtab_merge_decls_2): Do not report ODR violations for method whose basetype was already reported.
* lto-symtab.c (lto_symtab_merge_decls_2): Do not report ODR violations for method whose basetype was already reported. * ipa-devirt.c (odr_type_violation_reported_p): New. * ipa-utils.h (odr_type_violation_reported_p): Declare. From-SVN: r267397
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/ipa-devirt.c6
-rw-r--r--gcc/ipa-utils.h1
-rw-r--r--gcc/lto/ChangeLog5
-rw-r--r--gcc/lto/lto-symtab.c19
5 files changed, 34 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 310bbec..77631ac 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-12-24 Jan Hubicka <hubicka@ucw.cz>
+
+ * lto-symtab.c (lto_symtab_merge_decls_2): Do not report ODR violations
+ for method whose basetype was already reported.
+ * ipa-devirt.c (odr_type_violation_reported_p): New.
+ * ipa-utils.h (odr_type_violation_reported_p): Declare.
+
2018-12-24 Iain Sandoe <iain@sandoe.co.uk>
* configure.ac (dwarf2_debug_line): Check for the debug_line
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index ac907aa..0f42d12 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -2152,6 +2152,12 @@ get_odr_type (tree type, bool insert)
return val;
}
+bool
+odr_type_violation_reported_p (tree type)
+{
+ return get_odr_type (type, false)->odr_violated;
+}
+
/* Add TYPE od ODR type hash. */
void
diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h
index 371b2fb..b586935 100644
--- a/gcc/ipa-utils.h
+++ b/gcc/ipa-utils.h
@@ -90,6 +90,7 @@ void warn_types_mismatch (tree t1, tree t2, location_t loc1 = UNKNOWN_LOCATION,
location_t loc2 = UNKNOWN_LOCATION);
bool odr_or_derived_type_p (const_tree t);
bool odr_types_equivalent_p (tree type1, tree type2);
+bool odr_type_violation_reported_p (tree type);
/* Return vector containing possible targets of polymorphic call E.
If COMPLETEP is non-NULL, store true if the list is complete.
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 7b9846c..ca2f01f 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,8 @@
+2018-12-24 Jan Hubicka <hubicka@ucw.cz>
+
+ * lto-symtab.c (lto_symtab_merge_decls_2): Do not report ODR violations
+ for method whose basetype was already reported.
+
2018-11-30 Michael Ploujnikov <michael.ploujnikov@oracle.com>
Minimize clone counter memory usage in LTO.
diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c
index d018a16..6b981d4 100644
--- a/gcc/lto/lto-symtab.c
+++ b/gcc/lto/lto-symtab.c
@@ -697,10 +697,21 @@ lto_symtab_merge_decls_2 (symtab_node *first, bool diagnosed_p)
{
bool diag = false;
if (level & 2)
- diag = warning_at (DECL_SOURCE_LOCATION (decl),
- OPT_Wodr,
- "%qD violates the C++ One Definition Rule",
- decl);
+ {
+ /* Silence warning for method and variables which belong
+ to types which already have ODR violation reported. Complaining
+ once is enough. */
+ if (TREE_CODE (decl) != FUNCTION_DECL
+ || TREE_CODE (TREE_TYPE (decl)) != METHOD_TYPE
+ || !TYPE_METHOD_BASETYPE (TREE_TYPE (decl))
+ || !odr_type_p (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)))
+ || !odr_type_violation_reported_p
+ (TYPE_METHOD_BASETYPE (TREE_TYPE (decl))))
+ diag = warning_at (DECL_SOURCE_LOCATION (decl),
+ OPT_Wodr,
+ "%qD violates the C++ One Definition Rule",
+ decl);
+ }
if (!diag && (level & 1))
diag = warning_at (DECL_SOURCE_LOCATION (decl),
OPT_Wlto_type_mismatch,