Re: [PATCH] Fix type of imported variable for arraydim.exp

Tom de Vries <[email protected]> Fri, 31 Jul 2026 14:01:54 +0200
Newsgroups gmane.comp.gdb.patches
Message-ID <[email protected]>
On 7/30/26 6:59 PM, Tom Tromey wrote:
> The test code for gdb.ada/arraydim.exp imports a variable using a
> dummy type.  Then the test tries to print the type of this variable.
> This works ok with GCC, because the import is emitted as a
> declaration; but this fails with gnat-llvm, where a definition is
> emitted.
> 
> This seems to be a test bug to me.  This patch fixes the problem by
> using the correct type here.

Hi Tom,

thanks for fixing this.

Do I understand it correctly that there are two (independent) issues:
- decl vs def: fixed in arraydim.exp
- dummy type vs correct type: fixed in arraydim/foo.adb
?

Anyway, the changes in arraydim.exp look fine to me.

Given that it's Ada, I can't really comment on the changes in 
arraydim/foo.adb.

I did wonder if the test-case still functioned as regression test after 
these changes, so I reverse-applied commit 8a48ac9579f ("wrong dimension 
found in ada-lang.c:ada_array_bound_from_type"):
...
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 3c6c9af488f..0f28ce65239 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -3360,7 +3360,7 @@ ada_index_type (struct type *type, int n, const 
char *name)
  static LONGEST
  ada_array_bound_from_type (struct type *arr_type, int n, int which)
  {
-  struct type *type, *index_type_desc, *index_type;
+  struct type *type, *elt_type, *index_type_desc, *index_type;
    int i;

    gdb_assert (which == 0 || which == 1);
@@ -3376,6 +3376,10 @@ ada_array_bound_from_type (struct type *arr_type, 
int n, int which)
    else
      type = arr_type;

+  elt_type = type;
+  for (i = n; i > 1; i--)
+    elt_type = type->target_type ();
+
    if (type->is_fixed_instance ())
      {
        /* The array has already been fixed, so we do not need to
@@ -3393,14 +3397,7 @@ ada_array_bound_from_type (struct type *arr_type, 
int n, int which)
      index_type = to_fixed_range_type (index_type_desc->field (n - 
1).type (),
  				      NULL);
    else
-    {
-      struct type *elt_type = check_typedef (type);
-
-      for (i = 1; i < n; i++)
-	elt_type = check_typedef (elt_type->target_type ());
-
-      index_type = elt_type->index_type ();
-    }
+    index_type = elt_type->index_type ();

    return (which == 0
  	  ? ada_discrete_type_low_bound (index_type)
...
and managed to detect the regression with and without this patch.

Reviewed-By: Tom de Vries <[email protected]>

Thanks,
- Tom

> ---
>   gdb/testsuite/gdb.ada/arraydim.exp     | 7 ++++++-
>   gdb/testsuite/gdb.ada/arraydim/foo.adb | 7 ++-----
>   2 files changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/gdb/testsuite/gdb.ada/arraydim.exp b/gdb/testsuite/gdb.ada/arraydim.exp
> index 7b84a7af9b7..815a91ffa82 100644
> --- a/gdb/testsuite/gdb.ada/arraydim.exp
> +++ b/gdb/testsuite/gdb.ada/arraydim.exp
> @@ -52,8 +52,13 @@ gdb_test "print m'first(3)" " = 4"
>   gdb_test "print m'last(3)" " = 6"
>   gdb_test "print m'length(3)" " = 3"
>   
> +# With GCC the test shows "int" as the element type, but with
> +# gnat-llvm it shows "integer"; both of these are reasonable enough so
> +# we accept either.  The difference here is because GCC emits a
> +# declaration in the DWARF for foo.o, but gnat-llvm emits a
> +# definition.
>   gdb_test "ptype global_3dim_for_gdb_testing" \
> -    "array \\(0 \\.\\. 0, 0 \\.\\. 1, 0 \\.\\. 2\\) of int"
> +    [quotemeta "array (0 .. 0, 0 .. 1, 0 .. 2) of @/(int|integer)/"]
>   
>   gdb_test "print global_3dim_for_gdb_testing'first" " = 0"
>   gdb_test "print global_3dim_for_gdb_testing'last" " = 0"
> diff --git a/gdb/testsuite/gdb.ada/arraydim/foo.adb b/gdb/testsuite/gdb.ada/arraydim/foo.adb
> index 86204956d00..8da63e1af93 100644
> --- a/gdb/testsuite/gdb.ada/arraydim/foo.adb
> +++ b/gdb/testsuite/gdb.ada/arraydim/foo.adb
> @@ -18,11 +18,8 @@ procedure Foo is
>      type Multi is array (1 .. 1, 2 .. 3, 4 .. 6) of Integer;
>      M : Multi := (others => (others => (others => 0)));
>   
> -   --  Use a fake type for importing our C multi-dimensional array.
> -   --  It's only to make sure the C unit gets linked in, regardless
> -   --  of possible optimizations.
> -   type Void_Star is access integer;
> -   E : Void_Star;
> +   type C_Multi is array (0 .. 0, 0 .. 1, 0 .. 2) of Integer;
> +   E : C_Multi;
>      pragma Import (C, E, "global_3dim_for_gdb_testing");
>   begin
>      Do_Nothing (M'Address);  -- STOP
> 
> base-commit: 6d1be0b90e837e4c82eaaf6f9e8c7da7227902e1