Commit da611058 by Mark Mitchell Committed by Mark Mitchell

re PR c++/21687 (ICE in GC with local class inside a template function)

	PR c++/21687
	* parser.c (cp_parser_class_specifier): Push/pop GC contexts
	around functions in local classes.

	PR c++/21687
	* g++.dg/other/gc3.C: New test.

From-SVN: r103791
parent 01be28d8
2005-09-02 Mark Mitchell <mark@codesourcery.com>
PR c++/21687
* parser.c (cp_parser_class_specifier): Push/pop GC contexts
around functions in local classes.
2005-08-31 Andrew Pinski <pinskia@physics.uc.edu> 2005-08-31 Andrew Pinski <pinskia@physics.uc.edu>
PR obj-c++/23640 PR obj-c++/23640
......
...@@ -12673,7 +12673,10 @@ cp_parser_class_specifier (cp_parser* parser) ...@@ -12673,7 +12673,10 @@ cp_parser_class_specifier (cp_parser* parser)
tree fn; tree fn;
tree class_type = NULL_TREE; tree class_type = NULL_TREE;
tree pushed_scope = NULL_TREE; tree pushed_scope = NULL_TREE;
/* True if we have called ggc_push_context, and therefore need
to make a matching call to ggc_pop_context. */
bool need_ggc_pop_context;
/* In a first pass, parse default arguments to the functions. /* In a first pass, parse default arguments to the functions.
Then, in a second pass, parse the bodies of the functions. Then, in a second pass, parse the bodies of the functions.
This two-phased approach handles cases like: This two-phased approach handles cases like:
...@@ -12709,6 +12712,7 @@ cp_parser_class_specifier (cp_parser* parser) ...@@ -12709,6 +12712,7 @@ cp_parser_class_specifier (cp_parser* parser)
} }
if (pushed_scope) if (pushed_scope)
pop_scope (pushed_scope); pop_scope (pushed_scope);
need_ggc_pop_context = false;
/* Now parse the body of the functions. */ /* Now parse the body of the functions. */
for (TREE_VALUE (parser->unparsed_functions_queues) for (TREE_VALUE (parser->unparsed_functions_queues)
= nreverse (TREE_VALUE (parser->unparsed_functions_queues)); = nreverse (TREE_VALUE (parser->unparsed_functions_queues));
...@@ -12718,14 +12722,21 @@ cp_parser_class_specifier (cp_parser* parser) ...@@ -12718,14 +12722,21 @@ cp_parser_class_specifier (cp_parser* parser)
{ {
/* Figure out which function we need to process. */ /* Figure out which function we need to process. */
fn = TREE_VALUE (queue_entry); fn = TREE_VALUE (queue_entry);
/* We call ggc_collect after processing a function body in
/* A hack to prevent garbage collection. */ order to clean up garbage generated. If we're processing
function_depth++; a local class, however, then we must not clean up stuff
from the function containing the class, so we have to
push a new garbage-collection context. */
if (function_depth && !need_ggc_pop_context)
{
need_ggc_pop_context = true;
ggc_push_context ();
}
/* Parse the function. */ /* Parse the function. */
cp_parser_late_parsing_for_member (parser, fn); cp_parser_late_parsing_for_member (parser, fn);
function_depth--;
} }
if (need_ggc_pop_context)
ggc_pop_context ();
} }
/* Put back any saved access checks. */ /* Put back any saved access checks. */
......
2005-09-02 Mark Mitchell <mark@codesourcery.com>
PR c++/21687
* g++.dg/other/gc3.C: New test.
2005-08-31 Andrew Pinski <pinskia@physics.uc.edu> 2005-08-31 Andrew Pinski <pinskia@physics.uc.edu>
* gcc.dg/20030711-1.c: Include stddef.h and stdio.h. * gcc.dg/20030711-1.c: Include stddef.h and stdio.h.
// PR c++/21687
// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" }
template <class Union>
void perform_test_trivial() {
struct check_union { void perform_test_trivial() {} };
}
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