generics: fix generic_struct_insts_to_concrete (#9536)
							parent
							
								
									0b39de2fd3
								
							
						
					
					
						commit
						f1797a0150
					
				| 
						 | 
				
			
			@ -1093,19 +1093,13 @@ pub fn (mut t Table) generic_struct_insts_to_concrete() {
 | 
			
		|||
			}
 | 
			
		||||
			mut parent_info := parent.info as Struct
 | 
			
		||||
			mut fields := parent_info.fields.clone()
 | 
			
		||||
			if parent_info.generic_types.len == info.generic_types.len {
 | 
			
		||||
				for i, _ in fields {
 | 
			
		||||
					mut field := fields[i]
 | 
			
		||||
				if field.typ.has_flag(.generic) {
 | 
			
		||||
					if parent_info.generic_types.len != info.generic_types.len {
 | 
			
		||||
						// TODO: proper error
 | 
			
		||||
						panic('generic template mismatch')
 | 
			
		||||
					}
 | 
			
		||||
					for j, gp in parent_info.generic_types {
 | 
			
		||||
						if gp == field.typ {
 | 
			
		||||
							field.typ = info.generic_types[j].derive(field.typ).clear_flag(.generic)
 | 
			
		||||
							break
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					if t_typ := t.resolve_generic_by_types(field.typ, parent_info.generic_types,
 | 
			
		||||
						info.generic_types)
 | 
			
		||||
					{
 | 
			
		||||
						field.typ = t_typ
 | 
			
		||||
					}
 | 
			
		||||
					fields[i] = field
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -1117,3 +1111,4 @@ pub fn (mut t Table) generic_struct_insts_to_concrete() {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,3 +49,15 @@ fn test_generics_with_generics_struct_string() {
 | 
			
		|||
	assert ret.contains("data: ['foo', 'bar']")
 | 
			
		||||
	assert ret.contains('index: 11')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_generics_struct_insts_to_concrete() {
 | 
			
		||||
	ai := ArrayIterator<int>{
 | 
			
		||||
		data: [11, 22],
 | 
			
		||||
		index: 22
 | 
			
		||||
	}
 | 
			
		||||
	println(ai)
 | 
			
		||||
	ret := '$ai'
 | 
			
		||||
	assert ret.contains('ArrayIterator<int>{')
 | 
			
		||||
	assert ret.contains('data: [11, 22]')
 | 
			
		||||
	assert ret.contains('index: 22')
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue