Allow labeled arguments in any order for inferred function types - #8547
Merged
Conversation
Remove the legacy commutable flag from Tarrow, together with its plumbing (commu_repr, set_commu, copy_commu, the Ccommu undo-log entry) and the Incoherent_label_order error. Labeled arguments now commute at every call site regardless of whether the function type was declared or inferred; unification still requires labels in matching order, so call sites and callees always agree on the positional argument order in the generated JavaScript. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Cristiano Calcagno <cristianoc@users.noreply.github.com>
cristianoc
force-pushed
the
remove-label-commutation-lock
branch
from
August 14, 2026 10:59
c7dc72e to
a7c4c90
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c7dc72ed5c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #8547 +/- ##
==========================================
- Coverage 74.83% 74.83% -0.01%
==========================================
Files 477 477
Lines 63313 63284 -29
==========================================
- Hits 47382 47359 -23
+ Misses 15931 15925 -6
🚀 New features to boost your workflow:
|
rescript
@rescript/darwin-arm64
@rescript/darwin-x64
@rescript/linux-arm64
@rescript/linux-x64
@rescript/runtime
@rescript/win32-x64
commit: |
|
Developer playground preview: https://rescript-lang.github.io/rescript/dev-playground/?version=pr-8547 |
cknitt
approved these changes
Aug 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Removes the legacy
commutableflag fromTarrow, together with its plumbing (commu_repr,set_commu,copy_commu, theCcommuundo-log entry) and theIncoherent_label_ordererror.Previously, arrows created while inferring a function's type from its call sites were marked
Cunknown, and the argument-commuting loop intype_argsrefused to run on them. So a lambda parametergfirst called asg(~a=1, ~b=2)could not later be called asg(~b=3, ~a=4):Now labeled arguments commute at every call site regardless of whether the function type was declared or inferred.
Why this is sound
ReScript compiles labeled arguments positionally, in the order the parameters appear in the function's type. Reordering stays safe because:
force_tvarpath).unify3still requiressame_arg_labelposition by position, so any concrete function passed in must have been defined with its parameters in exactly the inferred order. Passing(~b, ~a) => …where(~a, ~b) => 'rwas inferred remains a type error.type_argswalks the type's arrows and picks the matching syntactic argument by name, so the generated JS always passes arguments in parameter order (g(~b=3, ~a=4)compiles tog(4, 3)).The
commutableflag guarded principality (the inferred type ofgdepends on which call is typed first), not soundness — and this inference path already isn't principal in ReScript, since the arity itself is fixed by whichever total application is typed first. The lock was protecting a property the language had already given up, at the cost of a confusing error.🤖 Generated with Claude Code