PR c++/12245 - excessive memory use

* constexpr.c (maybe_constant_value): Fold maybe_constant_value_1
	back in.  Don't cache constants.
	(maybe_constant_init): Don't cache constants.

From-SVN: r245169
This commit is contained in:
Jason Merrill 2017-02-03 14:44:27 -05:00 committed by Jason Merrill
parent 99be38ec6a
commit 8a87daca9c
2 changed files with 20 additions and 22 deletions

View file

@ -1,5 +1,10 @@
2017-02-03 Jason Merrill <jason@redhat.com>
PR c++/12245 - excessive memory use
* constexpr.c (maybe_constant_value): Fold maybe_constant_value_1
back in. Don't cache constants.
(maybe_constant_init): Don't cache constants.
PR c++/79294 - ICE with invalid template argument
* pt.c (convert_nontype_argument_function): Check value-dependence.
(convert_nontype_argument): Don't check it here for function ptrs.

View file

@ -4777,8 +4777,10 @@ fold_simple (tree t)
Otherwise, if T does not have TREE_CONSTANT set, returns T.
Otherwise, returns a version of T without TREE_CONSTANT. */
static tree
maybe_constant_value_1 (tree t, tree decl)
static GTY((deletable)) hash_map<tree, tree> *cv_cache;
tree
maybe_constant_value (tree t, tree decl)
{
tree r;
@ -4791,6 +4793,14 @@ maybe_constant_value_1 (tree t, tree decl)
}
return t;
}
else if (CONSTANT_CLASS_P (t))
/* No caching or evaluation needed. */
return t;
if (cv_cache == NULL)
cv_cache = hash_map<tree, tree>::create_ggc (101);
if (tree *cached = cv_cache->get (t))
return *cached;
r = cxx_eval_outermost_constant_expr (t, true, true, decl);
gcc_checking_assert (r == t
@ -4798,29 +4808,10 @@ maybe_constant_value_1 (tree t, tree decl)
|| TREE_CODE (t) == VIEW_CONVERT_EXPR
|| (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
|| !cp_tree_equal (r, t));
cv_cache->put (t, r);
return r;
}
static GTY((deletable)) hash_map<tree, tree> *cv_cache;
/* If T is a constant expression, returns its reduced value.
Otherwise, if T does not have TREE_CONSTANT set, returns T.
Otherwise, returns a version of T without TREE_CONSTANT. */
tree
maybe_constant_value (tree t, tree decl)
{
if (cv_cache == NULL)
cv_cache = hash_map<tree, tree>::create_ggc (101);
if (tree *cached = cv_cache->get (t))
return *cached;
tree ret = maybe_constant_value_1 (t, decl);
cv_cache->put (t, ret);
return ret;
}
/* Dispose of the whole CV_CACHE. */
static void
@ -4916,6 +4907,8 @@ maybe_constant_init (tree t, tree decl)
t = TARGET_EXPR_INITIAL (t);
if (!potential_nondependent_static_init_expression (t))
/* Don't try to evaluate it. */;
else if (CONSTANT_CLASS_P (t))
/* No evaluation needed. */;
else
t = cxx_eval_outermost_constant_expr (t, true, false, decl);
if (TREE_CODE (t) == TARGET_EXPR)