Sync to upstream/release/740 - #2990
Merged
Merged
Conversation
Howdy folks! Welcome to a somewhat language feature heavy Luau update! * Introducing an experimental feature to make tables "exact" by default. See luau-lang/rfcs#11 for full details, but the gist is to differentiate between tables that may have extraneous fields and tables that do not. We believe that this behavior better aligns with user expectations, and allows us to make the type system more predictable. ```luau -- This table may have extra fields type Inexact = { x: number, y: number, ... } -- This table _does not_ have extra fields type Exact = { x: number, y: number } local _: Inexact = { x = 3, y = 4, foo = "spooky" } -- OK! local _: Exact = { x = 3, y = 4, foo = "spooky" } -- Not OK! ``` * `if local` **is still experimental** but is moving closer to a full release. * Removed `Luau::Set`, now entirely subsumed by the new `DenseHashSet` implementation. * Fixed an internal error that could occur when processing exceptionally large types ("Internal recursion counter limit exceeded in ReferenceCountInitializer"). * Fixed a bug in function normalization that meant we'd use argument types as return types: ```luau function g(x : (() -> string | number) & (() -> number | boolean)) local z : () -> () = x -- This should not be allowed end ``` * Fixed an issue where OOMing during table re-hashing or freezing could leave the underlying table in an unexpected state. * When dumping bytecode, upvalues are now prefixed with `U` * Fixed `integer.idiv(x, y)` not being floored in some configurations, resulting in differing behavior across the interpreter, NCG backends, and constant folding. Co-authored-by: Andreas Haeberlen <andreas.haeberlen@roblox.com> Co-authored-by: Andy Friesen <afriesen@roblox.com> Co-authored-by: Annie Tang <annietang@roblox.com> Co-authored-by: Ariel Weiss <arielweiss@roblox.com> Co-authored-by: Hunter Goldstein <hgoldstein@roblox.com> Co-authored-by: Ilya Rezvov <irezvov@roblox.com> Co-authored-by: Sora Kanosue <skanosue@roblox.com> Co-authored-by: Thomas Schollenberger <tschollenberger@roblox.com> Co-authored-by: Vighnesh Vijay <vvijay@roblox.com> Co-authored-by: Vyacheslav Egorov <vegorov@roblox.com>
| return here; | ||
|
|
||
| if (get<NeverType>(here)) | ||
| return there; |
Contributor
There was a problem hiding this comment.
This doesn't seem quite right to me, it reads like never & t == t.
Contributor
Author
There was a problem hiding this comment.
I would also agree, though I can see that this exact block is in the old implementation; frankly this method has really confusing preconditions (we expect here and there to be ... I think always tables or any?), so we'll get back to y'all on this one.
vegorov-rbx
approved these changes
Sep 25, 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.
Language
if localis still experimental but is moving closer to a full release.Analysis
Luau::Set, now entirely subsumed by the newDenseHashSetimplementation.Runtime
Uinteger.idiv(x, y)not being floored in some configurations, resulting in differing behavior across the interpreter, NCG backends, and constant folding.Co-authored-by: Andreas Haeberlen andreas.haeberlen@roblox.com
Co-authored-by: Andy Friesen afriesen@roblox.com
Co-authored-by: Annie Tang annietang@roblox.com
Co-authored-by: Ariel Weiss arielweiss@roblox.com
Co-authored-by: Hunter Goldstein hgoldstein@roblox.com
Co-authored-by: Ilya Rezvov irezvov@roblox.com
Co-authored-by: Sora Kanosue skanosue@roblox.com
Co-authored-by: Thomas Schollenberger tschollenberger@roblox.com
Co-authored-by: Vighnesh Vijay vvijay@roblox.com
Co-authored-by: Vyacheslav Egorov vegorov@roblox.com