[PATCH] c++: consteval-defarg1.C test variant for templates

Jason Merrill jason@redhat.com
Thu Dec 3 14:04:25 GMT 2020


On 12/3/20 4:29 AM, Jakub Jelinek wrote:
> 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?

OK, thanks.

> 2020-12-03  Jakub Jelinek  <jakub@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
> 



More information about the Gcc-patches mailing list