[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
This commit is contained in:
finn
2023-06-13 22:07:01 +02:00
parent fc4a5e61c2
commit ec32967daa
3 changed files with 42 additions and 0 deletions
+6
View File
@@ -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");
}