diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2018-12-24 12:12:42 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2018-12-24 11:12:42 +0000 |
commit | d840d7a2bbbfd97d054baa7462ada09215d93974 (patch) | |
tree | cab919fda937ce1b1f3730f8c18624be83205c8f /gcc/lto | |
parent | c23f39f8481305a53216bf0f4b8b33e637157387 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/lto')
-rw-r--r-- | gcc/lto/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/lto/lto-symtab.c | 19 |
2 files changed, 20 insertions, 4 deletions
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, |