https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104255
Bug ID: 104255 Summary: parsing trailing return type fails with parameter pack expansion when two parameter packs at present Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: nickhuang99 at hotmail dot com Target Milestone: --- The following template function causes error when we define trailing return type which is identical to what function body actual returning ( https://www.godbolt.org/z/n3nbW785o ) template<size_t N, size_t...Is> constexpr size_t identity2(index_sequence<Is...>seq){ return N; } template<size_t...Seq1, size_t...Seq2> auto getSeq2(index_sequence<Seq1...>seq1, index_sequence<Seq2...>seq2) // this trailing return type causing parsing error of parameter pack ->index_sequence<(identity2<Seq1, Seq2...>(seq2))...>; { return index_sequence<(identity2<Seq1, Seq2...>(seq2))...>{}; } As a positive example against above, when "identity1" takes no parameter pack as template argument, it works fine. template<size_t N> constexpr size_t identity1(){ return N; } template<size_t...Indexes> auto getSeq1(index_sequence<Indexes...>indexes) // trailing return type works, no need to define function body at all. ->index_sequence<(identity1<Indexes>())...>; clang13/MSVC all work as expected.