2017-01-20 10 views
18

Mam następujący SSCCE:GCC powoduje segfault dla lambda-schwytany parametrów paczki

#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); 
} 

Zgodnie z brzękiem ++ (3.9.1) to kompiluje i emituje "Hello World". Gcc 6.3 kończy się niepowodzeniem z błędem segmentacji pod numerem -O3.

Mogę naprawić problem, jawnie przekazując wskaźnik i pakiet przez odniesienie, zastępując [&]() z [&args...](). Jednak do tej pory myślałem, że [&] zrobi to samo, co lista wszystkich argumentów po kolei.

Co tu jest nie tak?

P.S: Nie jest to ograniczone do -O3. -O0 nie wysypać ale nie zwraca oczekiwanego rezultatu ("Hello World!"):

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

[:~/tmp] $ 

P.P.S: dalszemu ograniczeniu SSCCE. Teraz nie otrzymuję już diagnostyki z -Wall -Wextra.

+0

Wydaje się, że dzieje się to wyłącznie z optymalizacją. – chris

+0

Nie mogę potwierdzić - dzieje się dla mnie również z '-O0' (patrz addendum) – mrks

+1

@Exagon, Oczywiście można go przekazać przez odniesienie. Nie można go jednak skopiować. Oto przykład: http://melpon.org/wandbox/permlink/lj4SQhth5iis81FG – chris

Odpowiedz

9

Mocno podejrzewam, że g ++ bug.


Oto niektóre notatki:

internal compiler error: in make_decl_rtl, at varasm.c:1304

...

Please submit a full bug report, with preprocessed source if appropriate.

Please include the complete backtrace with any bug report. See http://gcc.gnu.org/bugs.html for instructions.

+1

Dziękuję za rozpatrzenie tego. Zgłaszałem błąd na https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79180 – mrks

Powiązane problemy