From bc5adb070f53d69fda2be0d4bd67a5cd687b939b Mon Sep 17 00:00:00 2001 From: Andreas Stenmark Date: Mon, 15 Jun 2026 00:51:36 +0200 Subject: [PATCH] Fix #6814: reject transitive #subtype-only implicit conversion in checker --- src/types.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/types.cpp b/src/types.cpp index 260dd4918..759f90ca6 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -5030,9 +5030,15 @@ gb_internal isize check_is_assignable_to_using_subtype(Type *src, Type *dst, isi return level+1; } } - isize nested_level = check_is_assignable_to_using_subtype(f->type, dst, level+1, src_is_ptr, allow_polymorphic); - if (nested_level > 0) { - return nested_level; + // Only follow the chain transitively when the field also has `using`, which is + // what the backend's lookup_subtype_polymorphic_selection requires (it gates + // recursion on EntityFlag_Using). A plain `#subtype`-only field enables a + // single-hop conversion but not a two-or-more hop transitive one. + if (f->flags & EntityFlag_Using) { + isize nested_level = check_is_assignable_to_using_subtype(f->type, dst, level+1, src_is_ptr, allow_polymorphic); + if (nested_level > 0) { + return nested_level; + } } }