This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Support bitfields in Wodr machinery (PR lto/85405).
- From: Martin Liška <mliska at suse dot cz>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org, Jan Hubicka <hubicka at ucw dot cz>
- Date: Tue, 17 Apr 2018 10:17:15 +0200
- Subject: Re: [PATCH] Support bitfields in Wodr machinery (PR lto/85405).
- References: <7e3fc57b-c574-f7d4-e49e-6dba66bceff7@suse.cz> <20180417065817.GU8577@tucnak>
On 04/17/2018 08:58 AM, Jakub Jelinek wrote:
> On Tue, Apr 17, 2018 at 07:39:20AM +0200, Martin Liška wrote:
>> + 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 "));
>
> I think all the G_ uses don't put a space in between G_ and (
> Also, please avoid the trailing space in the message.
Sure. I see other format violations, should I fix that in follow up patch:
gcc/c-family/c-warn.c: ? G_ ("floating point overflow in expression %qE "
gcc/c-family/c-warn.c: : G_ ("floating point overflow in expression of type %qT "
gcc/gimple-ssa-sprintf.c: ? G_ ("%<%.*s%> directive output between %wu and "
gcc/gimple-ssa-sprintf.c: : G_ ("%<%.*s%> directive output between %wu and "
gcc/testsuite/gcc.dg/plugin/ggcplug.c: warning (0, G_ ("option '-fplugin-arg-%s-count-ggc-start=%s'"
gcc/testsuite/gcc.dg/plugin/ggcplug.c: warning (0, G_ ("option '-fplugin-arg-%s-count-ggc-end=%s'"
gcc/testsuite/gcc.dg/plugin/ggcplug.c: warning (0, G_ ("option '-fplugin-arg-%s-count-ggc-mark=%s'"
gcc/testsuite/gcc.dg/plugin/ggcplug.c: warning (0, G_ ("option '-fplugin-arg-%s-test-extra-root=%s'"
?
>
> Do you diagnose if both are bit-fields, but with different bitcount, e.g. if
> in your testcase you replace bool mbDisposed : 1; with int mbDisposed : 3;
> and bool mbDisposed; with int mbDisposed : 7; ?
Good point, I add a new test-case, done in patch.
Is it OK to install the patch?
Martin
>
>> + 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;
>>
>
> Jakub
>
>From 87380235f9b81bea4cf910e702192586c072ce93 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Tue, 17 Apr 2018 10:11:07 +0200
Subject: [PATCH] Fix coding style and add a new test-case (PR lto/85405).
gcc/ChangeLog:
2018-04-17 Martin Liska <mliska@suse.cz>
PR lto/85405
* ipa-devirt.c (odr_types_equivalent_p):
gcc/testsuite/ChangeLog:
2018-04-17 Martin Liska <mliska@suse.cz>
PR lto/85405
* g++.dg/lto/pr85405b_0.C: New test.
* g++.dg/lto/pr85405b_1.C: New test.
---
gcc/ipa-devirt.c | 2 +-
gcc/testsuite/g++.dg/lto/pr85405b_0.C | 18 ++++++++++++++++++
gcc/testsuite/g++.dg/lto/pr85405b_1.C | 9 +++++++++
3 files changed, 28 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/lto/pr85405b_0.C
create mode 100644 gcc/testsuite/g++.dg/lto/pr85405b_1.C
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index 85b8ef175f3..cc9b5e347e6 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -1599,7 +1599,7 @@ odr_types_equivalent_p (tree t1, tree t2, bool warn, bool *warned,
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 "));
+ G_("one field is bitfield while other is not"));
return false;
}
else
diff --git a/gcc/testsuite/g++.dg/lto/pr85405b_0.C b/gcc/testsuite/g++.dg/lto/pr85405b_0.C
new file mode 100644
index 00000000000..a692abb7715
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr85405b_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;
+ int mbDisposed : 3;
+ 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/pr85405b_1.C b/gcc/testsuite/g++.dg/lto/pr85405b_1.C
new file mode 100644
index 00000000000..fd98e631d56
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr85405b_1.C
@@ -0,0 +1,9 @@
+class VclReferenceBase {
+ int mnRefCnt;
+ int mbDisposed: 7; // { dg-lto-message "19: a field of same name but different type is defined in another translation unit" }
+
+protected:
+ virtual ~VclReferenceBase();
+};
+class : VclReferenceBase {
+} a;
--
2.16.3