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.

Reply via email to