]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: extract_local_specs and unevaluated contexts [PR100295]
authorPatrick Palka <ppalka@redhat.com>
Thu, 15 Dec 2022 21:02:05 +0000 (16:02 -0500)
committerPatrick Palka <ppalka@redhat.com>
Mon, 19 Dec 2022 16:54:14 +0000 (11:54 -0500)
commitcdc1a14be1182874ccf1ceb27ee5b67c5ce8c62d
treec015707bfc4b6a429b901c0a0ef86488a399dc4b
parent6e09ca0cba625b8bb2ef50f9df726eb455ebb813
c++: extract_local_specs and unevaluated contexts [PR100295]

Here during partial instantiation of the constexpr if, extra_local_specs
walks the statement looking for local specializations within to capture.
However, we're thwarted by the fact that 'ts' first appears inside an
unevaluated context, and so the calls to process_outer_var_ref for its
local specializations are a no-op.  And since we walk each tree exactly
once, we end up not capturing the local specializations despite 'ts'
later occurring in an evaluated context.

This patch fixes this by making extract_local_specs walk evaluated
contexts first before walking unevaluated contexts.  We could probably
get away with not walking unevaluated contexts at all, but this approach
seems more clearly safe.

PR c++/100295
PR c++/107579

gcc/cp/ChangeLog:

* pt.cc (el_data::skip_unevaluated_operands): New data member.
(extract_locals_r): If skip_unevaluated_operands is true,
don't walk into unevaluated contexts.
(extract_local_specs): Walk the pattern twice, first with
skip_unevaluated_operands true followed by it set to false.

gcc/testsuite/ChangeLog:

* g++.dg/cpp1z/constexpr-if-lambda5.C: New test.

(cherry picked from commit 18499b9f848707aee42d810e99ac0a4c9788433c)
gcc/cp/pt.cc
gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda5.C [new file with mode: 0644]