On Mon, 11 Mar 2024, Patrick Palka wrote:
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
> OK for trunk and release branches?
Ping.
>
> -- >8 --
>
> r13-6452-g341e6cd8d603a3 made build_extra_args walk evaluated contexts
> first so that we prefer processing a local specialization in an evaluated
> context even if its first use is in an unevaluated context. But this
> means we need to avoid walking a tree that already has extra args/specs
> saved because the list of saved specs appears to be an evaluated
> context. It seems then that we should be calculating the saved specs
> from scratch each time, rather than potentially walking the saved specs
> list from an earlier partial instantiation when calling build_extra_args
> a second time around.
>
> PR c++/114303
>
> gcc/cp/ChangeLog:
>
> * constraint.cc (tsubst_requires_expr): Clear
> REQUIRES_EXPR_EXTRA_ARGS before calling build_extra_args.
> * pt.cc (tsubst_stmt) <case IF_STMT>: Call build_extra_args
> on the new IF_STMT instead of t which might already have
> IF_STMT_EXTRA_ARGS.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/cpp1z/constexpr-if-lambda6.C: New test.
> ---
> gcc/cp/constraint.cc | 1 +
> gcc/cp/pt.cc | 2 +-
> .../g++.dg/cpp1z/constexpr-if-lambda6.C | 16 ++++++++++++++++
> 3 files changed, 18 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda6.C
>
> diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
> index 49de3211d4c..8a3b5d80ba7 100644
> --- a/gcc/cp/constraint.cc
> +++ b/gcc/cp/constraint.cc
> @@ -2362,6 +2362,7 @@ tsubst_requires_expr (tree t, tree args, sat_info info)
> matching or dguide constraint rewriting), in which case we need
> to partially substitute. */
> t = copy_node (t);
> + REQUIRES_EXPR_EXTRA_ARGS (t) = NULL_TREE;
> REQUIRES_EXPR_EXTRA_ARGS (t) = build_extra_args (t, args,
> info.complain);
> return t;
> }
> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> index 8cf0d5b7a8d..37f2392d035 100644
> --- a/gcc/cp/pt.cc
> +++ b/gcc/cp/pt.cc
> @@ -18718,7 +18718,7 @@ tsubst_stmt (tree t, tree args, tsubst_flags_t
> complain, tree in_decl)
> IF_COND (stmt) = IF_COND (t);
> THEN_CLAUSE (stmt) = THEN_CLAUSE (t);
> ELSE_CLAUSE (stmt) = ELSE_CLAUSE (t);
> - IF_STMT_EXTRA_ARGS (stmt) = build_extra_args (t, args, complain);
> + IF_STMT_EXTRA_ARGS (stmt) = build_extra_args (stmt, args, complain);
> add_stmt (stmt);
> break;
> }
> diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda6.C
> b/gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda6.C
> new file mode 100644
> index 00000000000..038c2a41210
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if-lambda6.C
> @@ -0,0 +1,16 @@
> +// PR c++/114303
> +// { dg-do compile { target c++17 } }
> +
> +struct A { static constexpr bool value = true; };
> +
> +int main() {
> + [](auto x1) {
> + return [&](auto) {
> + return [&](auto x3) {
> + if constexpr (decltype(x3)::value) {
> + static_assert(decltype(x1)::value);
> + }
> + }(A{});
> + }(0);
> + }(A{});
> +}
> --
> 2.44.0.165.ge09f1254c5
>
>