Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: luau-lang/luau
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0.686
Choose a base ref
...
head repository: luau-lang/luau
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 0.687
Choose a head ref
  • 1 commit
  • 99 files changed
  • 9 contributors

Commits on Aug 15, 2025

  1. Sync to upstream/release/687 (#1954)

    ## What's Changed?
    
    This week we have an update with an implementation for one of the RFCs
    we had approved before, an improvement of the new type solver and a
    small Lua 5.1 C API compatibility improvement.
    
    * `@deprecated` attribute can now have a custom suggestion for a
    replacement and a reason message as described in [deprecated attribute
    parameters
    RFC](https://rfcs.luau.org/syntax-attribute-functions-deprecated.html)
    
    For example:
    ```luau
    @[deprecated {reason = "foo suffers from performance issues", use = "bar"}]
    local function foo()
        ...
    end
    
    -- Function 'foo' is deprecated, use 'bar' instead. foo suffers from performance issues
    foo()
    ```
    
    * `lua_cpcall` C API function has been restored both for compatibility
    with Lua 5.1 and as a safe way to enter protected call environment to
    work with Luau C API functions that may error
    
    Instead of
    ```
    if (!lua_checkstack(L, 2))
        return -1;
    lua_pushcfunction(L, test, nullptr);
    lua_pushlightuserdata(L, context);
    int status = lua_pcall(L, 1, 0, 0);
    ```
    you can simply do 
    ```
    int status = lua_cpcall(L, test, context);
    ```
    
    * In Luau CLI, required module return values can now have any type
    
    ## New Type Solver
    - Additional improvements on type refinements used with external types
    should fix some reported false positive errors where types refined to
    `never`
    - Fixed an issue in recursive refinement types in a form of `t1 where t1
    = refine<t1, _>` getting 'stuck'
    - Fixed an issue in subtyping of generic functions, it is now possible
    to assign `<T>(T, (T) -> T) -> T` to `(number, <X>(X) -> X) -> number`
    - Fixed an ICE caused by recursive types (Fixes #1686)
    - Added additional iteration and recursion limits to stop the type
    solver before system resources are used up
    
    ## Internal Contributors
    
    Co-authored-by: Andy Friesen <afriesen@roblox.com>
    Co-authored-by: Annie Tang <annietang@roblox.com>
    Co-authored-by: Ariel Weiss <aaronweiss@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>
    9 people authored Aug 15, 2025
    Configuration menu
    Copy the full SHA
    55f3e00 View commit details
    Browse the repository at this point in the history
Loading