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 で確認)