2017-01-20 13 views
18

Tôi có SSCCE sau:GCC gây segfault cho lambda-bắt gói thông số

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

Dưới kêu vang ++ (3.9.1) này biên soạn và phát ra "Hello World". Gcc 6.3 không thành công với lỗi phân đoạn theo -O3.

Tôi có thể khắc phục sự cố bằng cách chuyển con trỏ và gói theo cách rõ ràng, thay thế [&]() bằng [&args...](). Tuy nhiên, cho đến bây giờ, tôi nghĩ rằng [&] sẽ làm tương tự như liệt kê tất cả các đối số một.

Vậy có gì sai ở đây?

P.S: Điều này không giới hạn ở -O3. -O0 không phân đoạn nhưng không trả lại kết quả mong đợi ("Hello World!"):

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

[:~/tmp] $ 

P.P.S: Giảm SSCCE. Bây giờ tôi thậm chí không nhận được chẩn đoán với -Wall -Wextra nữa.

+0

Dường như chỉ xảy ra với tối ưu hóa. – chris

+0

Không thể xác nhận - xảy ra với tôi bằng '-O0' (xem phụ lục) – mrks

+1

@Exagon, Tất nhiên nó có thể được chuyển xung quanh bằng cách tham chiếu. Nó không thể được sao chép, mặc dù. Dưới đây là ví dụ: http://melpon.org/wandbox/permlink/lj4SQhth5iis81FG – chris

Trả lời

9

Tôi thật sự nghi ngờ một lỗi g ++.


Dưới đây là một số lưu ý:

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

Cảm ơn bạn đã xem xét điều này. Tôi đã gửi một lỗi tại https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79180 – mrks

Các vấn đề liên quan