aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-07-16 00:11:53 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-07-16 00:11:53 -0400
commitb6c917ff5dbdbbf3547d7198eff249936f7011fa (patch)
treebe316d2adfde34ba7f9bc197ea6bd6f4528452f0 /gcc/cp
parentea6136a283596a40c177cf79e01c204cc2fc555e (diff)
downloadgcc-b6c917ff5dbdbbf3547d7198eff249936f7011fa.zip
gcc-b6c917ff5dbdbbf3547d7198eff249936f7011fa.tar.gz
gcc-b6c917ff5dbdbbf3547d7198eff249936f7011fa.tar.bz2
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
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/Make-lang.in6
-rw-r--r--gcc/cp/config-lang.in2
-rw-r--r--gcc/cp/decl2.c12
-rw-r--r--gcc/cp/except.c2
-rw-r--r--gcc/cp/parser.c6
-rw-r--r--gcc/cp/semantics.c6
7 files changed, 37 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a0ce80d..bb503c3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,14 @@
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
* Make-lang.in (check-c++0x): Use --extra_opts instead of--tool_opts.
diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
index ad466b2..21145b2 100644
--- a/gcc/cp/Make-lang.in
+++ b/gcc/cp/Make-lang.in
@@ -153,6 +153,10 @@ check-c++ : check-g++
check-c++0x:
$(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) --extra_opts,-std=gnu++0x" \
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
# List of targets that can use the generic check- rule and its // variant.
lang_checks += check-g++
@@ -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 \
$(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/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/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 \
diff --git a/gcc/cp/config-lang.in b/gcc/cp/config-lang.in
index 13f2e9c..3ed3d8e 100644
--- a/gcc/cp/config-lang.in
+++ b/gcc/cp/config-lang.in
@@ -30,4 +30,4 @@ compilers="cc1plus\$(exeext)"
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"
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index e1f9562..f05b0f8 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -4231,9 +4231,9 @@ mark_used (tree decl)
if ((decl_maybe_constant_var_p (decl)
|| (TREE_CODE (decl) == FUNCTION_DECL
&& DECL_DECLARED_CONSTEXPR_P (decl)))
- && !DECL_INITIAL (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
must treat this situation as if we were within the body of a
@@ -4327,8 +4327,12 @@ mark_used (tree decl)
times. Maintaining a stack of active functions is expensive,
and the inliner knows to instantiate any functions it might
need. Therefore, we always try to defer instantiation. */
- instantiate_decl (decl, /*defer_ok=*/true,
- /*expl_inst_class_mem_p=*/false);
+ {
+ ++function_depth;
+ instantiate_decl (decl, /*defer_ok=*/true,
+ /*expl_inst_class_mem_p=*/false);
+ --function_depth;
+ }
}
#include "gt-cp-decl2.h"
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index f8c8e47..c37815d 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -1227,3 +1227,5 @@ build_noexcept_spec (tree expr, int complain)
return build_tree_list (expr, NULL_TREE);
}
}
+
+#include "gt-cp-except.h"
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 64be923..5fcedcd 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -7737,6 +7737,10 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
bool nested = (current_function_decl != NULL_TREE);
if (nested)
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
- class_specifier
@@ -7836,6 +7840,8 @@ cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
if (nested)
pop_function_context();
+ else
+ --function_depth;
}
/* Statements [gram.stmt.stmt] */
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index fadef4d..fdd6c33 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -8875,6 +8875,10 @@ maybe_add_lambda_conv_op (tree type)
if (nested)
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. */
@@ -8927,6 +8931,8 @@ maybe_add_lambda_conv_op (tree type)
if (nested)
pop_function_context ();
+ else
+ --function_depth;
}
/* Returns true iff VAL is a lambda-related declaration which should