Make-lang.in (check-g++-strict-gc): New.
authorJason Merrill <jason@redhat.com>
Sat, 16 Jul 2011 04:11:53 +0000 (00:11 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 16 Jul 2011 04:11:53 +0000 (00:11 -0400)
* 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

gcc/cp/ChangeLog
gcc/cp/Make-lang.in
gcc/cp/config-lang.in
gcc/cp/decl2.c
gcc/cp/except.c
gcc/cp/parser.c
gcc/cp/semantics.c

index a0ce80dadbd5d769d381913bde27dd5757b00bb9..bb503c3b0905e81813126038c35aa9c62e7de7cf 100644 (file)
@@ -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.
 
index ad466b2dc163107a8a8d65aaa42cdcf5467defab..21145b2c88a995b29e66686d23e1dfd760420496 100644 (file)
@@ -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 \
index 13f2e9c82659ebf16666ca45ff1b6ee7b66cec84..3ed3d8e880f5cd0a39f624041edce57f5c707a62 100644 (file)
@@ -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"
index e1f9562b90c2c3d3ada2ddf367ffefcaeb36f8bb..f05b0f8bda676b34ba6ac21bcda351bd37304015 100644 (file)
@@ -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"
index f8c8e4734a8c4a16beb8a42c65879f7c8f4f3717..c37815d242dcc705de60eccd7cf68adca291df55 100644 (file)
@@ -1227,3 +1227,5 @@ build_noexcept_spec (tree expr, int complain)
       return build_tree_list (expr, NULL_TREE);
     }
 }
+
+#include "gt-cp-except.h"
index 64be92335dad5e764db64986df200eaebcc51bf6..5fcedcd2e56cb7807a51f8bb89f875e8af055bec 100644 (file)
@@ -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]  */
index fadef4d87d0d8a472410fa84e90a59df1720f094..fdd6c33b576adce9cdae6d4416ccfc5e0f34992a 100644 (file)
@@ -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