Странное поведение компилятора с общей лямбдой в C++14

Недавно я столкнулся с интересной особенностью GCC при использовании общих лямбда-выражений (функция С++ 14, позволяющая использовать auto в качестве лямбда-параметра). Кажется, что использование auto вместо type как-то влияет на захват указателя this. Я воспроизвел проблему в следующем примере:

#include <cstdio>

class A { private:
    void method(int i) {
        printf("Method Call %d",i);
    }

public:
    void publicMethod() {
        auto lambda = [&] (const int k) { //problematic line
            method(k);                    //problematic line
        };
        lambda(42);
    } };

int main() {
    A a;
    a.publicMethod();
    return 0; }

Код выше работает. Когда я меняю «проблемные строки» на:

        auto lambda = [&] (const auto k) { //problematic line
            method(k);                     //problematic line

Он больше не компилируется, но добавляет указатель «this»:

        auto lambda = [&] (const auto k) { //problematic line
            this->method(k);               //problematic line

Решает проблему. Мой вопрос: есть ли какая-то рациональная причина для такого поведения? Или это иррациональная причуда GCC (о которой, возможно, следует сообщить)?

Вот вывод компилятора в случае использования auto без this

test.cpp: In lambda function:
test.cpp:12:13: internal compiler error: Segmentation fault
             method(k);
             ^
0x848ecc crash_signal
    ../../src/gcc/toplev.c:383
0xea28e5 size_binop_loc(unsigned int, tree_code, tree_node*, tree_node*)
    ../../src/gcc/fold-const.c:1768
0xee86d7 gimplify_compound_lval
    ../../src/gcc/gimplify.c:2039
0xee86d7 gimplify_expr(tree_node**, gimple_statement_base**, gimple_statement_base**, bool (*)(tree_node*), int)
    ../../src/gcc/gimplify.c:8052
0xeeb639 gimplify_arg(tree_node**, gimple_statement_base**, unsigned int)
    ../../src/gcc/gimplify.c:2271
0xeeb639 gimplify_call_expr
    ../../src/gcc/gimplify.c:2477
0xee89f2 gimplify_expr(tree_node**, gimple_statement_base**, gimple_statement_base**, bool (*)(tree_node*), int)
    ../../src/gcc/gimplify.c:8071
0xee8da7 gimplify_stmt(tree_node**, gimple_statement_base**)
    ../../src/gcc/gimplify.c:5519
0xee8da7 gimplify_cleanup_point_expr
    ../../src/gcc/gimplify.c:5295
0xee8da7 gimplify_expr(tree_node**, gimple_statement_base**, gimple_statement_base**, bool (*)(tree_node*), int)
    ../../src/gcc/gimplify.c:8463
0xee7ace gimplify_stmt(tree_node**, gimple_statement_base**)
    ../../src/gcc/gimplify.c:5519
0xee94db gimplify_bind_expr
    ../../src/gcc/gimplify.c:1136
0xee94db gimplify_expr(tree_node**, gimple_statement_base**, gimple_statement_base**, bool (*)(tree_node*), int)
    ../../src/gcc/gimplify.c:8297
0xee757f gimplify_stmt(tree_node**, gimple_statement_base**)
    ../../src/gcc/gimplify.c:5519
0xee757f gimplify_body(tree_node*, bool)
    ../../src/gcc/gimplify.c:9234
0xee72fd gimplify_function_tree(tree_node*)
    ../../src/gcc/gimplify.c:9388
0xe195e0 cgraph_node::analyze()
    ../../src/gcc/cgraphunit.c:634
0xe195e0 analyze_functions
    ../../src/gcc/cgraphunit.c:1024
0x127d1ab symbol_table::finalize_compilation_unit()
    ../../src/gcc/cgraphunit.c:2453
0xd37db5 cp_write_global_declarations()
    ../../src/gcc/cp/decl2.c:4843
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <file:///usr/share/doc/gcc-5/README.Bugs> for instructions.

Скомпилировано с GCC 5.3.1


person Maciej Baranowski    schedule 26.02.2016    source источник
comment
internal compiler error Это ошибка компилятора.   -  person bolov    schedule 26.02.2016
comment
В Clang это работает с отступом.   -  person Kerrek SB    schedule 26.02.2016


Ответы (1)


Спасибо за комментарии. Действительно, это ошибка GCC — мой коллега только что сообщил об этом в службу поддержки GCC:

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

person Maciej Baranowski    schedule 26.02.2016