Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange compiler behaviour with generic lambda in C++14

Tags:

c++

gcc

c++14

I recently came across an interesting quirk of GCC, when using generic lambdas (C++14 feature that allows usage of auto as lambda parameter). It seems that using auto instead of type, somehow affects how "this" pointer is captured. I reproduced problem in following example:

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

Code above works. When I change "problematic lines" to:

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

It's not compiling anymore, however adding "this" pointer:

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

Resolves the issue. My question is: Is there any rational reason for such behaviour? Or is it GCC's irrational quirk (and maybe should be reported)?

Here is output from compiler on case with usage of auto without 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.

Compiled with GCC 5.3.1

like image 784
Maciej Baranowski Avatar asked Feb 26 '16 10:02

Maciej Baranowski


1 Answers

Thank you for comments. Indeed, it is GCC bug - my colleague just reported it to GCC support:

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

like image 80
Maciej Baranowski Avatar answered Oct 18 '22 03:10

Maciej Baranowski