Commit b6c917ff by Jason Merrill Committed by Jason Merrill

Make-lang.in (check-g++-strict-gc): New.

	* Make-lang.in (check-g++-strict-gc): New.
	(cp/except.o): Depend on gt-cp-except.h
	* except.c: Include gt-cp-except.h.
	* config-lang.in (gtfiles): Add cp/except.c.
	* decl2.c (mark_used): Adjust constexpr condition, set
	function_depth around template instantiation.
	* parser.c (cp_parser_lambda_body): Set function_depth.
	* semantics.c (maybe_add_lambda_conv_op): Likewise.

From-SVN: r176350
parent ea6136a2
2011-07-15 Jason Merrill <jason@redhat.com> 2011-07-15 Jason Merrill <jason@redhat.com>
* Make-lang.in (check-g++-strict-gc): New.
(cp/except.o): Depend on gt-cp-except.h
* except.c: Include gt-cp-except.h.
* config-lang.in (gtfiles): Add cp/except.c.
* decl2.c (mark_used): Adjust constexpr condition, set
function_depth around template instantiation.
* parser.c (cp_parser_lambda_body): Set function_depth.
* semantics.c (maybe_add_lambda_conv_op): Likewise.
PR testsuite/49741 PR testsuite/49741
* Make-lang.in (check-c++0x): Use --extra_opts instead of--tool_opts. * Make-lang.in (check-c++0x): Use --extra_opts instead of--tool_opts.
......
...@@ -153,6 +153,10 @@ check-c++ : check-g++ ...@@ -153,6 +153,10 @@ check-c++ : check-g++
check-c++0x: check-c++0x:
$(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) --extra_opts,-std=gnu++0x" \ $(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) --extra_opts,-std=gnu++0x" \
TESTSUITEDIR="$(TESTSUITEDIR).c++0x" check-g++ TESTSUITEDIR="$(TESTSUITEDIR).c++0x" check-g++
# Run the testsuite with garbage collection at every opportunity.
check-g++-strict-gc:
$(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) --extra_opts,--param,ggc-min-heapsize=0,--param,ggc-min-expand=0" \
TESTSUITEDIR="$(TESTSUITEDIR).gc" check-g++
check-c++-subtargets : check-g++-subtargets check-c++-subtargets : check-g++-subtargets
# List of targets that can use the generic check- rule and its // variant. # List of targets that can use the generic check- rule and its // variant.
lang_checks += check-g++ lang_checks += check-g++
...@@ -309,7 +313,7 @@ cp/ptree.o: cp/ptree.c $(CXX_TREE_H) $(TM_H) ...@@ -309,7 +313,7 @@ cp/ptree.o: cp/ptree.c $(CXX_TREE_H) $(TM_H)
cp/rtti.o: cp/rtti.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) convert.h \ cp/rtti.o: cp/rtti.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) convert.h \
$(TARGET_H) $(C_PRAGMA_H) gt-cp-rtti.h intl.h $(TARGET_H) $(C_PRAGMA_H) gt-cp-rtti.h intl.h
cp/except.o: cp/except.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ cp/except.o: cp/except.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \
cp/cfns.h $(TREE_INLINE_H) $(TARGET_H) cp/cfns.h $(TREE_INLINE_H) $(TARGET_H) gt-cp-except.h
cp/expr.o: cp/expr.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) $(TM_P_H) cp/expr.o: cp/expr.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) $(TM_P_H)
cp/pt.o: cp/pt.c $(CXX_TREE_H) $(TM_H) cp/decl.h cp/cp-objcp-common.h \ cp/pt.o: cp/pt.c $(CXX_TREE_H) $(TM_H) cp/decl.h cp/cp-objcp-common.h \
toplev.h $(TREE_INLINE_H) pointer-set.h gt-cp-pt.h vecprim.h intl.h \ toplev.h $(TREE_INLINE_H) pointer-set.h gt-cp-pt.h vecprim.h intl.h \
......
...@@ -30,4 +30,4 @@ compilers="cc1plus\$(exeext)" ...@@ -30,4 +30,4 @@ compilers="cc1plus\$(exeext)"
target_libs="target-libstdc++-v3" target_libs="target-libstdc++-v3"
gtfiles="\$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.h \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/c-family/c-lex.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c \$(srcdir)/cp/class.c \$(srcdir)/cp/cp-objcp-common.c \$(srcdir)/cp/cp-lang.c" gtfiles="\$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.h \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/c-family/c-lex.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c \$(srcdir)/cp/class.c \$(srcdir)/cp/cp-objcp-common.c \$(srcdir)/cp/cp-lang.c \$(srcdir)/cp/except.c"
...@@ -4231,9 +4231,9 @@ mark_used (tree decl) ...@@ -4231,9 +4231,9 @@ mark_used (tree decl)
if ((decl_maybe_constant_var_p (decl) if ((decl_maybe_constant_var_p (decl)
|| (TREE_CODE (decl) == FUNCTION_DECL || (TREE_CODE (decl) == FUNCTION_DECL
&& DECL_DECLARED_CONSTEXPR_P (decl))) && DECL_DECLARED_CONSTEXPR_P (decl)))
&& !DECL_INITIAL (decl)
&& DECL_LANG_SPECIFIC (decl) && DECL_LANG_SPECIFIC (decl)
&& DECL_TEMPLATE_INSTANTIATION (decl)) && DECL_TEMPLATE_INFO (decl)
&& !uses_template_parms (DECL_TI_ARGS (decl)))
{ {
/* Instantiating a function will result in garbage collection. We /* Instantiating a function will result in garbage collection. We
must treat this situation as if we were within the body of a must treat this situation as if we were within the body of a
...@@ -4327,8 +4327,12 @@ mark_used (tree decl) ...@@ -4327,8 +4327,12 @@ mark_used (tree decl)
times. Maintaining a stack of active functions is expensive, times. Maintaining a stack of active functions is expensive,
and the inliner knows to instantiate any functions it might and the inliner knows to instantiate any functions it might
need. Therefore, we always try to defer instantiation. */ need. Therefore, we always try to defer instantiation. */
{
++function_depth;
instantiate_decl (decl, /*defer_ok=*/true, instantiate_decl (decl, /*defer_ok=*/true,
/*expl_inst_class_mem_p=*/false); /*expl_inst_class_mem_p=*/false);
--function_depth;
}
} }
#include "gt-cp-decl2.h" #include "gt-cp-decl2.h"
...@@ -1227,3 +1227,5 @@ build_noexcept_spec (tree expr, int complain) ...@@ -1227,3 +1227,5 @@ build_noexcept_spec (tree expr, int complain)
return build_tree_list (expr, NULL_TREE); return build_tree_list (expr, NULL_TREE);
} }
} }
#include "gt-cp-except.h"
...@@ -7737,6 +7737,10 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) ...@@ -7737,6 +7737,10 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
bool nested = (current_function_decl != NULL_TREE); bool nested = (current_function_decl != NULL_TREE);
if (nested) if (nested)
push_function_context (); push_function_context ();
else
/* Still increment function_depth so that we don't GC in the
middle of an expression. */
++function_depth;
/* Finish the function call operator /* Finish the function call operator
- class_specifier - class_specifier
...@@ -7836,6 +7840,8 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr) ...@@ -7836,6 +7840,8 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
if (nested) if (nested)
pop_function_context(); pop_function_context();
else
--function_depth;
} }
/* Statements [gram.stmt.stmt] */ /* Statements [gram.stmt.stmt] */
......
...@@ -8875,6 +8875,10 @@ maybe_add_lambda_conv_op (tree type) ...@@ -8875,6 +8875,10 @@ maybe_add_lambda_conv_op (tree type)
if (nested) if (nested)
push_function_context (); push_function_context ();
else
/* Still increment function_depth so that we don't GC in the
middle of an expression. */
++function_depth;
/* Generate the body of the thunk. */ /* Generate the body of the thunk. */
...@@ -8927,6 +8931,8 @@ maybe_add_lambda_conv_op (tree type) ...@@ -8927,6 +8931,8 @@ maybe_add_lambda_conv_op (tree type)
if (nested) if (nested)
pop_function_context (); pop_function_context ();
else
--function_depth;
} }
/* Returns true iff VAL is a lambda-related declaration which should /* Returns true iff VAL is a lambda-related declaration which should
......
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