aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannes Domani <ssbssa@yahoo.de>2023-12-25 19:05:55 +0100
committerHannes Domani <ssbssa@yahoo.de>2024-03-20 16:40:30 +0100
commit105470cd79f6d8c62b9156ce45e992895b01b13b (patch)
tree694593af6a4c511c063e29fe61ff7a24477d2a3e
parent53ff349e553fa9fc446a8711e37fd252282b088b (diff)
downloadbinutils-105470cd79f6d8c62b9156ce45e992895b01b13b.zip
binutils-105470cd79f6d8c62b9156ce45e992895b01b13b.tar.gz
binutils-105470cd79f6d8c62b9156ce45e992895b01b13b.tar.bz2
Fix comparison of array types
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>
-rw-r--r--gdb/gdbtypes.c13
-rw-r--r--gdb/testsuite/gdb.cp/converts.exp1
2 files changed, 14 insertions, 0 deletions
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 599a696..960a7f4 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -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;
}
diff --git a/gdb/testsuite/gdb.cp/converts.exp b/gdb/testsuite/gdb.cp/converts.exp
index bf608bd..6ea21fe 100644
--- a/gdb/testsuite/gdb.cp/converts.exp
+++ b/gdb/testsuite/gdb.cp/converts.exp
@@ -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"