GCC вызывает segfault для набора параметров lambda-capture

У меня есть следующий SSCCE:

#include <iostream>
#include <string>

void foo(const std::string &a) {
  std::cout << a << std::endl;
}

template <typename... Args>
void bar(Args &&... args) {
  [&]() {
    [&]() {
          foo(args...);
      }();
  }();
}

int main() {
 const std::string x("Hello World!");
 bar(x);
}

В соответствии с clang++ (3.9.1) это компилирует и испускает "Hello World". Gcc 6.3 выходит из строя с ошибкой сегментации в -O3.

Я могу исправить проблему, явно передав указатель и пакет по ссылке, заменив [&]() на [&args...](). Однако до сих пор я думал, что [&] будет делать то же самое, что перечислять все аргументы один за другим.

Так что здесь происходит не так?

P.S: Это не ограничивается -O3. -O0 не выполняет segfault, но не возвращает ожидаемый результат ( "Hello World!" ):

[:~/tmp] $ g++-6 -std=c++1z param.cpp && ./a.out

[:~/tmp] $

P.P.S: Дальнейшее сокращение SSCCE. Теперь я даже не получаю диагностику с -Wall -Wextra.

Ответы

Ответ 1

Я сильно подозреваю ошибку g++.


Вот несколько примечаний:

ошибка внутреннего компилятора: в make_decl_rtl, в varasm.c: 1304

...

Пожалуйста, отправьте полный отчет об ошибке с предварительно обработанным источником, если это необходимо.

Пожалуйста, включите полную обратную трассировку с любым сообщением об ошибке. Видеть http://gcc.gnu.org/bugs.html.