c++ - यह अमान्य-दिखने वाला कोड जी++ 6.0 पर सफलतापूर्वक क्यों संकलित करता है?




g++ (2)

मैंने अपने Fedora VM पर g++ संस्करण 5.1.1 साथ कमांड चलाया है और निम्नलिखित पाया है:

[user:~] 1 $ g++ -fdump-tree-original-raw tmp.cpp
tmp.cpp: In function int main()’:
tmp.cpp:3:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     int(*){} Is it C++14 or any other language?
       ^

हालांकि यह अभी भी संकलित करने में कामयाब रहा ... इसलिए मैंने एएसटी को डंप कर दिया है और यह मिल गया है:

$ cat tmp.cpp.003t.original 

;; Function int main() (null)
;; enabled by -tree-original

@1      return_expr      type: @2       expr: @3      
@2      void_type        name: @4       algn: 8       
@3      init_expr        type: @5       op 0: @6       op 1: @7      
@4      type_decl        name: @8       type: @2       srcp: <built-in>:0      
                         note: artificial 
@5      integer_type     name: @9       size: @10      algn: 32      
                         prec: 32       sign: signed   min : @11     
                         max : @12     
@6      result_decl      type: @5       scpe: @13      srcp: tmp.cpp:1      
                         note: artificial              size: @10     
                         algn: 32      
@7      integer_cst      type: @5      int: 0
@8      identifier_node  strg: void     lngt: 4       
@9      type_decl        name: @14      type: @5       srcp: <built-in>:0      
                         note: artificial 
@10     integer_cst      type: @15     int: 32
@11     integer_cst      type: @5      int: -2147483648
@12     integer_cst      type: @5      int: 2147483647
@13     function_decl    name: @16      type: @17      scpe: @18     
                         srcp: tmp.cpp:1               lang: C       
                         link: extern  
@14     identifier_node  strg: int      lngt: 3       
@15     integer_type     name: @19      size: @20      algn: 128     
                         prec: 128      sign: unsigned min : @21     
                         max : @22     
@16     identifier_node  strg: main     lngt: 4       
@17     function_type    size: @23      algn: 8        retn: @5      
                         prms: @24     
@18     translation_unit_decl 
@19     identifier_node  strg: bitsizetype             lngt: 11      
@20     integer_cst      type: @15     int: 128
@21     integer_cst      type: @15     int: 0
@22     integer_cst      type: @15     int: -1
@23     integer_cst      type: @15     int: 8
@24     tree_list        valu: @2      

जो एक टिप्पणी के अंदर फिट होने के लिए बहुत बड़ा है, लेकिन यह निर्धारित करने में उपयोगी होना चाहिए कि क्या चल रहा है। मैं अभी भी इस के माध्यम से जा रहा हूँ, लेकिन मैं सिर्फ दूसरों के लिए यह जानकारी पोस्ट कर रहा हूँ।

जिसकी कल्पना इस प्रकार की जाती है

https://code.i-harness.com

इस सवाल का पहले से ही यहाँ एक जवाब है:

इस अजीब कार्यक्रम पर विचार करें:

int main()
{
    int(*){} Is it C++14 or any other language?
}

( here और here एक लाइव डेमो देखें।)

भले ही टिप्पणी // अनुपलब्ध है, लेकिन जब मैं g ++ 6.0 में उपयोग -pedantic-errors विकल्पों का उपयोग -pedantic-errors हूं , तो कोड बिना किसी त्रुटि और चेतावनी के ठीक संकलित करता है। यह मुझे कंपाइलर बग जैसा लगता है। क्या यह वास्तव में संकलक में बग है?


यह उन सभी संस्करणों में बग + फ़ीचर / इश्यू के साथ g ++ प्रतीत होता है, जिन पर मैं इसका परीक्षण कर सकता हूं। चल रहा है

int main()
{
    int(*){} Is it C++14 or any other language?
}

संकलित झंडे वाले g ++ के सभी संस्करणों के लिए godbolt.org पर निम्नलिखित असेंबली ouput देते हैं।

main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    $0, %eax
    leave
    ret

एकमात्र निदान जो मुझे प्राप्त है, वह godbolt.org पर है और वह है

!!warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x

क्लैंग, आईसीसी और एमएसवीएस सभी इसे संकलित करने में विफल हैं।

संपादित करें:

टिप्पणियों से zwol ने इस पर gcc के साथ एक बग दर्ज किया। बग रिपोर्ट here पाई जा सकती here





g++