[Bug c++/104255] parsing function signature fails when it uses a function parameter outside of an unevaluated context
nickhuang99 at hotmail dot com
gcc-bugzilla@gcc.gnu.org
Fri Jan 28 18:48:53 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104255
--- Comment #3 from qingzhe huang <nickhuang99 at hotmail dot com> ---
(In reply to Patrick Palka from comment #2)
> The error message is obscure, but it seems what GCC has issue with here is
> the use of the function parameter seq2 in the trailing return type occurring
> outside of an unevaluated context.
>
The error messages are issued in a cascading fashion, the "outside function
parameter" is issued much later which maybe far-fetched from core one, in my
guess.
> I'm not totally sure if the testcase is valid
> (https://eel.is/c++draft/basic.scope.param#note-1 might suggest it's not?),
> but one workaround is to replace the use of seq2 in the trailing return type
> with decltype(seq2){} (which works because index_sequence is an empty type).
This is about "parameter-declaration-clause" which is not our case, because
"f(e)" is not function declaration part, instead an invoking of function of
which "e" is not "declaration" at all, but an argument of function.
> Here's a minimal testcase demonstrating the issue
>
> struct empty { };
> constexpr int f(empty) { return 0; }
> template<int> struct A { };
> auto g(empty e) -> A<f(e)>;
Again, GCC is only one rejecting this code
(https://www.godbolt.org/z/1bvMavKKd) which makes me suspect that GCC may not
be correct.
> which is rejected with
>
> error: use of parameter outside function body before ‘)’ token
>
> due to 'e' being used outside of an unevaluated context within the signature
> of the function.
BTW, this has nothing to do with c++20(no -std=c++20 is needed) which
eliminates potential issues of many c++20 new features. Thank you for your
simplified case which is a much clearer one to demonstrate the core issue.
More information about the Gcc-bugs
mailing list