Fix structural array element assignment
f061b302bb441d487f7a2d90bd4811bab7d397f93548abcb7897fc1f4bae42c6
Array assignment compatibility compared interned element-type pointers instead of structural types. Independently allocated but equivalent descriptors, such as identical function signatures in separate annotations, were rejected while printing the same expected and actual type. Use the resolver's recursive `typesEqual` check for array element compatibility.
1 parent
8f8593d0
lib/std/lang/resolver.rad
+1 -2
| 1700 | 1700 | } |
|
| 1701 | 1701 | case ast::NodeValue::ArrayRepeatLit(repeat) => { |
|
| 1702 | 1702 | return isAssignable(self, *lhs.item, *rhs.item, repeat.item); |
|
| 1703 | 1703 | } |
|
| 1704 | 1704 | else => { |
|
| 1705 | - | // For non-literal arrays, require exact element type match. |
|
| 1706 | - | if lhs.item == rhs.item { |
|
| 1705 | + | if typesEqual(*lhs.item, *rhs.item) { |
|
| 1707 | 1706 | return Coercion::Identity; |
|
| 1708 | 1707 | } |
|
| 1709 | 1708 | return nil; |
|
| 1710 | 1709 | } |
|
| 1711 | 1710 | } |
test/tests/array.fn.assign.rad
added
+13 -0
| 1 | + | //! returns: 7 |
|
| 2 | + | //! Structurally identical function array types assign across declarations. |
|
| 3 | + | ||
| 4 | + | fn seven() -> i32 { |
|
| 5 | + | return 7; |
|
| 6 | + | } |
|
| 7 | + | ||
| 8 | + | @default fn main() -> i32 { |
|
| 9 | + | let funcs: [fn() -> i32; 1] = [seven]; |
|
| 10 | + | let copy: [fn() -> i32; 1] = funcs; |
|
| 11 | + | ||
| 12 | + | return copy[0](); |
|
| 13 | + | } |