mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 10:03:47 +08:00
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>
This commit is contained in:
parent
53ff349e55
commit
105470cd79
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user