Commit cde9b2f8 by Martin Liska Committed by Martin Liska

Handle trailing arrays in ODR warning (PR lto/81440).

2018-01-23  Martin Liska  <mliska@suse.cz>

	PR lto/81440
	* lto-symtab.c (lto_symtab_merge): Handle and do not warn about
	trailing arrays at the end of a struct.
2018-01-23  Martin Liska  <mliska@suse.cz>

	PR lto/81440
	* gcc.dg/lto/pr81440.h: New test.
	* gcc.dg/lto/pr81440_0.c: New test.
	* gcc.dg/lto/pr81440_1.c: New test.

From-SVN: r256989
parent 813d6db9
2018-01-23 Martin Liska <mliska@suse.cz>
PR lto/81440
* lto-symtab.c (lto_symtab_merge): Handle and do not warn about
trailing arrays at the end of a struct.
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
......
......@@ -352,18 +352,31 @@ lto_symtab_merge (symtab_node *prevailing, symtab_node *entry)
return false;
if (DECL_SIZE (decl) && DECL_SIZE (prevailing_decl)
&& !tree_int_cst_equal (DECL_SIZE (decl), DECL_SIZE (prevailing_decl))
&& !tree_int_cst_equal (DECL_SIZE (decl), DECL_SIZE (prevailing_decl)))
{
if (!DECL_COMMON (decl) && !DECL_EXTERNAL (decl))
return false;
tree type = TREE_TYPE (decl);
/* For record type, check for array at the end of the structure. */
if (TREE_CODE (type) == RECORD_TYPE)
{
tree field = TYPE_FIELDS (type);
while (DECL_CHAIN (field) != NULL_TREE)
field = DECL_CHAIN (field);
return TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE;
}
/* As a special case do not warn about merging
int a[];
and
int a[]={1,2,3};
here the first declaration is COMMON
and sizeof(a) == sizeof (int). */
&& ((!DECL_COMMON (decl) && !DECL_EXTERNAL (decl))
|| TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE
|| TYPE_SIZE (TREE_TYPE (decl))
!= TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))))
return false;
else if (TREE_CODE (type) == ARRAY_TYPE)
return (TYPE_SIZE (decl) == TYPE_SIZE (TREE_TYPE (type)));
}
return true;
}
......
2018-01-23 Martin Liska <mliska@suse.cz>
PR lto/81440
* gcc.dg/lto/pr81440.h: New test.
* gcc.dg/lto/pr81440_0.c: New test.
* gcc.dg/lto/pr81440_1.c: New test.
2018-01-23 Nathan Sidwell <nathan@acm.org>
PR c++/83988
......
typedef struct {
int i;
int ints[];
} struct_t;
/* { dg-lto-do link } */
#include "pr81440.h"
extern struct_t my_struct;
int main() {
return my_struct.ints[0];
}
#include "pr81440.h"
struct_t my_struct = {
20,
{ 1, 2 }
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment