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:
Hannes Domani 2023-12-25 19:05:55 +01:00
parent 53ff349e55
commit 105470cd79
2 changed files with 14 additions and 0 deletions

View 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;
}

View 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"