Fix inconsistent typeSize calculation for TupleN vs recursive pair encodings
#24743
+29
−3
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.
Currently,
typeSizereports inconsistent values for standard tuple types (e.g.,(A, B)) compared to their semantically equivalent recursive pair encodings (e.g.,A *: B *: EmptyTuple).This discrepancy arises because
TupleNis represented as a flatAppliedType, whereas the nested encoding forms a deeper tree structure. AstypeSizeis often used as a heuristic for complexity or optimization limits, this inconsistency can lead to divergent behavior in the compiler depending on how a tuple is represented syntactically.This PR modifies
TypeSizeAccumulatorto canonicalizeTupleNtypes into their recursive*:representation before calculating their size. This ensures that the size metric is consistent regardless of whether the tuple is represented as a flatAppliedTypeor a nested structural type.I have added a new unit test in
TypesTestthat assertsTuple3[Int, Boolean, Double]andInt *: Boolean *: Double *: EmptyTupleboth yield identicaltypeSizeequal to 3.Thanks to @mbovel for providing the unit test that effectively reproduces this issue and validates the fix.
Fixes #24730