From: Hannes Domani Date: Mon, 25 Dec 2023 18:05:55 +0000 (+0100) Subject: Fix comparison of array types X-Git-Tag: gdb-15-branchpoint~674 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=105470cd79f6d8c62b9156ce45e992895b01b13b;p=thirdparty%2Fbinutils-gdb.git 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 Reviewed-By: Guinevere Larsen Approved-By: Tom Tromey --- diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 599a696839e..960a7f49e45 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 bf608bdcccd..6ea21fec563 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"