diff --git a/gcc/c-family/c-ada-spec.cc b/gcc/c-family/c-ada-spec.cc index b50b38775..b95fae0cc 100644 --- a/gcc/c-family/c-ada-spec.cc +++ b/gcc/c-family/c-ada-spec.cc @@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see static int dump_ada_node (pretty_printer *, tree, tree, int, bool, bool); static int dump_ada_declaration (pretty_printer *, tree, tree, int); static void dump_ada_structure (pretty_printer *, tree, tree, bool, int); +static void dump_nested_types (pretty_printer *, tree, int); static char *to_ada_name (const char *, bool *); #define INDENT(SPACE) \ @@ -1909,2 +1910,3 @@ dump_ada_template (pretty_printer *buffer, tree t, int spc) TREE_VISITED (get_underlying_decl (instance)) = 1; + dump_nested_types (buffer, TYPE_NAME (instance), spc); pp_string (buffer, "type "); diff --git a/gcc/testsuite/g++.dg/ada-spec/template-nested-types.C b/gcc/testsuite/g++.dg/ada-spec/template-nested-types.C new file mode 100644 index 000000000..d4ca15a51 --- /dev/null +++ b/gcc/testsuite/g++.dg/ada-spec/template-nested-types.C @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-std=gnu++20 -fdump-ada-spec-slim" } */ +/* { dg-final { scan-file template_nested_types_c.ads "package Buffer_int_4 is" } } */ +/* { dg-final { scan-file template_nested_types_c.ads "package Defaults_int_2 is" } } */ +/* { dg-final { scan-file template_nested_types_c.ads "type anon_array[0-9]+ is array \(0 \.\. 3\) of aliased int;" } } */ +/* { dg-final { scan-file template_nested_types_c.ads "type anon_array[0-9]+ is array \(0 \.\. 1\) of aliased int;" } } */ + +template +struct Buffer +{ + T values[N]; +}; + +template struct Buffer; + +template +struct Defaults +{ + T values[N]; +}; + +template struct Defaults<>; + +extern "C" int +buffer_sum (const Buffer *value) +{ + return value->values[0] + value->values[1] + + value->values[2] + value->values[3]; +} + +extern "C" int +defaults_sum (const Defaults<> *value) +{ + return value->values[0] + value->values[1]; +} + +/* { dg-final { cleanup-ada-spec } } */