2016-02-26 11 views
6

में जेनेरिक लैम्ब्डा के साथ अजीब कंपाइलर व्यवहार जेनेरिक लैम्बडास (सी ++ 14 सुविधा का उपयोग करते समय हाल ही में जीसीसी के एक दिलचस्प क्विर्क में आया, जो auto को लैम्ब्डा पैरामीटर के रूप में उपयोग करने की अनुमति देता है)। ऐसा लगता है कि प्रकार के बजाय ऑटो का उपयोग करके, किसी भी तरह से यह संकेत मिलता है कि "यह" पॉइंटर कैप्चर किया जाता है। मैंने निम्नलिखित उदाहरण में समस्या का पुनरुत्पादन किया:सी ++ 14

#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 

यह अब संकलन नहीं कर रहा है लेकिन जोड़ने "इस" सूचक:

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

मुद्दा समाधान करता है। मेरा सवाल है: क्या इस तरह के व्यवहार के लिए कोई तर्कसंगत कारण है? या यह जीसीसी की अपरिमेय quirk (और शायद रिपोर्ट किया जाना चाहिए) है?

यहाँ 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. 

जीसीसी 5.3.1

+12

'यही error' आंतरिक संकलक एक संकलक बग है। – bolov

+0

क्लैंग पर [इंडेंट के रूप में काम करता है] (http://melpon.org/wandbox/permlink/lTOF7QxfICP6sW0l)। –

उत्तर

3

टिप्पणी के लिए धन्यवाद के साथ संकलित बिना auto के उपयोग के साथ इस मामले पर संकलक से उत्पादन होता है। वास्तव में, यह जीसीसी बग है - अपने साथी सिर्फ जीसीसी समर्थन करने के लिए यह बताया:

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

संबंधित मुद्दे