File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments