diff options
| author | Karl Zylinski <karl@zylinski.se> | 2024-06-30 20:36:51 +0200 |
|---|---|---|
| committer | Karl Zylinski <karl@zylinski.se> | 2024-06-30 20:36:51 +0200 |
| commit | e0face1ac87d34738751bbdb8c29f32bb89b544d (patch) | |
| tree | 6e034ac60f1bcd73db352d25761c3679fce4b14a /src | |
| parent | 52aa7085e4e072fde519856b520555d08ef0835c (diff) | |
Make types like bit_set[$T] have their upper and lower bits overwritten by upper/lower from the source types when checking if polymorphic type is assignable. This fixes an issue where an i8 was always generated for bit_sets with generic elements, because it couldn't figure out upper/lower when check_bit_set_type was run. Fixes #2860
Diffstat (limited to 'src')
| -rw-r--r-- | src/check_expr.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 891378b99..b9697a6e8 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1435,6 +1435,16 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T if (!is_polymorphic_type_assignable(c, poly->BitSet.elem, source->BitSet.elem, true, modify_type)) { return false; } + + // For generic types like bit_set[$T] the upper and lower of the poly type will be zeroes since + // it could not figure that stuff out when the poly type was created. + if (poly->BitSet.upper == 0 && modify_type) { + poly->BitSet.upper = source->BitSet.upper; + } + if (poly->BitSet.lower == 0 && modify_type) { + poly->BitSet.lower = source->BitSet.lower; + } + if (poly->BitSet.underlying == nullptr) { if (modify_type) { poly->BitSet.underlying = source->BitSet.underlying; |