checker: fix generic fn return array of generic struct (#12170)
							parent
							
								
									d373eba79b
								
							
						
					
					
						commit
						97e999768a
					
				| 
						 | 
					@ -685,6 +685,20 @@ fn (mut c Checker) unwrap_generic_type(typ ast.Type, generic_names []string, con
 | 
				
			||||||
	mut c_nrt := ''
 | 
						mut c_nrt := ''
 | 
				
			||||||
	ts := c.table.get_type_symbol(typ)
 | 
						ts := c.table.get_type_symbol(typ)
 | 
				
			||||||
	match mut ts.info {
 | 
						match mut ts.info {
 | 
				
			||||||
 | 
							ast.Array {
 | 
				
			||||||
 | 
								mut elem_type := ts.info.elem_type
 | 
				
			||||||
 | 
								mut elem_sym := c.table.get_type_symbol(elem_type)
 | 
				
			||||||
 | 
								mut dims := 1
 | 
				
			||||||
 | 
								for mut elem_sym.info is ast.Array {
 | 
				
			||||||
 | 
									info := elem_sym.info as ast.Array
 | 
				
			||||||
 | 
									elem_type = info.elem_type
 | 
				
			||||||
 | 
									elem_sym = c.table.get_type_symbol(elem_type)
 | 
				
			||||||
 | 
									dims++
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								unwrap_typ := c.unwrap_generic_type(elem_type, generic_names, concrete_types)
 | 
				
			||||||
 | 
								idx := c.table.find_or_register_array_with_dims(unwrap_typ, dims)
 | 
				
			||||||
 | 
								return ast.new_type(idx).derive_add_muls(typ).clear_flag(.generic)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		ast.Struct, ast.Interface, ast.SumType {
 | 
							ast.Struct, ast.Interface, ast.SumType {
 | 
				
			||||||
			if !ts.info.is_generic {
 | 
								if !ts.info.is_generic {
 | 
				
			||||||
				return typ
 | 
									return typ
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					pub struct Abcd<T> {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn iterators<T>() []&Abcd<T> {
 | 
				
			||||||
 | 
						return []&Abcd<T>{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_generic_fn_return_array_of_generic_struct() {
 | 
				
			||||||
 | 
						a := iterators<f64>()
 | 
				
			||||||
 | 
						println(a)
 | 
				
			||||||
 | 
						assert '$a' == '[]'
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue