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

            Bug ID: 83856
           Summary: ICE in tsubst_copy;
           Product: gcc
           Version: 7.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kretz at kde dot org
  Target Milestone: ---

Testcase (cf. https://godbolt.org/g/jFkk7N):
```
#include <array>

template <class T> struct simd
{
  static constexpr size_t size() { return 4; }
  template <class F> simd(F &&gen, decltype(std::declval<F>()(0)) * = nullptr)
{}
};

template <class V, class... F>
void test_tuples(const std::initializer_list<std::array<float, 1>> &data,
                 F &&... fun_pack)
{
  auto it = data.begin();
  const int remaining = data.size() % V::size();
  if (remaining > 0) {
    [](auto...) {
    }((fun_pack(V([&](auto i) { return it[i < remaining ? i : 0][0]; })),
0)...);
  }
}

void f()
{
  test_tuples<simd<float>>({}, [](simd<float> x) {});
}
```

Output when compiling with GCC g++-7 (Ubuntu 7.2.0-1ubuntu1~16.04) 7.2.0:
```
ice.cpp: In instantiation of ‘test_tuples(const
std::initializer_list<std::array<float, 1> >&, F&& ...)::<lambda(auto:2)> [with
auto:2 = int; V = simd<float>; F = {f()::<lambda(simd<float>)>}]’:
ice.cpp:6:62:   required by substitution of ‘template<class F>
simd<float>::simd(F&&, decltype (declval<F>()(0))*) [with F = test_tuples(const
std::initializer_list<std::array<float, 1> >&, F&& ...) [with V = simd<float>;
F = {f()::<lambda(simd<float>)>}]::<lambda(auto:2)> ’
ice.cpp:17:17:   required from ‘void test_tuples(const
std::initializer_list<std::array<float, 1> >&, F&& ...) [with V = simd<float>;
F = {f()::<lambda(simd<float>)>}]’
ice.cpp:23:52:   required from here
ice.cpp:14:25: internal compiler error: in tsubst_copy, at cp/pt.c:14539
   const int remaining = data.size() % V::size();
                         ^~~~
0x5eb5c2 tsubst_copy
        ../../src/gcc/cp/pt.c:14539
0x5ef666 tsubst_copy
        ../../src/gcc/cp/pt.c:14515
0x5ef666 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:17831
0x5ef450 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:16769
0x5ef549 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:17611
0x5ef086 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:17232
0x5ef748 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:16934
0x5e83c7 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
        ../../src/gcc/cp/pt.c:16550
0x5e95f1 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
        ../../src/gcc/cp/pt.c:14477
0x5e95f1 tsubst_init
        ../../src/gcc/cp/pt.c:14483
0x5eb558 tsubst_copy
        ../../src/gcc/cp/pt.c:14681
0x5ef666 tsubst_copy
        ../../src/gcc/cp/pt.c:14515
0x5ef666 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:17831
0x5ef765 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:16935
0x5ef81b tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:17477
0x5ef505 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:16967
0x5ef4e9 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../src/gcc/cp/pt.c:16965
0x5e83c7 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
        ../../src/gcc/cp/pt.c:16550
0x5e7f85 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
        ../../src/gcc/cp/pt.c:15811
0x5e810b tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool)
        ../../src/gcc/cp/pt.c:16027
```

GCC 8 appears to be fixed.

Reply via email to