re PR debug/69518 (Flag -g causes "error: type variant has different TYPE_VFIELD")

PR debug/69518
	* c-decl.c (finish_struct): Clear C_TYPE_INCOMPLETE_VARS in
	all type variants, not just TYPE_MAIN_VARIANT.

	* gcc.dg/torture/pr69518.c: New test.

From-SVN: r232998
This commit is contained in:
Jakub Jelinek 2016-01-29 21:37:25 +01:00 committed by Jakub Jelinek
parent c661a43de3
commit 3a5d2ba4fc
4 changed files with 32 additions and 11 deletions

View File

@ -1,3 +1,9 @@
2016-01-29 Jakub Jelinek <jakub@redhat.com>
PR debug/69518
* c-decl.c (finish_struct): Clear C_TYPE_INCOMPLETE_VARS in
all type variants, not just TYPE_MAIN_VARIANT.
2016-01-27 Jakub Jelinek <jakub@redhat.com>
PR debug/66869

View File

@ -7842,6 +7842,14 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
}
}
/* Note: C_TYPE_INCOMPLETE_VARS overloads TYPE_VFIELD which is used
in dwarf2out via rest_of_decl_compilation below and means
something totally different. Since we will be clearing
C_TYPE_INCOMPLETE_VARS shortly after we iterate through them,
clear it ahead of time and avoid problems in dwarf2out. Ideally,
C_TYPE_INCOMPLETE_VARS should use some language specific
node. */
tree incomplete_vars = C_TYPE_INCOMPLETE_VARS (TYPE_MAIN_VARIANT (t));
for (x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x))
{
TYPE_FIELDS (x) = TYPE_FIELDS (t);
@ -7849,6 +7857,7 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
C_TYPE_FIELDS_READONLY (x) = C_TYPE_FIELDS_READONLY (t);
C_TYPE_FIELDS_VOLATILE (x) = C_TYPE_FIELDS_VOLATILE (t);
C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
C_TYPE_INCOMPLETE_VARS (x) = NULL_TREE;
}
/* If this was supposed to be a transparent union, but we can't
@ -7862,17 +7871,7 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
}
/* If this structure or union completes the type of any previous
variable declaration, lay it out and output its rtl.
Note: C_TYPE_INCOMPLETE_VARS overloads TYPE_VFIELD which is used
in dwarf2out via rest_of_decl_compilation below and means
something totally different. Since we will be clearing
C_TYPE_INCOMPLETE_VARS shortly after we iterate through them,
clear it ahead of time and avoid problems in dwarf2out. Ideally,
C_TYPE_INCOMPLETE_VARS should use some language specific
node. */
tree incomplete_vars = C_TYPE_INCOMPLETE_VARS (TYPE_MAIN_VARIANT (t));
C_TYPE_INCOMPLETE_VARS (TYPE_MAIN_VARIANT (t)) = 0;
variable declaration, lay it out and output its rtl. */
for (x = incomplete_vars; x; x = TREE_CHAIN (x))
{
tree decl = TREE_VALUE (x);

View File

@ -1,3 +1,8 @@
2016-01-29 Jakub Jelinek <jakub@redhat.com>
PR debug/69518
* gcc.dg/torture/pr69518.c: New test.
2016-01-29 H.J. Lu <hongjiu.lu@intel.com>
PR target/69530

View File

@ -0,0 +1,11 @@
/* PR debug/69518 */
/* { dg-do compile } */
/* { dg-options "-g" } */
struct A a;
typedef struct A B;
struct A {}
foo (B x)
{
__builtin_abort ();
}