mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-31 18:32:12 +00:00
Merge pull request #2590 from inbelic/inbelic/fix-no_nil-variants-err
[check-type] fix faulty #no_nil variants error
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ pushd build
|
||||
ODIN=../../../odin
|
||||
COMMON="-collection:tests=../.."
|
||||
|
||||
NO_NIL_ERR="Error: "
|
||||
|
||||
set -x
|
||||
|
||||
$ODIN test ../test_issue_829.odin $COMMON -file
|
||||
@@ -14,6 +16,11 @@ $ODIN test ../test_issue_2056.odin $COMMON -file
|
||||
$ODIN test ../test_issue_2087.odin $COMMON -file
|
||||
$ODIN build ../test_issue_2113.odin $COMMON -file -debug
|
||||
$ODIN test ../test_issue_2466.odin $COMMON -file
|
||||
if [[ $($ODIN build ../test_issue_2395.odin $COMMON -file 2>&1 >/dev/null | grep -c "$NO_NIL_ERR") -eq 2 ]] ; then
|
||||
echo "SUCCESSFUL 1/1"
|
||||
else
|
||||
echo "SUCCESSFUL 0/1"
|
||||
fi
|
||||
|
||||
set +x
|
||||
|
||||
|
||||
29
tests/issues/test_issue_2395.odin
Normal file
29
tests/issues/test_issue_2395.odin
Normal file
@@ -0,0 +1,29 @@
|
||||
// Tests issue #2395 https://github.com/odin-lang/Odin/issues/2395
|
||||
|
||||
// Ensures that we no longer raise the faulty error for #no_nil unions when
|
||||
// then are 2 variants with the polymorphic type. Also ensure that we raise
|
||||
// exactly 2 errors from the invalid unions
|
||||
package test_issues
|
||||
|
||||
import "core:testing"
|
||||
|
||||
ValidUnion :: union($T: typeid) #no_nil {
|
||||
T,
|
||||
f32,
|
||||
}
|
||||
|
||||
OtherValidUnion :: union($T: typeid, $S: typeid) #no_nil {
|
||||
T,
|
||||
S,
|
||||
}
|
||||
|
||||
InvalidUnion :: union($T: typeid) #no_nil {
|
||||
T,
|
||||
}
|
||||
|
||||
OtherInvalidUnion :: union($T: typeid) #no_nil {
|
||||
u8,
|
||||
}
|
||||
|
||||
main :: proc() {
|
||||
}
|
||||
Reference in New Issue
Block a user