From a31a4e54ecf1a269dac0961fdfe084b6a9d8c603 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Fri, 8 Apr 2022 19:00:45 +0200 Subject: [PATCH] checker: fixes resolution sum type with an alias type Signed-off-by: Vincenzo Palazzo --- vlib/v/ast/table.v | 36 +++++++++++++------ .../testdata/cast_aliases_on_generics_type.vv | 6 ++-- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index e9d0028f1e..63e5084a07 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -1280,18 +1280,19 @@ pub fn (t &Table) sumtype_has_variant(parent Type, variant Type, is_as bool) boo if parent_sym.kind == .sum_type { parent_info := parent_sym.info as SumType var_sym := t.sym(variant) - if var_sym.kind == .aggregate { - var_info := var_sym.info as Aggregate - for var_type in var_info.types { - if !t.sumtype_has_variant(parent, var_type, is_as) { - return false - } + match var_sym.kind { + .aggregate { + return t.sumtype_check_aggregate_variant(parent, var_sym.info as Aggregate, + is_as) } - return true - } else { - for v in parent_info.variants { - if v.idx() == variant.idx() && (!is_as || v.nr_muls() == variant.nr_muls()) { - return true + .alias { + return t.sumtype_check_alias_variant(parent, var_sym.info as Alias, is_as) + } + else { + for v in parent_info.variants { + if v.idx() == variant.idx() && (!is_as || v.nr_muls() == variant.nr_muls()) { + return true + } } } } @@ -1299,6 +1300,19 @@ pub fn (t &Table) sumtype_has_variant(parent Type, variant Type, is_as bool) boo return false } +fn (t &Table) sumtype_check_aggregate_variant(parent_type Type, aggregate_sym &Aggregate, is_as bool) bool { + for var_type in aggregate_sym.types { + if !t.sumtype_has_variant(parent_type, var_type, is_as) { + return false + } + } + return true +} + +fn (t &Table) sumtype_check_alias_variant(parent_type Type, alias_info &Alias, is_as bool) bool { + return alias_info.parent_type == parent_type +} + pub fn (t &Table) is_sumtype_or_in_variant(parent Type, typ Type) bool { if typ == 0 { return false diff --git a/vlib/v/tests/known_errors/testdata/cast_aliases_on_generics_type.vv b/vlib/v/tests/known_errors/testdata/cast_aliases_on_generics_type.vv index dbfe25977c..05cbbad4f1 100644 --- a/vlib/v/tests/known_errors/testdata/cast_aliases_on_generics_type.vv +++ b/vlib/v/tests/known_errors/testdata/cast_aliases_on_generics_type.vv @@ -1,8 +1,6 @@ type ParseRes = Result<[]Token, ParseErr> -struct ParseErr{ - -} +struct ParseErr {} type Opt = None | Some @@ -26,7 +24,7 @@ fn test_report() { r := Opt(None{}) match r { Some { - rx := Result<[]Token, ParseErr>(r) + rx := Result<[]Token, ParseErr>(r.value) } None {} }