cgen: fix generics method with sumtype arguments (#13166)
							parent
							
								
									104e0c5692
								
							
						
					
					
						commit
						879d1d2f11
					
				| 
						 | 
				
			
			@ -1471,7 +1471,37 @@ fn (mut g Gen) call_args(node ast.CallExpr) {
 | 
			
		|||
	} else {
 | 
			
		||||
		node.args
 | 
			
		||||
	}
 | 
			
		||||
	expected_types := node.expected_arg_types
 | 
			
		||||
	mut expected_types := node.expected_arg_types
 | 
			
		||||
	// unwrap generics fn/method arguments to concretes
 | 
			
		||||
	if node.concrete_types.len > 0 && node.concrete_types.all(!it.has_flag(.generic)) {
 | 
			
		||||
		if node.is_method {
 | 
			
		||||
			if func := g.table.find_method(g.table.sym(node.left_type), node.name) {
 | 
			
		||||
				if func.generic_names.len > 0 {
 | 
			
		||||
					for i in 0 .. expected_types.len {
 | 
			
		||||
						mut muttable := unsafe { &ast.Table(g.table) }
 | 
			
		||||
						if utyp := muttable.resolve_generic_to_concrete(node.expected_arg_types[i],
 | 
			
		||||
							func.generic_names, node.concrete_types)
 | 
			
		||||
						{
 | 
			
		||||
							expected_types[i] = utyp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			if func := g.table.find_fn(node.name) {
 | 
			
		||||
				if func.generic_names.len > 0 {
 | 
			
		||||
					for i in 0 .. expected_types.len {
 | 
			
		||||
						mut muttable := unsafe { &ast.Table(g.table) }
 | 
			
		||||
						if utyp := muttable.resolve_generic_to_concrete(node.expected_arg_types[i],
 | 
			
		||||
							func.generic_names, node.concrete_types)
 | 
			
		||||
						{
 | 
			
		||||
							expected_types[i] = utyp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// only v variadic, C variadic args will be appeneded like normal args
 | 
			
		||||
	is_variadic := expected_types.len > 0 && expected_types.last().has_flag(.variadic)
 | 
			
		||||
		&& node.language == .v
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
module main
 | 
			
		||||
 | 
			
		||||
fn test_generics_method_with_sumtype_args() {
 | 
			
		||||
	mut me := CatDad{}
 | 
			
		||||
	ret := me.adopt<CatType, Cat>(CatType.black, BlackCat{})
 | 
			
		||||
	println(ret)
 | 
			
		||||
	assert ret == 22
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[flag]
 | 
			
		||||
enum CatType {
 | 
			
		||||
	black
 | 
			
		||||
	white
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Cat = BlackCat | WhiteCat
 | 
			
		||||
 | 
			
		||||
struct BlackCat {}
 | 
			
		||||
 | 
			
		||||
struct WhiteCat {}
 | 
			
		||||
 | 
			
		||||
struct CatDad {}
 | 
			
		||||
 | 
			
		||||
fn (mut foo CatDad) adopt<D, T>(d D, t T) int {
 | 
			
		||||
	return 22
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue