re PR c++/27094 (tree check: expected tree_list, have omp_return in build_call)
PR c++/27094 * pt.c (tsubst_default_argument): Increment function_depth around call to tsubst_expr. * parser.c (cp_parser_parameter_declaration): Likewise. * decl2.c (mark_used): Tidy. PR c++/27094 * g++.dg/template/defarg8.C: New test. From-SVN: r113399
This commit is contained in:
parent
194c524aa2
commit
5a8613b2d9
@ -1,3 +1,11 @@
|
||||
2006-04-30 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/27094
|
||||
* pt.c (tsubst_default_argument): Increment function_depth around
|
||||
call to tsubst_expr.
|
||||
* parser.c (cp_parser_parameter_declaration): Likewise.
|
||||
* decl2.c (mark_used): Tidy.
|
||||
|
||||
2006-04-30 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
||||
|
||||
PR c++/27278
|
||||
|
@ -3319,29 +3319,28 @@ mark_used (tree decl)
|
||||
{
|
||||
synthesize_method (decl);
|
||||
/* If we've already synthesized the method we don't need to
|
||||
instantiate it, so we can return right away. */
|
||||
return;
|
||||
do the instantiation test below. */
|
||||
}
|
||||
|
||||
/* If this is a function or variable that is an instance of some
|
||||
template, we now know that we will need to actually do the
|
||||
instantiation. We check that DECL is not an explicit
|
||||
instantiation because that is not checked in instantiate_decl. */
|
||||
if ((DECL_NON_THUNK_FUNCTION_P (decl) || TREE_CODE (decl) == VAR_DECL)
|
||||
&& DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
|
||||
&& (!DECL_EXPLICIT_INSTANTIATION (decl)
|
||||
|| (TREE_CODE (decl) == FUNCTION_DECL
|
||||
&& DECL_INLINE (DECL_TEMPLATE_RESULT
|
||||
(template_for_substitution (decl))))
|
||||
/* We need to instantiate static data members so that there
|
||||
initializers are available in integral constant
|
||||
expressions. */
|
||||
|| (TREE_CODE (decl) == VAR_DECL
|
||||
&& DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))))
|
||||
/* We put off instantiating functions in order to improve compile
|
||||
else if ((DECL_NON_THUNK_FUNCTION_P (decl) || TREE_CODE (decl) == VAR_DECL)
|
||||
&& DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
|
||||
&& (!DECL_EXPLICIT_INSTANTIATION (decl)
|
||||
|| (TREE_CODE (decl) == FUNCTION_DECL
|
||||
&& DECL_INLINE (DECL_TEMPLATE_RESULT
|
||||
(template_for_substitution (decl))))
|
||||
/* We need to instantiate static data members so that there
|
||||
initializers are available in integral constant
|
||||
expressions. */
|
||||
|| (TREE_CODE (decl) == VAR_DECL
|
||||
&& DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))))
|
||||
/* If this is a function or variable that is an instance of some
|
||||
template, we now know that we will need to actually do the
|
||||
instantiation. We check that DECL is not an explicit
|
||||
instantiation because that is not checked in instantiate_decl.
|
||||
|
||||
We put off instantiating functions in order to improve compile
|
||||
times. Maintaining a stack of active functions is expensive,
|
||||
and the inliner knows to instantiate any functions it might
|
||||
need. */
|
||||
need. Therefore, we always try to defer instantiation. */
|
||||
instantiate_decl (decl, /*defer_ok=*/true,
|
||||
/*expl_inst_class_mem_p=*/false);
|
||||
|
||||
|
@ -12431,10 +12431,17 @@ cp_parser_parameter_declaration (cp_parser *parser,
|
||||
saved_local_variables_forbidden_p
|
||||
= parser->local_variables_forbidden_p;
|
||||
parser->local_variables_forbidden_p = true;
|
||||
/* The default argument expression may cause implicitly
|
||||
defined member functions to be synthesized, which will
|
||||
result in garbage collection. We must treat this
|
||||
situation as if we were within the body of function so as
|
||||
to avoid collecting live data on the stack. */
|
||||
++function_depth;
|
||||
/* Parse the assignment-expression. */
|
||||
default_argument
|
||||
= cp_parser_assignment_expression (parser, /*cast_p=*/false);
|
||||
/* Restore saved state. */
|
||||
--function_depth;
|
||||
parser->greater_than_is_operator_p
|
||||
= saved_greater_than_is_operator_p;
|
||||
parser->local_variables_forbidden_p
|
||||
|
@ -6150,8 +6150,15 @@ tsubst_default_argument (tree fn, tree type, tree arg)
|
||||
}
|
||||
|
||||
push_deferring_access_checks(dk_no_deferred);
|
||||
/* The default argument expression may cause implicitly defined
|
||||
member functions to be synthesized, which will result in garbage
|
||||
collection. We must treat this situation as if we were within
|
||||
the body of function so as to avoid collecting live data on the
|
||||
stack. */
|
||||
++function_depth;
|
||||
arg = tsubst_expr (arg, DECL_TI_ARGS (fn),
|
||||
tf_warning_or_error, NULL_TREE);
|
||||
--function_depth;
|
||||
pop_deferring_access_checks();
|
||||
|
||||
/* Restore the "this" pointer. */
|
||||
|
@ -1,3 +1,8 @@
|
||||
2006-04-30 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/27094
|
||||
* g++.dg/template/defarg8.C: New test.
|
||||
|
||||
2006-04-30 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
||||
|
||||
PR c++/27278
|
||||
|
19
gcc/testsuite/g++.dg/template/defarg8.C
Normal file
19
gcc/testsuite/g++.dg/template/defarg8.C
Normal file
@ -0,0 +1,19 @@
|
||||
// PR c++/27094
|
||||
// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" }
|
||||
|
||||
struct A
|
||||
{
|
||||
~A();
|
||||
};
|
||||
|
||||
struct B : A
|
||||
{
|
||||
B();
|
||||
};
|
||||
|
||||
template<int> struct C
|
||||
{
|
||||
C(const B& = B());
|
||||
};
|
||||
|
||||
C<0> c;
|
Loading…
Reference in New Issue
Block a user