mirror of git://gcc.gnu.org/git/gcc.git
re PR c/53702 (ICE with -Wall and nested functions and unused typedef)
PR c/53702 * c-decl.c (c_push_function_context): Restore the behavior to reuse the language function allocated for -Wunused-local-typedefs. (c_pop_function_context): If necessary, clear the language function created in c_push_function_context. Always clear out the x_cur_stmt_list field of the restored language function. testsuite/ * gcc.dg/Wunused-local-typedefs.c: New testcase. From-SVN: r188860
This commit is contained in:
parent
0619103bb2
commit
b6fbbea3ca
|
|
@ -1,3 +1,12 @@
|
|||
2012-06-21 Meador Inge <meadori@codesourcery.com>
|
||||
|
||||
PR c/53702
|
||||
* c-decl.c (c_push_function_context): Restore the behavior to reuse
|
||||
the language function allocated for -Wunused-local-typedefs.
|
||||
(c_pop_function_context): If necessary, clear the language function
|
||||
created in c_push_function_context. Always clear out the
|
||||
x_cur_stmt_list field of the restored language function.
|
||||
|
||||
2012-06-21 Sterling Augustine <saugustine@google.com>
|
||||
Cary Coutant <ccoutant@google.com>
|
||||
|
||||
|
|
|
|||
16
gcc/c-decl.c
16
gcc/c-decl.c
|
|
@ -8579,9 +8579,11 @@ check_for_loop_decls (location_t loc, bool turn_off_iso_c99_error)
|
|||
void
|
||||
c_push_function_context (void)
|
||||
{
|
||||
struct language_function *p;
|
||||
p = ggc_alloc_language_function ();
|
||||
cfun->language = p;
|
||||
struct language_function *p = cfun->language;
|
||||
/* cfun->language might have been already allocated by the use of
|
||||
-Wunused-local-typedefs. In that case, just re-use it. */
|
||||
if (p == NULL)
|
||||
cfun->language = p = ggc_alloc_cleared_language_function ();
|
||||
|
||||
p->base.x_stmt_tree = c_stmt_tree;
|
||||
c_stmt_tree.x_cur_stmt_list
|
||||
|
|
@ -8607,7 +8609,12 @@ c_pop_function_context (void)
|
|||
|
||||
pop_function_context ();
|
||||
p = cfun->language;
|
||||
cfun->language = NULL;
|
||||
|
||||
/* When -Wunused-local-typedefs is in effect, cfun->languages is
|
||||
used to store data throughout the life time of the current cfun,
|
||||
So don't deallocate it. */
|
||||
if (!warn_unused_local_typedefs)
|
||||
cfun->language = NULL;
|
||||
|
||||
if (DECL_STRUCT_FUNCTION (current_function_decl) == 0
|
||||
&& DECL_SAVED_TREE (current_function_decl) == NULL_TREE)
|
||||
|
|
@ -8620,6 +8627,7 @@ c_pop_function_context (void)
|
|||
}
|
||||
|
||||
c_stmt_tree = p->base.x_stmt_tree;
|
||||
p->base.x_stmt_tree.x_cur_stmt_list = NULL;
|
||||
c_break_label = p->x_break_label;
|
||||
c_cont_label = p->x_cont_label;
|
||||
c_switch_stack = p->x_switch_stack;
|
||||
|
|
|
|||
|
|
@ -1,3 +1,8 @@
|
|||
2012-06-21 Meador Inge <meadori@codesourcery.com>
|
||||
|
||||
PR c/53702
|
||||
* gcc.dg/Wunused-local-typedefs.c: New testcase.
|
||||
|
||||
2012-06-21 Steven Bosscher <steven@gcc.gnu.org>
|
||||
|
||||
* testsuite/gcc.dg/pch/ident-1.c: New test.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
/* Origin PR c/53702
|
||||
{ dg-options "-Wunused-local-typedefs" }
|
||||
{ dg-do compile }
|
||||
*/
|
||||
|
||||
/* Only test nested functions for C. More tests that work for C and C++
|
||||
can be found in c-c++-common.
|
||||
*/
|
||||
|
||||
void
|
||||
test0 ()
|
||||
{
|
||||
typedef int foo; /* { dg-warning "locally defined but not used" } */
|
||||
void f ()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
test1 ()
|
||||
{
|
||||
void f ()
|
||||
{
|
||||
typedef int foo; /* { dg-warning "locally defined but not used" } */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
test2 ()
|
||||
{
|
||||
void f ()
|
||||
{
|
||||
}
|
||||
typedef int foo; /* { dg-warning "locally defined but not used" } */
|
||||
}
|
||||
Loading…
Reference in New Issue