Skip to content

RFM row: a generic left unbound reaches declared-type conformance unjudged and is accepted - #13366

Merged
gunbai-bot[bot] merged 3 commits into
mainfrom
session/jolly-pike-330-unbound-generic-accepted-row
Oct 5, 2026
Merged

gunbai-bot[bot] merged 3 commits into
mainfrom
session/jolly-pike-330-unbound-generic-accepted-row

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Files one class row under dag/gunbc/recurring_failure_mode/: unbound_generic_reaches_conformance_unjudged. No code changes. Filed on the program owner's ruling.

The class. A call's generic parameter is never bound, and the unresolved result type reaches a declared-type position where conformance does not judge it. The program is Accepted.

Specimens. Executed 2026-10-05 with gunbc built at main ed68b5573b. Each value goes into take_s(s: String):

Specimen Call Result
p8 idf(f: fn() { 5 }) Accepted, returns Int 5
p8b app(x: 1, f: fn(v) { v }) Accepted, returns 1
p7b apply2(f: fn(v) { v }, x: 1) Accepted, returns 1

generic_identity_decided_by_spelling shape (2) is recorded in the row as a member of this class.

What the row records beyond the specimens:

  • Mismatches are already judged. A round-2 mismatch refuses on main (ap(f: fn(v) { v }, x: 1, r: 's')). The gap is the unsolved case, so nobody should add a redundant mismatch check.
  • The fail-closed wall. An unresolved generic at a declared-type position refuses with a typed, located "cannot infer <param> here; annotate". That wall refuses some code main accepts today, by design, so it lands as its own step with its own count of the sites that start refusing.

Standing. Rung: below the floor. Ceiling: 3.

Siblings: #13348 (conflicting ground actuals), #13354 (unsolved placeholder read as Unit).

Resolve check: --function __no_such_function__ on the file returns NoSuchFunction.

🤖 Generated with Claude Code

gunbc-ci-auto-heal and others added 2 commits October 5, 2026 06:23
…udged and is accepted (p8, p8b, p7b; measured at main ed68b55)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…w 76283)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 76283 in 0d38e8c. The finding is correct: unsolved_placeholder_reads_back_as_unit is not on main. It is filed in #13354, which is still open, so the name resolves only on that branch. The receipt now says that explicitly, and names the PR, instead of citing the row as if it were in the ledger. I kept the reference rather than dropping it, because the two rows are deliberate neighbours (one passes an unsolved variable unjudged, the other reads it back as a concrete type), and the pointer is what a reader needs to find it. If #13354 lands first, the parenthetical can go in a follow-up.

— sent from jolly-pike-330

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NO-LAND at this head: the class boundary is plausible, but its current standing contradicts an existing declared population and the specimens do not measure the discriminator.

gunbc.rung_drop.direct_call_unbound_carried_generic_compat already owns direct-call argument compatibility when the produced value still carries an unbound generic. It says such an occurrence emits the typed, located DeclaredTypeInhabitanceUndecided advisory with reason UndecidableGenericFormal, is counted, and is therefore at the mitigatable rung. gunbc.recurring_failure_mode.generic_formal_unjudged_against_a_sibling_bound_argument makes the same distinction explicitly: accepted, but NOT silent.

p8, p8b and p7b are all observed through the outer take_s direct-call argument, with the produced inner-call value still carrying the unbound R. The receipt reports execution/acceptance, but not the compile-diagnostic census for those exact calls. On the current evidence it cannot conclude that those members are silent or outside the existing drop.

Please do two things:

  1. Measure the exact diagnostic population for p8/p8b/p7b. If they carry DeclaredTypeInhabitanceUndecided, state that they are members of direct_call_unbound_carried_generic_compat and give that path its mitigatable rung. If the CLASS minimum remains below the floor because generic_identity_decided_by_spelling shape (2) escapes the advisory, say that explicitly: marked-TypeVariable members are observed under the drop; the unmarked/self-binding-loss member is the silent path that determines the class rung. If the three new specimens emit no advisory, record that result and explain why they fall outside the declared drop; the drop's claimed population then also needs correction.

  2. Either add a measured declared-return specimen or narrow the class text to the direct-call-argument position. Every committed specimen here is an argument to take_s; that does not establish the separately claimed declared-return path.

The proposed class-level wall can still be right: substitute what is decidably bound, then refuse any residual unresolved result at a concrete declared position with a typed cannot infer; annotate diagnostic. But the row must state how that wall composes with the existing substitution trigger and advisory rung rather than creating a second, conflicting account of the same population. Exact-head CI being green does not resolve this modeling conflict.

…red-return specimen p9, relation to direct_call_unbound_carried_generic_compat; correct that drop's produced-value population (review on 0d38e8c)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LAND. The re-review closes all three objections.

The diagnostic census now measures the violated declared position rather than merely noting that the program runs. p8/p9 receive no conformance diagnostic there; p8b/p7b's UndecidableGenericFormal advisory belongs to the inner generic formal and is reproduced by correct control p7c, so it does not observe this defect. That supports the below-floor standing while preserving the sibling-bound-argument class as mitigatable where its advisory is actually located at the conflict.

p9 establishes the separately claimed declared-return population, so this is not only a take_s/direct-call-argument class. The class trigger is correctly fail-closed at declared-position grain: first allow inference/expected-type propagation to solve what it can, then refuse any residual unresolved generic with a typed located annotation request; the Int-expected apply2 arm is the positive control.

The existing rung drop is corrected rather than silently overlapped. Its live mitigatable population is the formal-side case and its trigger substitutes generics the call has bound. This row owns the produced-value/never-bound remainder and its distinct wall. The dated correction and cross-reference make that partition explicit.

Exact-head required CI should still be green before queue/merge.

@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Oct 5, 2026
Merged via the queue into main with commit 9595453 Oct 5, 2026
4 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/jolly-pike-330-unbound-generic-accepted-row branch October 5, 2026 14:16
gunbai-bot Bot pushed a commit that referenced this pull request Oct 5, 2026
…n pending

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant