Skip to content

Commit 7405b53

Browse files
committed
tests: add ptr interface cast regression test (different struct layouts)
1 parent 9312d9d commit 7405b53

1 file changed

Lines changed: 57 additions & 0 deletions

File tree

‎vlib/v/tests/generic_multi_return_interface_cast_test.v‎

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,60 @@ fn test_generic_as_cast_then_multi_return_interface() {
147147
assert h1.secret() == 10
148148
assert h2.secret() == 20
149149
}
150+
151+
// Regression test: generic method with `&Interface -> as T` cast and
152+
// multi-return interface conversion. Two concrete types with DIFFERENT
153+
// struct layouts ensure the C compiler catches any stale-type codegen.
154+
155+
interface Gettable {
156+
get() int
157+
}
158+
159+
struct TypeA {
160+
x int
161+
y int
162+
}
163+
164+
fn (a TypeA) get() int {
165+
return a.x + a.y
166+
}
167+
168+
struct TypeB {
169+
msg string
170+
}
171+
172+
fn (b TypeB) get() int {
173+
return b.msg.len
174+
}
175+
176+
struct Holder {
177+
ptr &Gettable
178+
}
179+
180+
fn (h Holder) inner_ptr() &Gettable {
181+
return h.ptr
182+
}
183+
184+
struct Wrapper[T] {
185+
src Holder
186+
}
187+
188+
fn (w Wrapper[T]) extract() (Gettable, &Gettable) {
189+
raw_conn := w.src.inner_ptr()
190+
raw := raw_conn as T
191+
return raw, raw_conn
192+
}
193+
194+
fn test_ptr_interface_as_cast_multi_return_interface() {
195+
w1 := Wrapper[TypeA]{
196+
src: Holder{&TypeA{10, 20}}
197+
}
198+
v1, _ := w1.extract()
199+
assert v1.get() == 30
200+
201+
w2 := Wrapper[TypeB]{
202+
src: Holder{&TypeB{'hi'}}
203+
}
204+
v2, _ := w2.extract()
205+
assert v2.get() == 2
206+
}

0 commit comments

Comments
 (0)