mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-05 15:15:42 +00: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:
@@ -4207,6 +4207,19 @@ types_equal (struct type *a, struct type *b)
|
|||||||
return true;
|
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;
|
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 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_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 (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_3 (b)" "= 23" "pointer pointer to array of pointers"
|
||||||
gdb_test "p foo2_4 (b)" "Cannot resolve.*" "pointer pointer to array of wrong pointers"
|
gdb_test "p foo2_4 (b)" "Cannot resolve.*" "pointer pointer to array of wrong pointers"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user