cgen: fix generic method on alias struct receiver (#11080)
							parent
							
								
									3b116d2455
								
							
						
					
					
						commit
						ec39e38e14
					
				| 
						 | 
				
			
			@ -579,7 +579,12 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
 | 
			
		|||
			else {}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	typ_sym := g.table.get_type_symbol(unwrapped_rec_type)
 | 
			
		||||
	mut typ_sym := g.table.get_type_symbol(unwrapped_rec_type)
 | 
			
		||||
	// alias type that undefined this method (not include `str`) need to use parent type
 | 
			
		||||
	if typ_sym.kind == .alias && node.name != 'str' && !typ_sym.has_method(node.name) {
 | 
			
		||||
		unwrapped_rec_type = (typ_sym.info as ast.Alias).parent_type
 | 
			
		||||
		typ_sym = g.table.get_type_symbol(unwrapped_rec_type)
 | 
			
		||||
	}
 | 
			
		||||
	rec_cc_type := g.cc_type(unwrapped_rec_type, false)
 | 
			
		||||
	mut receiver_type_name := util.no_dots(rec_cc_type)
 | 
			
		||||
	if typ_sym.kind == .interface_ && (typ_sym.info as ast.Interface).defines_method(node.name) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
struct Base {}
 | 
			
		||||
 | 
			
		||||
pub fn (base Base) hello() string {
 | 
			
		||||
	return 'hello'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Message = Base
 | 
			
		||||
 | 
			
		||||
fn hello<T>(hello_impl T) string {
 | 
			
		||||
	return hello_impl.hello()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_generic_method_on_alias_struct_receiver() {
 | 
			
		||||
	mut message := Message(Base{})
 | 
			
		||||
	ret1 := hello(message)
 | 
			
		||||
	println(ret1)
 | 
			
		||||
	assert ret1 == 'hello'
 | 
			
		||||
 | 
			
		||||
	ret2 := message.hello()
 | 
			
		||||
	println(ret2)
 | 
			
		||||
	assert ret2 == 'hello'
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue