From 3a5d2ba4fc106dd53470c5cc52c8262e36e905d2 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 29 Jan 2016 21:37:25 +0100 Subject: [PATCH] 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 --- gcc/c/ChangeLog | 6 ++++++ gcc/c/c-decl.c | 21 ++++++++++----------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr69518.c | 11 +++++++++++ 4 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr69518.c diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 5341f044d28..606b63c7294 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2016-01-29 Jakub Jelinek + + 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 PR debug/66869 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 502fa5c7056..aaccaa88006 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4d8fa237895..aa3855f4177 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-29 Jakub Jelinek + + PR debug/69518 + * gcc.dg/torture/pr69518.c: New test. + 2016-01-29 H.J. Lu PR target/69530 diff --git a/gcc/testsuite/gcc.dg/torture/pr69518.c b/gcc/testsuite/gcc.dg/torture/pr69518.c new file mode 100644 index 00000000000..b2e7f55f0e3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr69518.c @@ -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 (); +} -- 2.30.2