]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix comparison of array types
authorHannes Domani <ssbssa@yahoo.de>
Mon, 25 Dec 2023 18:05:55 +0000 (19:05 +0100)
committerHannes Domani <ssbssa@yahoo.de>
Wed, 20 Mar 2024 15:40:30 +0000 (16:40 +0100)
Currently it's not possible to call functions if an argument is a
pointer to an array:
```
(gdb) l f
1       int f (int (*x)[2])
2       {
3         return x[0][1];
4       }
5
6       int main()
7       {
8         int a[2][2] = {{0, 1}, {2, 3}};
9         return f (a);
10      }
(gdb) p f(a)
Cannot resolve function f to any overloaded instance
```

This happens because types_equal doesn't handle array types, so the
function is never even considered as a possibility.

With array type handling added, by comparing element types and array
bounds, the same works:
```
(gdb) p f(a)
$1 = 1
```

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=15398
Co-Authored-By: Keith Seitz <keiths@redhat.com>
Reviewed-By: Guinevere Larsen <blarsen@redhat.com>
Approved-By: Tom Tromey <tom@tromey.com>
gdb/gdbtypes.c
gdb/testsuite/gdb.cp/converts.exp

index 599a696839ef46520085b109c481c82e40c614d8..960a7f49e4513e9be690a56a08478a468af9cad1 100644 (file)
@@ -4207,6 +4207,19 @@ types_equal (struct type *a, struct type *b)
       return true;
     }
 
+  /* Two array types are the same if they have the same element types
+     and array bounds.  */
+  if (a->code () == TYPE_CODE_ARRAY)
+    {
+      if (!types_equal (a->target_type (), b->target_type ()))
+       return false;
+
+      if (*a->bounds () != *b->bounds ())
+       return false;
+
+      return true;
+    }
+
   return false;
 }
 \f
index bf608bdcccd9c48413adc778f39e946c0ab42415..6ea21fec5637960cad559c915849509aa9b4d29e 100644 (file)
@@ -48,6 +48,7 @@ gdb_test "p foo1_8 (bp)" "Using non-standard.*" "pointer to long int"
 gdb_test "p foo1_5 (b)" "= 15"             "pointer pointer to void pointer"
 gdb_test "p foo2_1 (b)" "= 21"             "pointer pointer to pointer pointer"
 gdb_test "p foo2_2 (b)" "Cannot resolve.*" "pointer pointer to array of arrays"
+gdb_test "p foo2_2 (ba)" "= 22"            "array of arrays to array of arrays"
 gdb_test "p foo2_3 (b)" "= 23"             "pointer pointer to array of pointers"
 gdb_test "p foo2_4 (b)" "Cannot resolve.*" "pointer pointer to array of wrong pointers"