On Wed, Dec 02, 2020 at 10:15:25PM -0500, Jason Merrill wrote: > Jakub noticed that we weren't recognizing a default argument for a consteval > member function as being in immediate function context because there was no > function parameter scope to look at. > > Note that this patch doesn't actually push the parameters into the scope, > that happens in a separate commit.
Shouldn't we also be testing how it behaves in templates? The following testcase is an attempt to test both non-dependent and dependent consteval calls in both function and class templates, and with your committed patch it now passes. Ok for trunk? 2020-12-03 Jakub Jelinek <ja...@redhat.com> * g++.dg/cpp2a/consteval-defarg2.C: New test. --- gcc/testsuite/g++.dg/cpp2a/consteval-defarg2.C.jj 2020-12-03 10:26:16.340256056 +0100 +++ gcc/testsuite/g++.dg/cpp2a/consteval-defarg2.C 2020-12-03 10:19:33.215853790 +0100 @@ -0,0 +1,29 @@ +// Test that late-parsed default args have the same consteval semantics. +// { dg-do compile { target c++20 } } + +template <int N> +consteval bool foo (bool x) { if (x) throw N; return false; } +consteval bool qux (bool x) { if (x) throw 1; return false; } +template <int N> +consteval bool bar (bool x = foo<N> (true)) { return true; } +template <int N> +consteval bool corge (bool x = qux (true)) { return true; } +template <int N> +struct S +{ + consteval static bool baz (bool x = foo<N> (true)) { return true; } + consteval static bool garply (bool x = qux (true)) { return true; } +}; +struct T +{ + template <int N> + consteval static bool baz (bool x = foo<N> (true)) { return true; } + template <int N> + consteval static bool garply (bool x = qux (true)) { return true; } +}; +constexpr bool a = bar<0> (true); +constexpr bool b = corge<0> (true); +constexpr bool c = S<0>::baz (true); +constexpr bool d = S<0>::garply (true); +constexpr bool e = T::baz<0> (true); +constexpr bool f = T::garply<0> (true); Jakub