Download Latest Version 0.723 source code.tar.gz (2.4 MB)
Email in envelope

Get an email when there's a new version of Luau

Home / 0.721
Name Modified Size InfoDownloads / Week
Parent folder
luau-windows.zip 2026-05-15 2.8 MB
luau-ubuntu.zip 2026-05-15 6.9 MB
Luau.Web.js 2026-05-15 3.8 MB
luau-macos.zip 2026-05-15 5.1 MB
0.721 source code.tar.gz 2026-05-15 2.3 MB
0.721 source code.zip 2026-05-15 2.7 MB
README.md 2026-05-15 3.1 kB
Totals: 7 Items   23.7 MB 1

Language

  • Add support for read-only indexers using the syntax {read T} or {read [K]: V}. Read-only indexers are really useful for functions that accept an array, but don't modify it because calls to such a function can be tested covariantly rather than invariantly:

    :::luau function print_them_old(a: {Instance}) ... end function print_them_new(a: {read Instance}) ... end

    local players: {Players} = ...

    -- We have to reject this call because, for all we know, the -- function could insert non-Players into our Player array! print_them_old(players)

    -- This function is not allowed to write to the array so -- everything is fine. print_them_new(players)

  • Fix a unification bug that would result in incorrect inference in cases like 'a <: T | nil where 'a is a free type and T is an instantiated generic. This would result in incorrect inferences in cases like the following:

    :::luau local function f<T>(a: T & string): T return a end

    local b = f("hello") local c = f(("world" :: string))

  • First steps toward implementing classes. See the RFC for details.

Analysis

  • Ensure that inferred arguments to functions are instantiated. This fixes a class of bugs that could cause type inference to hang and consume lots of memory.
  • Improve the error that's reported when two table types are only incompatible because of a read/write restriction. This fixes cases where we would report nonsense errors like "number is not a subtype of number."

  • We had an issue where passing a function type through a type function would cause type inference to discard the data about the parameters' names even if the type was returned verbatim. This is now fixed.

Interpreter

  • Adjust the FASTCALL3 inlining cost model to line up with other fastcalls.
  • Reduce Luau VM interpreter loop stack pressure in Debug/NoOpt builds
  • Optimize the constant folding pass in the compiler

Native Code Generation

  • Introduce ExitSync blocks to help avoid synchronizing the VM stack unnecessarily.
  • NCG VM exit sync cannot include register from blocks not in a chain.
  • Add CALLFB instruction and feedback vectors in proto. This will be used to help the runtime know which function calls can be inlined.
  • Handle repeated IrCmd::LOAD_ENV and switch from table RegisterLink information to SSA info.

General

  • You can now pass --solver=new or --solver=old to luau-analyze tool to select the solver you'd like to use. It defaults to the new solver.

Internal Contributors

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: Vighnesh Vijay vvijay@roblox.com Co-authored-by: Vyacheslav Egorov vegorov@roblox.com

Source: README.md, updated 2026-05-15