Created attachment 30649 [details]
If an enum class has a forward declaration and it is used as a class member (functions seem to be okay), the full debuginfo is not emitted when the definition appear later in the TU.
This makes debugging practically impossible.
enums are unusual in that they can be fully used even when they have just a definition.
Tested gcc versions:
g++-4.6 (Debian 4.6.4-2) 4.6.4
g++-4.7 (Debian 4.7.3-4) 4.7.3
g++-4.8 (Debian 4.8.1-8) 4.8.1
Versions before 4.6 did not implement forward declarations of enum classes, so this bug is primordial.
The relevant part of the debug information looks like:
<1><34>: Abbrev Number: 3 (DW_TAG_enumeration_type)
<35> DW_AT_name : (indirect string, offset: 0x84): ByteCode
<39> DW_AT_enum_class : 1
<39> DW_AT_declaration : 1
<39> DW_AT_byte_size : 1
<3a> DW_AT_decl_file : 1
<3b> DW_AT_decl_line : 3
Whereas clang generates:
<1><6f>: Abbrev Number: 6 (DW_TAG_enumeration_type)
<70> DW_AT_type : <0x64>
<74> DW_AT_enum_class : 1
<75> DW_AT_name : (indirect string, offset: 0x98): ByteCode
<79> DW_AT_byte_size : 1
<7a> DW_AT_decl_file : 1
<7b> DW_AT_decl_line : 10
Still present in gcc 4.9 as of 2014-03-22
Currently I'm hacking around this by using a gdb pretty printer that hard-codes the enum values and turns them into strings, but that only works for printing, not calls.
Created attachment 42381 [details]
I was generating a testcase before discovering this bug.
Problem is the same:
A class/struct using a prototyped, not yet defined "enum class" will prevent that debug information for this "enum class" to be emitted.
Only if no class/struct uses a "enum class" before its defined, the debug info will be available.
Affected: GCC 5.3.0, GCC 6.4.0, GCC 7.2.0
Please fix this, it really makes debugging a pain
(In reply to npl from comment #2)
> Created attachment 42381 [details]
> another testcase
> I was generating a testcase before discovering this bug.
> Problem is the same:
> A class/struct using a prototyped, not yet defined "enum class" will prevent
> that debug information for this "enum class" to be emitted.
> Only if no class/struct uses a "enum class" before its defined, the debug
> info will be available.
> Affected: GCC 5.3.0, GCC 6.4.0, GCC 7.2.0
> Please fix this, it really makes debugging a pain
Taking this as confirmation.
Created attachment 43606 [details]
Date: Sun Mar 11 16:50:08 2018
New Revision: 258434
* dwarf2out.c (gen_enumeration_type_die): Don't guard adding
DW_AT_declaration for ENUM_IS_OPAQUE on -gdwarf-4 or -gno-strict-dwarf,
but on TYPE_SIZE. Don't do anything for ENUM_IS_OPAQUE if not creating
a new die. Don't set TREE_ASM_WRITTEN if ENUM_IS_OPAQUE. Guard
addition of most attributes on !orig_type_die or the attribute not
being present already. Assert TYPE_VALUES is NULL for ENUM_IS_OPAQUE.
* g++.dg/debug/dwarf2/enum2.C: New test.
Fixed for 8.1+.