checker: fix infinite recursion on generic interface cast
							parent
							
								
									df8384b62e
								
							
						
					
					
						commit
						ae036b6146
					
				| 
						 | 
				
			
			@ -1613,6 +1613,9 @@ fn (mut c Checker) fail_if_immutable(expr ast.Expr) (string, token.Position) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos token.Position) bool {
 | 
			
		||||
	if typ == interface_type {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	$if debug_interface_type_implements ? {
 | 
			
		||||
		eprintln('> type_implements typ: $typ.debug() (`${c.table.type_to_str(typ)}`) | inter_typ: $interface_type.debug() (`${c.table.type_to_str(interface_type)}`)')
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1642,6 +1645,10 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if inter_sym.info.is_generic {
 | 
			
		||||
			if inferred_type == interface_type {
 | 
			
		||||
				// terminate early, since otherwise we get an infinite recursion/segfault:
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
			return c.type_implements(typ, inferred_type, pos)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
vlib/v/checker/tests/interface_generic_err.vv:7:9: error: generic struct init must specify type parameter, e.g. Foo<int>
 | 
			
		||||
    5 | 
 | 
			
		||||
    6 | // no segfault without generic
 | 
			
		||||
    7 | what := What{}
 | 
			
		||||
      |         ~~~~~~
 | 
			
		||||
    8 | why := Why(what)
 | 
			
		||||
vlib/v/checker/tests/interface_generic_err.vv:8:8: error: could not infer generic type `T` in interface
 | 
			
		||||
    6 | // no segfault without generic
 | 
			
		||||
    7 | what := What{}
 | 
			
		||||
    8 | why := Why(what)
 | 
			
		||||
      |        ~~~~~~~~~
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
struct What<T> {}
 | 
			
		||||
 | 
			
		||||
// with or without generic
 | 
			
		||||
interface Why<T> {}
 | 
			
		||||
 | 
			
		||||
// no segfault without generic
 | 
			
		||||
what := What{}
 | 
			
		||||
why := Why(what)
 | 
			
		||||
		Loading…
	
		Reference in New Issue