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

            Bug ID: 90623
           Summary: compilation error with fold expression and parameter
                    pack
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: remi.louvot at gmail dot com
  Target Milestone: ---

This is (literally) a text book example of lambda expression with c++17, it
compiles fine with gcc8 and latest clang, but gcc9 throws an error around the
fold expression in which each expression takes the whole pack as third argument

source>: In instantiation of 'main()::<lambda(auto:4 ...)> [with auto:4 = {int,
int, int}]':
<source>:17:56:   required from here
<source>:11:36: error: redeclaration of 'const int xs#1'
   11 |                     (call_cart(f, xs, xs... ), ...); 


//compiled with -std=c++17

#include <iostream>

int main(){
  auto call_cart{[=](auto f, auto x, auto...rest) {
                (((x < rest) ? f(x, rest) : (void) 0), ...);
            }};
  auto cartesian{[=](auto...xs) {
    return [=](auto f) {
      (call_cart(f, xs, xs... ), ...); // ok with gcc8 // error with gcc9 
      // other version  without fold expression // same problem
      // (void)std::initializer_list<int>{((void)call_cart(f,xs,xs...),0)...};
    };
  }};

  constexpr auto print_cart{cartesian(1, 2, 3)};

  static_assert((print_cart([](int x, int y)constexpr{}),true));
  print_cart([](int x, int y) { std::cout << x << "," << y << std::endl; });
}

Reply via email to