https://gcc.gnu.org/g:5ee35b12de830a4688e79ed7ab464f281a220d3d
commit r16-3670-g5ee35b12de830a4688e79ed7ab464f281a220d3d Author: Eric Botcazou <ebotca...@adacore.com> Date: Mon Sep 8 19:41:20 2025 +0200 Ada: Make -fdump-ada-spec deal with pointers to anonymous structure This is about -fdump-ada-spec not generating the definition of the structure for pointers to anonymous structure as structure elements. gcc/c-family: PR ada/121544 * c-ada-spec.cc (dump_ada_node) <POINTER_TYPE>: Dump the name of anonymous tagged pointed-to types specially. (dump_nested_type) <POINTER_TYPE>: Recurse on anonymous pointed-to types declared in the same file. Set TREE_VISITED on the underlying DECL of the field type, if any. Diff: --- gcc/c-family/c-ada-spec.cc | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/gcc/c-family/c-ada-spec.cc b/gcc/c-family/c-ada-spec.cc index c7ae032230a8..42d75b49c94e 100644 --- a/gcc/c-family/c-ada-spec.cc +++ b/gcc/c-family/c-ada-spec.cc @@ -2442,8 +2442,14 @@ dump_ada_node (pretty_printer *pp, tree node, tree type, int spc, break; } - dump_ada_node (pp, ref_type, ref_type, spc, is_access, - true); + /* Dump anonymous tagged types specially. */ + if (TYPE_NAME (ref_type) + || (!RECORD_OR_UNION_TYPE_P (ref_type) + && TREE_CODE (ref_type) != ENUMERAL_TYPE)) + dump_ada_node (pp, ref_type, ref_type, spc, is_access, + true); + else + dump_anonymous_type_name (pp, ref_type); } } } @@ -2699,7 +2705,16 @@ dump_nested_type (pretty_printer *pp, tree field, tree t, int spc) { case POINTER_TYPE: tmp = TREE_TYPE (field_type); - dump_forward_type (pp, tmp, t, spc); + decl = get_underlying_decl (tmp); + if (TYPE_NAME (tmp) || !decl || DECL_NAME (decl)) + dump_forward_type (pp, tmp, t, spc); + else if (DECL_SOURCE_FILE (decl) == DECL_SOURCE_FILE (t) + && !TREE_VISITED (decl)) + { + /* Generate full declaration. */ + dump_nested_type (pp, decl, t, spc); + TREE_VISITED (decl) = 1; + } break; case ARRAY_TYPE: @@ -2773,6 +2788,11 @@ dump_nested_type (pretty_printer *pp, tree field, tree t, int spc) default: break; } + + /* Make sure not to output the nested type twice in C++. */ + decl = get_underlying_decl (field_type); + if (decl) + TREE_VISITED (decl) = 1; } /* Hash table of overloaded names that we cannot support. It is needed even