Hi. This is Honza's ODR warning patch that I've just tested. He approved that. Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
Martin gcc/ChangeLog: 2018-04-16 Jan Hubicka <j...@suse.cz> PR lto/85405 * ipa-devirt.c (odr_types_equivalent_p): Handle bit fields. gcc/testsuite/ChangeLog: 2018-04-16 Martin Liska <mli...@suse.cz> PR lto/85405 * g++.dg/lto/pr85405_0.C: New test. * g++.dg/lto/pr85405_1.C: New test. --- gcc/ipa-devirt.c | 11 +++++++++-- gcc/testsuite/g++.dg/lto/pr85405_0.C | 18 ++++++++++++++++++ gcc/testsuite/g++.dg/lto/pr85405_1.C | 9 +++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lto/pr85405_0.C create mode 100644 gcc/testsuite/g++.dg/lto/pr85405_1.C
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index fa9380cce80..5da0f72d14f 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -1587,8 +1587,15 @@ odr_types_equivalent_p (tree t1, tree t2, bool warn, bool *warned, "in another translation unit")); return false; } - gcc_assert (DECL_NONADDRESSABLE_P (f1) - == DECL_NONADDRESSABLE_P (f2)); + if (DECL_BIT_FIELD (f1) != DECL_BIT_FIELD (f2)) + { + warn_odr (t1, t2, f1, f2, warn, warned, + G_ ("one field is bitfield while other is not ")); + return false; + } + else + gcc_assert (DECL_NONADDRESSABLE_P (f1) + == DECL_NONADDRESSABLE_P (f2)); } /* If one aggregate has more fields than the other, they diff --git a/gcc/testsuite/g++.dg/lto/pr85405_0.C b/gcc/testsuite/g++.dg/lto/pr85405_0.C new file mode 100644 index 00000000000..1a41d81099c --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr85405_0.C @@ -0,0 +1,18 @@ +// { dg-lto-do link } +// { dg-lto-options {{-fPIC -shared -flto}} } + +class VclReferenceBase { // { dg-lto-warning "7: type 'struct VclReferenceBase' violates the C\\+\\+ One Definition Rule" } + int mnRefCnt; + bool mbDisposed : 1; + virtual ~VclReferenceBase(); +}; +class a; +class b { + a &e; + bool c(); +}; +class B { + VclReferenceBase d; +}; +class a : B {}; +bool b::c() { return false; } diff --git a/gcc/testsuite/g++.dg/lto/pr85405_1.C b/gcc/testsuite/g++.dg/lto/pr85405_1.C new file mode 100644 index 00000000000..78606185624 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr85405_1.C @@ -0,0 +1,9 @@ +class VclReferenceBase { + int mnRefCnt; + bool mbDisposed; + +protected: + virtual ~VclReferenceBase(); +}; +class : VclReferenceBase { +} a;