From d840d7a2bbbfd97d054baa7462ada09215d93974 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 24 Dec 2018 12:12:42 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/ipa-devirt.c | 6 ++++++ gcc/ipa-utils.h | 1 + gcc/lto/ChangeLog | 5 +++++ gcc/lto/lto-symtab.c | 19 +++++++++++++++---- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 310bbec4f5b..77631ac9a21 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-12-24 Jan Hubicka + + * 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 * configure.ac (dwarf2_debug_line): Check for the debug_line diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index ac907aa5fd2..0f42d124fe3 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 371b2fbdb98..b58693528d8 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 7b9846cd8f6..ca2f01fed35 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,8 @@ +2018-12-24 Jan Hubicka + + * 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 Minimize clone counter memory usage in LTO. diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index d018a16bd42..6b981d403ed 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, -- 2.30.2