checker: fix generic with fixed array parameter (#10233)
parent
7089ff3957
commit
9ea753e853
|
@ -6453,19 +6453,32 @@ fn (mut c Checker) check_index(typ_sym &ast.TypeSymbol, index ast.Expr, index_ty
|
|||
|
||||
pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type {
|
||||
mut typ := c.expr(node.left)
|
||||
mut typ_sym := c.table.get_final_type_symbol(typ)
|
||||
node.left_type = typ
|
||||
typ_sym := c.table.get_final_type_symbol(typ)
|
||||
match typ_sym.kind {
|
||||
.map {
|
||||
node.is_map = true
|
||||
for {
|
||||
match typ_sym.kind {
|
||||
.map {
|
||||
node.is_map = true
|
||||
break
|
||||
}
|
||||
.array {
|
||||
node.is_array = true
|
||||
break
|
||||
}
|
||||
.array_fixed {
|
||||
node.is_farray = true
|
||||
break
|
||||
}
|
||||
.any {
|
||||
typ = c.unwrap_generic(typ)
|
||||
node.left_type = typ
|
||||
typ_sym = c.table.get_final_type_symbol(typ)
|
||||
continue
|
||||
}
|
||||
else {
|
||||
break
|
||||
}
|
||||
}
|
||||
.array {
|
||||
node.is_array = true
|
||||
}
|
||||
.array_fixed {
|
||||
node.is_farray = true
|
||||
}
|
||||
else {}
|
||||
}
|
||||
if typ_sym.kind !in [.array, .array_fixed, .string, .map] && !typ.is_ptr()
|
||||
&& typ !in [ast.byteptr_type, ast.charptr_type] && !typ.has_flag(.variadic) {
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
fn show_element<T>(arr &T) string {
|
||||
return unsafe { '${arr[1]}' }
|
||||
}
|
||||
|
||||
fn test_generic_with_fixed_array_type() {
|
||||
a := [1, 2, 3]!
|
||||
ret := show_element(a)
|
||||
println(ret)
|
||||
assert ret == '2'
|
||||
}
|
Loading…
Reference in New Issue