c++: Don't purge the satisfaction caches
The adoption of P2104 ("Disallow changing concept values") means we can memoize the result of satisfaction indefinitely and no longer have to clear the satisfaction caches on various events that would affect satisfaction. To that end, this patch removes the invalidation routine clear_satisfaction_cache and adjusts its callers appropriately. This provides a large reduction in compile time and memory use in some cases. For example, on the libstdc++ test std/ranges/adaptor/join.cc, compile time and memory usage drops nearly 75%, from 7.5s/770MB to 2s/230MB, with a --enable-checking=release compiler. gcc/cp/ChangeLog: * class.c (finish_struct_1): Don't call clear_satisfaction_cache. * constexpr.c (clear_cv_and_fold_caches): Likewise. Remove bool parameter. * constraint.cc (clear_satisfaction_cache): Remove definition. * cp-tree.h (clear_satisfaction_cache): Remove declaration. (clear_cv_and_fold_caches): Remove bool parameter. * typeck2.c (store_init_value): Remove argument to clear_cv_and_fold_caches. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-complete1.C: Delete test that became ill-formed after P2104.
This commit is contained in:
parent
05161256d3
commit
bebabf70a0
6 changed files with 4 additions and 30 deletions
|
@ -7472,9 +7472,6 @@ finish_struct_1 (tree t)
|
|||
/* Finish debugging output for this type. */
|
||||
rest_of_type_compilation (t, ! LOCAL_CLASS_P (t));
|
||||
|
||||
/* Recalculate satisfaction that might depend on completeness. */
|
||||
clear_satisfaction_cache ();
|
||||
|
||||
if (TYPE_TRANSPARENT_AGGR (t))
|
||||
{
|
||||
tree field = first_field (t);
|
||||
|
|
|
@ -7136,15 +7136,13 @@ clear_cv_cache (void)
|
|||
cv_cache->empty ();
|
||||
}
|
||||
|
||||
/* Dispose of the whole CV_CACHE, FOLD_CACHE, and satisfaction caches. */
|
||||
/* Dispose of the whole CV_CACHE and FOLD_CACHE. */
|
||||
|
||||
void
|
||||
clear_cv_and_fold_caches (bool sat /*= true*/)
|
||||
clear_cv_and_fold_caches ()
|
||||
{
|
||||
clear_cv_cache ();
|
||||
clear_fold_cache ();
|
||||
if (sat)
|
||||
clear_satisfaction_cache ();
|
||||
}
|
||||
|
||||
/* Internal function handling expressions in templates for
|
||||
|
|
|
@ -2327,15 +2327,6 @@ save_satisfaction (tree constr, tree args, tree result)
|
|||
*slot = entry;
|
||||
}
|
||||
|
||||
void
|
||||
clear_satisfaction_cache ()
|
||||
{
|
||||
if (sat_cache)
|
||||
sat_cache->empty ();
|
||||
if (decl_satisfied_cache)
|
||||
decl_satisfied_cache->empty ();
|
||||
}
|
||||
|
||||
/* A tool to help manage satisfaction caching in satisfy_constraint_r.
|
||||
Note the cache is only used when not diagnosing errors. */
|
||||
|
||||
|
|
|
@ -7831,7 +7831,6 @@ extern tree evaluate_concept_check (tree, tsubst_flags_t);
|
|||
extern tree satisfy_constraint_expression (tree);
|
||||
extern bool constraints_satisfied_p (tree);
|
||||
extern bool constraints_satisfied_p (tree, tree);
|
||||
extern void clear_satisfaction_cache ();
|
||||
extern bool* lookup_subsumption_result (tree, tree);
|
||||
extern bool save_subsumption_result (tree, tree, bool);
|
||||
extern tree find_template_parameters (tree, tree);
|
||||
|
@ -7901,7 +7900,7 @@ extern bool var_in_maybe_constexpr_fn (tree);
|
|||
extern void explain_invalid_constexpr_fn (tree);
|
||||
extern vec<tree> cx_error_context (void);
|
||||
extern tree fold_sizeof_expr (tree);
|
||||
extern void clear_cv_and_fold_caches (bool = true);
|
||||
extern void clear_cv_and_fold_caches (void);
|
||||
extern tree unshare_constructor (tree CXX_MEM_STAT_INFO);
|
||||
|
||||
/* An RAII sentinel used to restrict constexpr evaluation so that it
|
||||
|
|
|
@ -954,7 +954,7 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
|
|||
return split_nonconstant_init (decl, value);
|
||||
|
||||
/* DECL may change value; purge caches. */
|
||||
clear_cv_and_fold_caches (TREE_STATIC (decl));
|
||||
clear_cv_and_fold_caches ();
|
||||
|
||||
/* If the value is a constant, just put it in DECL_INITIAL. If DECL
|
||||
is an automatic variable, the middle end will turn this into a
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
// { dg-do compile { target c++20 } }
|
||||
|
||||
template <class T> concept has_mem_type = requires { typename T::type; };
|
||||
|
||||
template <has_mem_type T> int f () { return 0; }
|
||||
template <class T> char f() { return 0; }
|
||||
|
||||
struct A;
|
||||
static_assert (sizeof (f<A>()) == 1);
|
||||
struct A { typedef int type; };
|
||||
static_assert (sizeof (f<A>()) > 1);
|
Loading…
Add table
Reference in a new issue