https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70594
--- Comment #11 from Nathan Sidwell <nathan at gcc dot gnu.org> --- Patrick's original patch did 2 things AFAICT 1) make constexpr_call_table GC deletable 2) add the fundef_copies_table etc. The failure we're observing is of constexpr_call_table losing information, which then causes the changing calls of copy_fn. Now, we'd still see that changing behaviour without #2. But I don't think we get it without #1. The logic in cxx_eval_call_expression is (pseudo code-ish): entry = constexpr_call_table->find_or_insert (...) if (entry->value) return entry->value fn = get_fundef_copy (...) result = evaluate (...) entry->value = result; return result; Those are the only uses of the call_table and get_fundef_copy. So restoring constexpr_call_table to non-deletableness is the safe patch. We still get the fundef_copy improvement.