checker: fix generic with fixed array parameter (#10233)

pull/10246/head
yuyi 2021-05-28 23:51:55 +08:00 committed by GitHub
parent 7089ff3957
commit 9ea753e853
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 11 deletions

View File

@ -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 { pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type {
mut typ := c.expr(node.left) mut typ := c.expr(node.left)
mut typ_sym := c.table.get_final_type_symbol(typ)
node.left_type = typ node.left_type = typ
typ_sym := c.table.get_final_type_symbol(typ) for {
match typ_sym.kind { match typ_sym.kind {
.map { .map {
node.is_map = true 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() 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) { && typ !in [ast.byteptr_type, ast.charptr_type] && !typ.has_flag(.variadic) {

View File

@ -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'
}