aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKarl Zylinski <karl@zylinski.se>2024-06-30 20:36:51 +0200
committerKarl Zylinski <karl@zylinski.se>2024-06-30 20:36:51 +0200
commite0face1ac87d34738751bbdb8c29f32bb89b544d (patch)
tree6e034ac60f1bcd73db352d25761c3679fce4b14a /src
parent52aa7085e4e072fde519856b520555d08ef0835c (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.cpp10
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;