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.