diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ipa-devirt.c | 6 | ||||
-rw-r--r-- | gcc/ipa-utils.h | 1 | ||||
-rw-r--r-- | gcc/lto/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/lto/lto-symtab.c | 19 |
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, |