https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102999

            Bug ID: 102999
           Summary: g++-11 regression: sorry, unimplemented: unexpected
                    AST of kind nontype_argument_pack
           Product: gcc
           Version: 11.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: cantonios at google dot com
  Target Milestone: ---

The following code works with g++ in versions prior to 11, as well as all
versions of clang, but fails as of at least 11.1 (according to godbolt).
---
#include <type_traits>

template<typename T, T... nn>
struct numeric_list {};

template<class a, class b> struct concat;
template<typename T, T... as, T... bs>
struct concat<numeric_list<T, as...>, numeric_list<T, bs...> > { typedef
numeric_list<T, as..., bs...> type; };

template<int n, typename x> struct take;

// The following fail in gcc-11.*.
template<typename T, int n, T a, T... as> struct take<n, numeric_list<T, a,
as...>> : concat<numeric_list<T, a>, typename take<n-1, numeric_list<T,
as...>>::type> {};
template<typename T, int n>               struct take<n, numeric_list<T>>      
    { typedef numeric_list<T> type; };
template<typename T, T a, T... as>        struct take<0, numeric_list<T, a,
as...>> { typedef numeric_list<T> type; };
template<typename T>                      struct take<0, numeric_list<T>>      
    { typedef numeric_list<T> type; };

int main() {
  typedef numeric_list<int, 0, 1, 2, 3, 4, 5> a;
  typedef typename take<6, a>::type b;
  return 0;
}
---
<source>: In instantiation of 'struct take<1, numeric_list<int, 5> >':
<source>:13:50:   recursively required from 'struct take<5, numeric_list<int,
1, 2, 3, 4, 5> >'
<source>:13:50:   required from 'struct take<6, numeric_list<int, 0, 1, 2, 3,
4, 5> >'
<source>:20:30:   required from here
<source>:13:50: sorry, unimplemented: unexpected AST of kind
nontype_argument_pack
   13 | template<typename T, int n, T a, T... as> struct take<n,
numeric_list<T, a, as...>> : concat<numeric_list<T, a>, typename take<n-1,
numeric_list<T, as...>>::type> {};
      |  
---
https://godbolt.org/z/4fMafha3z

Local version info:
$ g++-11 --version
g++-11 (Debian 11.2.0-8) 11.2.0

The code is extracted from Eigen
(https://gitlab.com/libeigen/eigen/-/blob/master/unsupported/Eigen/CXX11/src/util/CXX11Meta.h).
 We're trying to expand our CI coverage, and noticed that it fails to build for
gcc-11.

Reply via email to