mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: fix sum type assign/push from in match branch & type mod
This commit is contained in:
@@ -357,94 +357,117 @@ pub fn (mut t Table) register_builtin_type_symbols() {
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .void
|
||||
name: 'void'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .voidptr
|
||||
name: 'voidptr'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .byteptr
|
||||
name: 'byteptr'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .charptr
|
||||
name: 'charptr'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .i8
|
||||
name: 'i8'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .i16
|
||||
name: 'i16'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .int
|
||||
name: 'int'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .i64
|
||||
name: 'i64'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .byte
|
||||
name: 'byte'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .u16
|
||||
name: 'u16'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .u32
|
||||
name: 'u32'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .u64
|
||||
name: 'u64'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .f32
|
||||
name: 'f32'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .f64
|
||||
name: 'f64'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .char
|
||||
name: 'char'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .bool
|
||||
name: 'bool'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .none_
|
||||
name: 'none'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .string
|
||||
name: 'string'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .ustring
|
||||
name: 'ustring'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .array
|
||||
name: 'array'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .map
|
||||
name: 'map'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .any
|
||||
name: 'any'
|
||||
mod: 'builtin'
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .size_t
|
||||
name: 'size_t'
|
||||
mod: 'builtin'
|
||||
})
|
||||
// TODO: remove. for v1 map compatibility
|
||||
map_string_string_idx := t.find_or_register_map(string_type, string_type)
|
||||
@@ -452,11 +475,13 @@ pub fn (mut t Table) register_builtin_type_symbols() {
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .alias
|
||||
name: 'map_string'
|
||||
mod: 'builtin'
|
||||
parent_idx: map_string_string_idx
|
||||
})
|
||||
t.register_type_symbol(TypeSymbol{
|
||||
kind: .alias
|
||||
name: 'map_int'
|
||||
mod: 'builtin'
|
||||
parent_idx: map_string_int_idx
|
||||
})
|
||||
}
|
||||
|
||||
@@ -374,12 +374,13 @@ pub fn (mut t Table) find_or_register_multi_return(mr_typs []Type) int {
|
||||
return t.register_type_symbol(mr_type)
|
||||
}
|
||||
|
||||
pub fn (mut t Table) find_or_register_fn_type(f Fn, is_anon, has_decl bool) int {
|
||||
pub fn (mut t Table) find_or_register_fn_type(mod string, f Fn, is_anon, has_decl bool) int {
|
||||
name := if f.name.len == 0 { 'anon_fn_$f.signature()' } else { f.name }
|
||||
anon := f.name.len == 0 || is_anon
|
||||
return t.register_type_symbol(TypeSymbol{
|
||||
kind: .function
|
||||
name: name
|
||||
mod: mod
|
||||
info: FnType{
|
||||
is_anon: anon
|
||||
has_decl: has_decl
|
||||
@@ -516,13 +517,15 @@ pub fn (t &Table) check(got, expected Type) bool {
|
||||
// sum type
|
||||
if got_type_sym.kind == .sum_type {
|
||||
sum_info := got_type_sym.info as SumType
|
||||
if expected in sum_info.variants {
|
||||
// TODO: handle `match SumType { &PtrVariant {} }` currently just checking base
|
||||
if expected.set_nr_muls(0) in sum_info.variants {
|
||||
return true
|
||||
}
|
||||
}
|
||||
if exp_type_sym.kind == .sum_type {
|
||||
sum_info := exp_type_sym.info as SumType
|
||||
if got in sum_info.variants {
|
||||
// TODO: handle `match SumType { &PtrVariant {} }` currently just checking base
|
||||
if got.set_nr_muls(0) in sum_info.variants {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user