Skip to content

fix(hy-check): compare exact element widths in copy, restrict string sources to []byte (fixes #2825) - #2940

Closed
Yumihariii wants to merge 1 commit into
limitlessprojects:mainfrom
Yumihariii:fix/copy-elem-width-2825
Closed

Yumihariii wants to merge 1 commit into
limitlessprojects:mainfrom
Yumihariii:fix/copy-elem-width-2825

Conversation

@Yumihariii

Copy link
Copy Markdown
Contributor

fix(hy-check): compare exact element widths in copy, restrict string sources to []byte (fixes #2825)

What

Two escapes in the copy(dst, src) arm of buildable.rs, both pinned by the issue's reproducer set (Row 13, BUILDABLE):

  1. (slice, slice) — copy_element_kinds_conflict compares OpKinds, which collapse every integer width into Int and both float widths into Float. copy([]int64, []int32) compared as Slice(Int) == Slice(Int) → Accept → go build: arguments to copy have different element types: []int64 and []int32.
  2. (slice, string) — the destination guard accepted any integer element (!matches!(**dst_elem, Unknown | Int)), so copy([]int, "hi"), copy([]int64, "hi") and even copy([]rune, "hi") sailed through; Go admits only []byte/[]uint8 as a string-copy destination.

How

Evidence (pinned toolchain: go1.26.9 / rust 1.99.0, base d2917dc)

  • RED (before the fix): 11/11 reject cases — including the issue's named-alias reproducer verbatim — returned Accept with 0 diagnostics on stock main.
  • GREEN (after): copy_slice_elem_width_2825.rs 18/18.
  • Neighbours: issue_2655_copy_slice_elem_soundness 10/10, copy_clear_soundness 9/9, copy_const_scope_and_closure 6/6 — no regressions on the kind-level behaviour this builds on.
  • cargo test --workspace: 297 suites, 0 failures.
  • corpus_harness 130/130 verdict agreement, tripwires not fired; check_test_registration OK (38 files / 35 patterns); run_examples 19/19; check_guarantees OK.

Notes

Distinct from #2861 (T(x) conversions) and #2827/#2832 (binary/compound operators): this is the builtin-call copy arm in process_call. The thread carries two /claim comments (10:30Z / 10:32Z) with no linked PR ~4h later while two land rounds ran in between, so I'm posting the verified fix; if those claims land too, the board's cluster policy can adjudicate.

@github-actions github-actions Bot added the bot:stale-base Shepherd: behind main beyond threshold label Nov 1, 2026
@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from da66cfd to c501e48 Compare November 1, 2026 20:04
@Yumihariii

Copy link
Copy Markdown
Contributor Author

Updated the branch to the current tip 935611a4 per the board's ask (behind 21 → 0, new head c501e489). Re-verified on the new base with a forced clean rebuild of the crate: full cargo test -p hy-check → 241 test blocks, 1976 passed / 0 failed; the targeted suite copy_slice_elem_width_2825 is 18/18 — all 11 reject repros from #2825 (including copy([]int64, []int32) and the string-source cases) plus the accept-side controls. The copy neighbours (issue_2655 / copy_clear / copy_const_scope) pass unchanged, so exact-width rejection didn't leak into unrelated arms. Fix content is identical to the reviewed version. CI on the new head is queued.

@github-actions github-actions Bot added the bot:land-candidate Shepherd: fresh, gate-clean, verifiable (set from classify()) label Nov 2, 2026
@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from c501e48 to 77b8812 Compare November 2, 2026 06:19
@Yumihariii

Copy link
Copy Markdown
Contributor Author

Rebased onto current main 7d8b660 (19 behind); patch-id identical. The new base also touches buildable.rs (multi-value E1002, complex const ascriptions) — rebase merged cleanly and the copy-width checks still gate on top of it: targeted copy_slice_elem_width_2825 suite 18/18 pass (11 reject repros incl. the issue's own case, plus the accept-side controls). Head is 77b8812.

@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch 2 times, most recently from a5b88ca to 4622223 Compare November 2, 2026 16:07
@Yumihariii

Copy link
Copy Markdown
Contributor Author

Rebased onto current main 88e75e6 (17 behind → 0); patch-id identical. The new base touches buildable.rs too but there was no real conflict — the copy-element-width fix replays cleanly. Local re-run of the hy-check suite passes, and CI on this head is quick/compiler/preflight all green. The leftover bot:stale-base label is stale board cache, the branch is level with main.

@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from 4622223 to df40551 Compare November 3, 2026 00:13
@Yumihariii

Copy link
Copy Markdown
Contributor Author

Rebased onto current main (23beca2) to clear the stale-base threshold (behind was 31). git patch-id is byte-identical before/after — the fix content did not change, only the base. Local re-verify: hy-check full crate green, targeted copy_slice_elem_width_2825 18/18. Note #3214 (landed) enforces chan directions in copy; this PR covers element width and the string-source arm — different rule dimension, different file (sendability.rs vs buildable.rs), no semantic collision.

@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from df40551 to 31f2582 Compare November 3, 2026 04:14
@Yumihariii

Copy link
Copy Markdown
Contributor Author

Bumped the branch to the post-session-70 main (6e962ae). The copy width rule keeps its semantics after #3296 (map key width) landed — different call path, and the suite agrees: 2048 hy-check tests green on head 31f2582.

@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from 31f2582 to b460f52 Compare November 3, 2026 06:42
@Yumihariii

Yumihariii commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor Author

Rebased onto ff1d923 this morning. The copy-width fix is untouched (same patch-id as the CI-green head); full hy-check re-run on top of the new main: 2060 tests, 0 failures (271 suites), targeted copy element-width cases 18/18. New head b460f52.

@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from b460f52 to ada9966 Compare November 3, 2026 08:16
@Yumihariii

Copy link
Copy Markdown
Contributor Author

Rebased onto f993988 after tonight's two land rounds. The copy-width fix is untouched (patch-id identical to the earlier green head). Full hy-check re-run on the new base: 2070 passed, 0 failed; targeted copy element-width cases included. Head: ada9966.

@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from ada9966 to c86d10f Compare November 3, 2026 10:51
@Yumihariii

Copy link
Copy Markdown
Contributor Author

Rebased onto 132be7a and resolved the conflict in the copy arm against landed #3145 — keeping this branch's version. Why it still carries something #3145 doesn't: our suite run against plain upstream main (15/18 pass) leaves three real cases open — width-mismatched copies through named slice aliases (type A []int64 vs type B []int32) are still accepted, and a named byte-slice alias destination with a string source gets a false HYB-E1002 on legal code. copy_slice_elem_scalar resolves the named aliases, so all three behave like go build. Upstream's issue_3085_copy_slice_soundness suite passes 16/16 against the merged version here, and hy-check overall is 2104 passed / 0 failed. Happy for you to judge the alias coverage on its merits.

@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from c86d10f to 59e5642 Compare November 3, 2026 14:17
@Yumihariii

Copy link
Copy Markdown
Contributor Author

Refreshed onto 47622ca once behind-18 crossed the freshness line. Rebase was zero-conflict and the commit replays byte-identically to the CI-green head (patch-id e196e004 on both sides). Gates re-run on the new base 59e5642: our 18/18, upstream issue_3085 suite 16/16, hy-check lib 180/0, exit 0.

@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from 59e5642 to eeaee89 Compare November 3, 2026 18:09
@Yumihariii

Copy link
Copy Markdown
Contributor Author

Same deal as the other branch: 9 behind after session-80, mergeStateStatus was BEHIND, so it was unlandable. Rebased onto 77b97fa with a byte-identical replay (patch-id e196e004, unchanged from the green head), no conflicts.

Since session-80 touched hy-check/src/foreign.rs and try_context.rs right next to my buildable.rs changes, I ran the full crate on the merged tree: 281 test binaries, 2132 passed / 0 failed, exit 0. My copy_slice_elem_width_2825 suite is 18/18.

Head is eeaee896.

…sources to []byte (fixes limitlessprojects#2825)

The (slice, slice) arm of the builtin-args copy check compared OpKinds,
which collapse every integer width into Int and both float widths into
Float, so copy([]int64, []int32) passed hy-check and failed go build
(arguments to copy have different element types). The (slice, string)
arm accepted any integer-element destination; Go admits only
[]byte/[]uint8.

copy_slice_elem_scalar resolves the element spelling of a slice value
through the binding text or, for named slice types, the alias registry
(limitlessprojects#2811's named_slice_element_name), then canonical_numeric_name — both
sides known and different rejects with the real widths in the label.
byte=uint8 and rune=int32 share one canonical name so genuine aliases
stay silent; unresolved elements, user types and aliases-of-aliases
fail open, matching the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main: 11/11 reject cases Accept with 0 diagnostics.
GREEN: new suite 18/18, copy neighbours 10+9+6 unchanged, cargo test
--workspace 297 suites 0 fail, corpus 130/130, guards OK.
@Yumihariii
Yumihariii force-pushed the fix/copy-elem-width-2825 branch from eeaee89 to ff66036 Compare November 3, 2026 22:10
@limitlessprojects

Copy link
Copy Markdown
Owner

DUP CHECK — superseded by landed #3145 (fixes #3085). Verified empirically against current main (aa22a692):

#2825/#2940 repro main today
copy(dst []int64, src []int32) REJECT — HYB-E1002: arguments to copy have different element types: int64 and int32
copy(dst []float64, src []float32) REJECT — same exact-width check
copy(dst []int64, "hi") (string source, non-byte dst) REJECT — HYB-E1002: cannot copy string into slice with element type int64
copy(dst []byte, "hi") (the legal Go form) ACCEPT — correct

Landed e9ada4a3 (PR #3145, fixes #3085 — same underlying checker gap, different issue number) already implements the exact-width element comparison in copy_element_kinds_conflict plus the []byte-only string-source restriction, with its own test suite. This PR's remaining delta (~364 lines, mostly a parallel test file) pins the same behavior.

@Yumihariii: no action needed unless you spot a shape above that should reject and doesn't — if so, open a fresh issue with the verbatim repro rather than reopening this. Otherwise this can be closed as superseded; per queue policy it will also be swept after the review window.

Cross-ref: #2825 vs #3085 are duplicate reports of the same gap; #3085 is the one fixed by #3145.

@Yumihariii

Copy link
Copy Markdown
Contributor Author

Thanks for the table — I ran your four anonymous-shape repros against d6507a52e too and agree line by line; landed #3145 genuinely closes those, and I have no objection to this PR being closed as superseded.

But there is one residual family the table doesn't cover: named slice aliases. Ran this PR's full 18-case suite (copy_slice_elem_width_2825.rs) against bare main (d6507a52e) today: 15 pass / 3 fail, and all three failures are named-alias shapes:

  1. FN — should reject, main accepts with zero diagnostics: type my_int64_slice = []int64 / type my_int32_slice = []int32, copy(a_dst, a_src) → verdict: Accept. (go build: "arguments to copy have different element types: int64 and int32" — Row 13 violation.)
  2. FN — should reject, main accepts: type my_float64_slice = []float64, copy(a_dst, []float32{3.0, 4.0}) → verdict: Accept.
  3. FP — should accept, main rejects: type bs = []byte, copy(dst, "hi") → HYB-E1002: cannot copy string into slice with element type int. The int `` in the label is the tell: the named element spelling resolves to an int fallback instead of through the alias to byte.

Root cause: #3145's comparison works on the resolved element spelling, and for named slice aliases the (slice, slice) arm collapses both sides to the same coarse kind (all integer widths → Int, all float widths → Float, so no conflict fires) while the (slice, string) byte check never resolves the alias. The anonymous spellings in your table dodge this because they resolve directly.

Per your instruction ("open a fresh issue with the verbatim repro rather than reopening this"), all three repros are filed verbatim with repro method in #3585. The named-alias resolution in this PR's checker logic (named_slice_element_name registry path + canonical_numeric_name, byte=uint8 / rune=int32 staying silent, unresolved/user types failing open per the #2811/#2788/#2796 convention) is exactly the delta #3145 lacks — I'll resubmit it scoped to #3585's shapes in a fresh PR rather than reopening this one. Nothing further needed here; close away.

@Yumihariii

Copy link
Copy Markdown
Contributor Author

Closing as superseded per the DUP CHECK and #3585 — the named-alias residual has been resubmitted scoped to those shapes in #3586. Thanks for the empirical table.

@Yumihariii Yumihariii closed this Nov 4, 2026
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 4, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 4, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 4, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 5, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 5, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 5, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 5, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 5, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 6, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 6, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 6, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 6, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 7, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 7, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 7, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 7, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 8, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Yumihariii added a commit to Yumihariii/Go-Hybrid that referenced this pull request Nov 9, 2026
 limitlessprojects#3585)

Landed limitlessprojects#3145 compares exact element spellings resolved from the binding
text, which closes the anonymous-slice shapes of the copy() soundness
family. Named slice aliases remain uncovered: the (slice, slice) arm
collapses both sides to the same coarse OpKind (all integer widths -> Int,
all float widths -> Float) so width-mismatched copies between named slices
are accepted (go build then fails), and the (slice, string) byte check
resolves a named element to an int fallback so the legal
copy(namedByteSlice, "s") is rejected with a wrong-type label.

copy_slice_elem_scalar adds the missing resolution step: binding text
first (unchanged for anonymous spellings), then the alias registry
(limitlessprojects#2811's named_slice_element_name) for named slice types, then
canonical_numeric_name — byte=uint8 and rune=int32 share one canonical
name so genuine aliases stay silent; unresolved elements, user types and
aliases-of-aliases fail open per the limitlessprojects#2811/limitlessprojects#2788/limitlessprojects#2796 convention.

RED on stock main (d6507a5): 3/6 of the new suite fail (both FN
accepts with 0 diagnostics; the FP rejects []byte alias with
"element type `int`"). GREEN: new suite 6/6, upstream
issue_3085 suite 16/16, issue_2655 suite and hy-check --lib unchanged,
cargo test -p hy-check 288 suites 2158 tests 0 fail, workspace check
clean. Filed per the DUP CHECK on limitlessprojects#2940: residual named-alias shapes,
verbatim repros in limitlessprojects#3585. Supersedes nothing; narrower than limitlessprojects#2940.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot:land-candidate Shepherd: fresh, gate-clean, verifiable (set from classify()) bot:stale-base Shepherd: behind main beyond threshold

Projects

None yet

Development

Successfully merging this pull request may close these issues.

hy-check accepts copy() with mismatched slice element types and non-byte slice from string violating Row 13 BUILDABLE

2 participants