enum型とtypeof()とgccとg++
次のような C のコードを gcc でコンパイルしたとき、シンボル「a」のデバッグ情報がどのように DWARF になっているかを dwarfdump で見てみると...
enum X { A };
typeof(A)* a;
なんかとても残念なことになっていた。
LOCAL_SYMBOLS: <1>< 45> DW_TAG_enumeration_type DW_AT_name X DW_AT_byte_size 4 DW_AT_decl_file 1 GNU C 4.4.1/test.c DW_AT_decl_line 1 DW_AT_sibling <60> <2>< 55> DW_TAG_enumerator DW_AT_name A DW_AT_const_value 0 <1>< 60> DW_TAG_variable DW_AT_name a DW_AT_decl_file 1 GNU C 4.4.1/test.c DW_AT_decl_line 3 DW_AT_type <80> DW_AT_external yes(1) DW_AT_location DW_OP_addr 0 <1>< 80> DW_TAG_pointer_type DW_AT_byte_size 8 DW_AT_type <86> <1>< 86> DW_TAG_base_type DW_AT_byte_size 4 DW_AT_encoding DW_ATE_signed DW_AT_name int
一方、同じコードを g++ でコンパイルすると、正しく
LOCAL_SYMBOLS: <1>< 45> DW_TAG_enumeration_type DW_AT_name X DW_AT_byte_size 4 DW_AT_decl_file 1 /tmp/test.c DW_AT_decl_line 1 DW_AT_sibling <60> <2>< 55> DW_TAG_enumerator DW_AT_name A DW_AT_const_value 0 <1>< 60> DW_TAG_variable DW_AT_name a DW_AT_decl_file 1 /tmp/test.c DW_AT_decl_line 3 DW_AT_type <80> DW_AT_external yes(1) DW_AT_location DW_OP_addr 0 <1>< 80> DW_TAG_pointer_type DW_AT_byte_size 8 DW_AT_type <45>
となってくれていたりする。
(4.4.1 で確認)