aboutsummaryrefslogtreecommitdiff
path: root/src/check_type.cpp
diff options
context:
space:
mode:
authorfinn <canadienfinn@gmail.com>2023-06-13 22:07:01 +0200
committerfinn <canadienfinn@gmail.com>2023-06-13 22:07:01 +0200
commitec32967daab5136fc2518f4068e7007e265c4e92 (patch)
tree3dc80b5c6e38ecdcce53e6246d7628a4878276e0 /src/check_type.cpp
parentfc4a5e61c27467b30a421bceb7d21ac29ef8468e (diff)
[check-type] fix faulty #no_nil variants error
- when checking the variants of a union type we will skip adding the variants if we have an unspecialized polymorphic, hence our union_type variants will be empty and have a count of 0 - so when checking if we violate the #no_nil error, if we are in the unspecialized polymorphic case and there exists at least one variant in the original variants then we should not raise this error - test checks that we do not raise the error anymore, and that we still detect the #no_nil error in the described circumstances
Diffstat (limited to 'src/check_type.cpp')
-rw-r--r--src/check_type.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp
index bbfc25a12..a69dcdadc 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -729,6 +729,12 @@ gb_internal void check_union_type(CheckerContext *ctx, Type *union_type, Ast *no
union_type->Union.kind = ut->kind;
switch (ut->kind) {
case UnionType_no_nil:
+ if (union_type->Union.is_polymorphic && poly_operands == nullptr) {
+ GB_ASSERT(variants.count == 0);
+ if (ut->variants.count != 1) {
+ break;
+ }
+ }
if (variants.count < 2) {
error(ut->align, "A union with #no_nil must have at least 2 variants");
}