@@ -35,3 +35,56 @@ fn test_skip_unused_prunes_unused_generic_fn_instantiations() {
3535 assert res.output.contains ('VV_LOC Map_u8_u32 main__new_T_u32(void)' )
3636 assert ! res.output.contains ('VV_LOC Map_u8_int main__new_T_int(void)' )
3737}
38+
39+ fn test_skip_unused_does_not_emit_impl_methods_for_interface_extensions () {
40+ tmp_dir := os.join_path (os.vtmp_dir (), 'v_skip_unused_interface_extension_collision' )
41+ os.mkdir_all (tmp_dir) or { panic (err) }
42+ defer {
43+ os.rmdir_all (tmp_dir) or {}
44+ }
45+ source_path := os.join_path (tmp_dir, 'interface_extension_collision.v' )
46+ source := [
47+ 'module main' ,
48+ '' ,
49+ 'import crypto.internal.subtle' ,
50+ '' ,
51+ 'interface Elem {}' ,
52+ '' ,
53+ 'struct Thing {}' ,
54+ '' ,
55+ 'struct Holder {' ,
56+ '\t items []Elem' ,
57+ '}' ,
58+ '' ,
59+ 'fn (el Elem) equal(_ Elem) bool {' ,
60+ '\t return true' ,
61+ '}' ,
62+ '' ,
63+ 'fn (t Thing) equal(_ Thing) bool {' ,
64+ '\t return subtle.constant_time_compare([u8(1)], [u8(1)]) == 1' ,
65+ '}' ,
66+ '' ,
67+ 'fn (h Holder) ok() bool {' ,
68+ '\t for i, item in h.items {' ,
69+ '\t\t for j, obj in h.items {' ,
70+ '\t\t\t if i == j {' ,
71+ '\t\t\t\t return item.equal(obj)' ,
72+ '\t\t\t }' ,
73+ '\t\t }' ,
74+ '\t }' ,
75+ '\t return false' ,
76+ '}' ,
77+ '' ,
78+ 'fn main() {' ,
79+ '\t h := Holder{items: [Elem(Thing{}), Elem(Thing{})]}' ,
80+ '\t println(h.ok())' ,
81+ '}' ,
82+ ].join ('\n ' )
83+ os.write_file (source_path, source) or { panic (err) }
84+ res := os.execute ('${os.quoted_path(vexe)} -o - ${os.quoted_path(source_path)} ' )
85+ if res.exit_code != 0 {
86+ panic (res.output)
87+ }
88+ assert res.output.contains ('VV_LOC bool main__Elem_equal(' )
89+ assert ! res.output.contains ('main__Thing_equal(' )
90+ }
0 commit comments