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

            Bug ID: 118117
           Summary: Array Of Nested Structs Makes Inner Struct Anonymous
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lgomez at windhoverlabs dot com
  Target Milestone: ---

Given the following code

```
#define USE_VIRTUAL
#define USE_ARRAY
struct t1
{
    typedef struct
    {
    } t2;
#ifdef USE_VIRTUAL
    virtual void f1();
#endif
};

t1::t2 v1
#ifdef USE_ARRAY
[1]
#endif
;
```

"v1" shows up as anonymous on DWARF:


<source>:       file format elf32-littlearm

.debug_info contents:
0x00000000: Compile Unit: length = 0x00000051, format = DWARF32, version =
0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x04 (next
unit at 0x00000055)

0x0000000c: DW_TAG_compile_unit
              DW_AT_producer    ("GNU C++17 14.2.0 -mcpu=arm7tdmi
-mfloat-abi=soft -marm -march=armv4t -g")
              DW_AT_language    (DW_LANG_C_plus_plus_14)
              DW_AT_name        ("/app/example.cpp")
              DW_AT_comp_dir    ("/app")
              DW_AT_stmt_list   (0x00000000)

0x0000001e:   DW_TAG_structure_type
                DW_AT_name      ("t1")
                DW_AT_declaration       (true)
                DW_AT_sibling   (0x0000002c)

0x00000026:     DW_TAG_structure_type
                  DW_AT_byte_size       (0x01)
                  DW_AT_decl_file       ("/app/example.cpp")
                  DW_AT_decl_line       (3)
                  DW_AT_decl_column     (20)

0x0000002b:     NULL

0x0000002c:   DW_TAG_array_type
                DW_AT_type      (0x00000026 "t1::structure ")
                DW_AT_sibling   (0x0000003c)

0x00000035:     DW_TAG_subrange_type
                  DW_AT_type    (0x0000003c "unsigned int")
                  DW_AT_upper_bound     (0x00)

0x0000003b:     NULL

0x0000003c:   DW_TAG_base_type
                DW_AT_byte_size (0x04)
                DW_AT_encoding  (DW_ATE_unsigned)
                DW_AT_name      ("unsigned int")

0x00000043:   DW_TAG_variable
                DW_AT_name      ("v1")
                DW_AT_decl_file ("/app/example.cpp")
                DW_AT_decl_line (10)
                DW_AT_decl_column       (8)
                DW_AT_type      (0x0000002c "t1::structure [1]")
                DW_AT_external  (true)
                DW_AT_location  (DW_OP_addr 0x0)

0x00000054:   NULL


Notice that "v1" points to an array which points to an anonymous struct (a
DW_TAG_structure_type with no DW_AT_name attribute)

If I were to undef "USE_ARRAY" I get the following output:


<source>:       file format elf32-littlearm

.debug_info contents:
0x00000000: Compile Unit: length = 0x00000049, format = DWARF32, version =
0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x04 (next
unit at 0x0000004d)

0x0000000c: DW_TAG_compile_unit
              DW_AT_producer    ("GNU C++17 14.2.0 -mcpu=arm7tdmi
-mfloat-abi=soft -marm -march=armv4t -g")
              DW_AT_language    (DW_LANG_C_plus_plus_14)
              DW_AT_name        ("/app/example.cpp")
              DW_AT_comp_dir    ("/app")
              DW_AT_stmt_list   (0x00000000)

0x0000001e:   DW_TAG_structure_type
                DW_AT_name      ("t1")
                DW_AT_declaration       (true)
                DW_AT_sibling   (0x0000003b)

0x00000026:     DW_TAG_structure_type
                  DW_AT_byte_size       (0x01)
                  DW_AT_decl_file       ("/app/example.cpp")
                  DW_AT_decl_line       (3)
                  DW_AT_decl_column     (20)
                  DW_AT_linkage_name    ("N2t12t2E")

0x0000002f:     DW_TAG_typedef
                  DW_AT_name    ("t2")
                  DW_AT_decl_file       ("/app/example.cpp")
                  DW_AT_decl_line       (4)
                  DW_AT_decl_column     (7)
                  DW_AT_type    (0x00000026 "t1::structure ")

0x0000003a:     NULL

0x0000003b:   DW_TAG_variable
                DW_AT_name      ("v1")
                DW_AT_decl_file ("/app/example.cpp")
                DW_AT_decl_line (10)
                DW_AT_decl_column       (8)
                DW_AT_type      (0x0000002f "t1::t2")
                DW_AT_external  (true)
                DW_AT_location  (DW_OP_addr 0x0)

0x0000004c:   NULL



Which is one what one would expect since in source code I can refer to the type
"t1::t2" pretty concretely.

I should point out that this DOES NOT happen in clang x86-64 19.10:

```

<source>:       file format elf64-x86-64

.debug_info contents:
0x00000000: Compile Unit: length = 0x00000059, format = DWARF32, version =
0x0004, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x0000005d)

0x0000000b: DW_TAG_compile_unit
              DW_AT_producer    ("clang version 19.1.0
(https://github.com/llvm/llvm-project.git
a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)")
              DW_AT_language    (DW_LANG_C_plus_plus_14)
              DW_AT_name        ("/app/example.cpp")
              DW_AT_stmt_list   (0x00000000)
              DW_AT_comp_dir    ("/app")

0x0000001e:   DW_TAG_variable
                DW_AT_name      ("v1")
                DW_AT_type      (0x00000033 "t1::t2[1]")
                DW_AT_external  (true)
                DW_AT_decl_file ("/app/example.cpp")
                DW_AT_decl_line (11)
                DW_AT_location  (DW_OP_addr 0x0)

0x00000033:   DW_TAG_array_type
                DW_AT_type      (0x00000044 "t1::t2")

0x00000038:     DW_TAG_subrange_type
                  DW_AT_type    (0x00000055 "__ARRAY_SIZE_TYPE__")
                  DW_AT_count   (0x01)

0x0000003e:     NULL

0x0000003f:   DW_TAG_structure_type
                DW_AT_name      ("t1")
                DW_AT_declaration       (true)

0x00000044:     DW_TAG_typedef
                  DW_AT_type    (0x0000004f "t1::structure ")
                  DW_AT_name    ("t2")
                  DW_AT_decl_file       ("/app/example.cpp")
                  DW_AT_decl_line       (4)

0x0000004f:     DW_TAG_structure_type
                  DW_AT_calling_convention      (DW_CC_pass_by_value)
                  DW_AT_byte_size       (0x01)
                  DW_AT_decl_file       ("/app/example.cpp")
                  DW_AT_decl_line       (3)

0x00000054:     NULL

0x00000055:   DW_TAG_base_type
                DW_AT_name      ("__ARRAY_SIZE_TYPE__")
                DW_AT_byte_size (0x08)
                DW_AT_encoding  (DW_ATE_unsigned)

0x0000005c:   NULL



```


If you want to explore the code:https://godbolt.org/z/n6MfoGhGd


Hope this report was clear and concise.

Thanks
Lorenzo

Reply via email to