re PR lto/78472 (warning: type of 's' does not match original declaration from zero length bitfield in C vs C++)

2016-11-23  Richard Biener  <rguenther@suse.de>

	PR lto/78472
	* tree.c (gimple_canonical_types_compatible_p): Ignore zero-sized
	fields.

	lto/
	* lto.c (hash_canonical_type): Ignore zero-sized fields.

	* g++.dg/lto/pr78472_0.c: New testcase.
	* g++.dg/lto/pr78472_1.C: Likewise.

From-SVN: r242746
This commit is contained in:
Richard Biener 2016-11-23 11:24:55 +00:00 committed by Richard Biener
parent a5bb8a5cea
commit efb7123241
7 changed files with 48 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2016-11-23 Richard Biener <rguenther@suse.de>
PR lto/78472
* tree.c (gimple_canonical_types_compatible_p): Ignore zero-sized
fields.
2016-11-23 Richard Biener <rguenther@suse.de>
Prathamesh Kulkarni <prathamesh.kulkarni@linaro.rog>

View File

@ -1,3 +1,8 @@
2016-11-23 Richard Biener <rguenther@suse.de>
PR lto/78472
* lto.c (hash_canonical_type): Ignore zero-sized fields.
2016-11-21 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR c++/71973

View File

@ -373,7 +373,9 @@ hash_canonical_type (tree type)
tree f;
for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
if (TREE_CODE (f) == FIELD_DECL)
if (TREE_CODE (f) == FIELD_DECL
&& (! DECL_SIZE (f)
|| ! integer_zerop (DECL_SIZE (f))))
{
iterative_hash_canonical_type (TREE_TYPE (f), hstate);
nf++;

View File

@ -1,3 +1,9 @@
2016-11-23 Richard Biener <rguenther@suse.de>
PR lto/78472
* g++.dg/lto/pr78472_0.c: New testcase.
* g++.dg/lto/pr78472_1.C: Likewise.
2016-11-23 Richard Biener <rguenther@suse.de>
Prathamesh Kulkarni <prathamesh.kulkarni@linaro.rog>

View File

@ -0,0 +1,12 @@
// { dg-lto-do link }
extern struct S
{
unsigned i:4;
unsigned :0;
} s;
static void *f(void)
{
return &s;
}
int main() {}

View File

@ -0,0 +1,9 @@
struct S
{
unsigned i:4;
unsigned :0;
} s;
static void *f(void)
{
return &s;
}

View File

@ -13708,10 +13708,14 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2,
f1 || f2;
f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
{
/* Skip non-fields. */
while (f1 && TREE_CODE (f1) != FIELD_DECL)
/* Skip non-fields and zero-sized fields. */
while (f1 && (TREE_CODE (f1) != FIELD_DECL
|| (DECL_SIZE (f1)
&& integer_zerop (DECL_SIZE (f1)))))
f1 = TREE_CHAIN (f1);
while (f2 && TREE_CODE (f2) != FIELD_DECL)
while (f2 && (TREE_CODE (f2) != FIELD_DECL
|| (DECL_SIZE (f2)
&& integer_zerop (DECL_SIZE (f2)))))
f2 = TREE_CHAIN (f2);
if (!f1 || !f2)
break;