Skip to content

Commit 0084576

Browse files
hgoldsteinvrn-snayoungbloodrbxmenarulalamAviral Goel
authored
Sync to upstream/release/693 (#2021)
# New Solver * Avoid bidirectional inference always forcing constraints for simple code such as the example below. Fixes #2017. ```luau type Suit = "Hearts" | "Spades" | "Clubs" | "Diamonds" local getSuits(): { Suit } return { "Hearts", "Spades", "Clubs", "Diamonds" } end ``` * Iterating over an empty pack, such as in the below example, should error but still allow type inference to complete. ```luau local function foo() end -- has type `() -> ()` for _ in foo() do end -- Errors, as you can't iterate over `()`, but type inference still completes. ``` * Implement arity based overload selection: this allows for overloaded functions with generics to more consistently infer reasonable results. For example: ```luau -- This code no longer errors as we determine that the first overload to -- table.insert is what the author intended. table.insert({} :: { any }, 42) ``` * Allow the`table` type to be a subtype of generic tables. This means code like the following no longer raises a type error: ```luau local function doSomething(t: unknown) if type(t) == "table" then -- Prior we would error as `table` is not a subtype of a generic table -- Also works with `pairs` and similar builtin functions. local foo, bar = next(t) end end ``` * Descend into intersection types when performing bidirectional inference, this allows us to correctly bidirectionally infer code like: ```luau type A = { foo: "a" } type B = { bar: "b" } type AB = A & B -- No longer errors as the literals "a" and "b" will be inferred to be their singleton types. local t: AB = { foo = "a", bar = "b" } ``` * #2008 * Fix intersections between table types and extern types to preserve intersections when either type contains an indexer, fixing a regression introduced when trying to refine table and extern types more precisely: ```luau function f(obj: { [any]: any }, functionName: string) if typeof(obj) == "userdata" then -- No longer errors as we still have a `class & { [any]: any }` rather than a `class` local _ = obj[functionName] end end ``` * Separated recursion limits for different parts of the new solver. No immediate changes, but this creates more tools to tamp down on stack overflows without affecting other subsystems. # Runtime * Implement "stackless" `pcall` / `xpcall` in yieldable contexts: this lets recursive calls to `pcall` nest further, erroring at the Luau call stack limit (20000 calls as of this writing) rather than the C call stack limit (200 calls as of this writing) --- Co-authored-by: Ariel Weiss <[email protected]> Co-authored-by: Hunter Goldstein <[email protected]> Co-authored-by: Sora Kanosue <[email protected]> Co-authored-by: Varun Saini <[email protected]> Co-authored-by: Vighnesh Vijay <[email protected]> Co-authored-by: Vyacheslav Egorov <[email protected]> --------- Co-authored-by: Varun Saini <[email protected]> Co-authored-by: Alexander Youngblood <[email protected]> Co-authored-by: Menarul Alam <[email protected]> Co-authored-by: Aviral Goel <[email protected]> Co-authored-by: Vighnesh <[email protected]> Co-authored-by: Vyacheslav Egorov <[email protected]> Co-authored-by: Ariel Weiss <[email protected]> Co-authored-by: Andy Friesen <[email protected]>
1 parent 4b3bb06 commit 0084576

File tree

71 files changed

+2232
-838
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+2232
-838
lines changed

Analysis/include/Luau/BuiltinTypeFunctions.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ namespace Luau
99
struct BuiltinTypeFunctions
1010
{
1111
BuiltinTypeFunctions();
12+
BuiltinTypeFunctions(const BuiltinTypeFunctions&) = delete;
13+
void operator=(const BuiltinTypeFunctions&) = delete;
1214

1315
TypeFunction userFunc;
1416

@@ -51,6 +53,6 @@ struct BuiltinTypeFunctions
5153
void addToScope(NotNull<TypeArena> arena, NotNull<Scope> scope) const;
5254
};
5355

54-
const BuiltinTypeFunctions& builtinTypeFunctions();
56+
const BuiltinTypeFunctions& builtinTypeFunctions_DEPRECATED();
5557

5658
} // namespace Luau

Analysis/include/Luau/Frontend.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,14 +225,19 @@ struct Frontend
225225
);
226226

227227
// Batch module checking. Queue modules and check them together, retrieve results with 'getCheckResult'
228-
// If provided, 'executeTask' function is allowed to call the 'task' function on any thread and return without waiting for 'task' to complete
228+
// If provided, 'executeTasks' function is allowed to call any item in 'tasks' on any thread and return without waiting for them to complete
229229
void queueModuleCheck(const std::vector<ModuleName>& names);
230230
void queueModuleCheck(const ModuleName& name);
231-
std::vector<ModuleName> checkQueuedModules(
231+
std::vector<ModuleName> checkQueuedModules_DEPRECATED(
232232
std::optional<FrontendOptions> optionOverride = {},
233233
std::function<void(std::function<void()> task)> executeTask = {},
234234
std::function<bool(size_t done, size_t total)> progress = {}
235235
);
236+
std::vector<ModuleName> checkQueuedModules(
237+
std::optional<FrontendOptions> optionOverride = {},
238+
std::function<void(std::vector<std::function<void()>> tasks)> executeTasks = {},
239+
std::function<bool(size_t done, size_t total)> progress = {}
240+
);
236241

237242
std::optional<CheckResult> getCheckResult(const ModuleName& name, bool accumulateNested, bool forAutocomplete = false);
238243
std::vector<ModuleName> getRequiredScripts(const ModuleName& name);
@@ -270,7 +275,8 @@ struct Frontend
270275
void checkBuildQueueItems(std::vector<BuildQueueItem>& items);
271276
void recordItemResult(const BuildQueueItem& item);
272277
void performQueueItemTask(std::shared_ptr<BuildQueueWorkState> state, size_t itemPos);
273-
void sendQueueItemTask(std::shared_ptr<BuildQueueWorkState> state, size_t itemPos);
278+
void sendQueueItemTask_DEPRECATED(std::shared_ptr<BuildQueueWorkState> state, size_t itemPos);
279+
void sendQueueItemTasks(std::shared_ptr<BuildQueueWorkState> state, const std::vector<size_t>& items);
274280
void sendQueueCycleItemTask(std::shared_ptr<BuildQueueWorkState> state);
275281

276282
static LintResult classifyLints(const std::vector<LintWarning>& warnings, const Config& config);

Analysis/include/Luau/OverloadResolution.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,18 @@ struct OverloadResolver
107107
std::optional<TypeId> failedSubTy,
108108
std::optional<TypeId> failedSuperTy
109109
) const;
110+
111+
// Checks if the candidate args are arity-compatible with the desired parameters.
112+
// Used during overload selection to do arity-based filtering of overloads.
113+
// We do not accept nil in place of a generic unless that generic is explicitly optional.
114+
bool isArityCompatible(TypePackId candidate, TypePackId desired, NotNull<BuiltinTypes> builtinTypes) const;
115+
116+
bool testFunctionTypeForOverloadSelection(
117+
const FunctionType* ftv,
118+
NotNull<DenseHashSet<TypeId>> uniqueTypes,
119+
TypePackId argsPack,
120+
bool useFreeTypeBounds
121+
);
110122
};
111123

112124
struct SolveResult

Analysis/include/Luau/Subtyping.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,9 @@ struct Subtyping
269269
// TODO recursion limits
270270

271271
SubtypingResult isSubtype(TypeId subTy, TypeId superTy, NotNull<Scope> scope);
272-
SubtypingResult isSubtype(
272+
SubtypingResult isSubtype(TypePackId subTp, TypePackId superTp, NotNull<Scope> scope, const std::vector<TypeId>& bindableGenerics);
273+
// Clip with FFlagLuauPassBindableGenericsByReference
274+
SubtypingResult isSubtype_DEPRECATED(
273275
TypePackId subTp,
274276
TypePackId superTp,
275277
NotNull<Scope> scope,

Analysis/include/Luau/TableLiteralInference.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#pragma once
44

55
#include "Luau/Ast.h"
6+
#include "Luau/ConstraintSolver.h"
67
#include "Luau/DenseHash.h"
78
#include "Luau/NotNull.h"
89
#include "Luau/TypeFwd.h"
@@ -27,8 +28,8 @@ struct PushTypeResult
2728
PushTypeResult pushTypeInto(
2829
NotNull<DenseHashMap<const AstExpr*, TypeId>> astTypes,
2930
NotNull<DenseHashMap<const AstExpr*, TypeId>> astExpectedTypes,
30-
NotNull<BuiltinTypes> builtinTypes,
31-
NotNull<TypeArena> arena,
31+
NotNull<ConstraintSolver> solver,
32+
NotNull<const Constraint> constraint,
3233
NotNull<Unifier2> unifier,
3334
NotNull<Subtyping> subtyping,
3435
TypeId expectedType,

Analysis/include/Luau/Type.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct TypeFun;
3838
struct Constraint;
3939
struct Subtyping;
4040
struct TypeChecker2;
41+
struct BuiltinTypeFunctions;
4142

4243
enum struct SolverMode
4344
{
@@ -1000,6 +1001,7 @@ struct BuiltinTypes
10001001
bool debugFreezeArena = false;
10011002

10021003
public:
1004+
std::unique_ptr<BuiltinTypeFunctions> typeFunctions;
10031005
const TypeId nilType;
10041006
const TypeId numberType;
10051007
const TypeId stringType;

Analysis/include/Luau/TypeUtils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ bool isApproximatelyTruthyType(TypeId ty);
336336
// Unwraps any grouping expressions iteratively.
337337
AstExpr* unwrapGroup(AstExpr* expr);
338338

339+
// Returns true if ty is optional, ie if it is a supertype of nil
340+
bool isOptionalType(TypeId ty, NotNull<BuiltinTypes> builtinTypes);
341+
339342
// These are magic types used in `TypeChecker2` and `NonStrictTypeChecker`
340343
//
341344
// `_luau_print` causes it's argument to be printed out, as in:

Analysis/src/BuiltinDefinitions.cpp

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ LUAU_FASTFLAG(LuauSolverV2)
3535
LUAU_FASTFLAGVARIABLE(LuauTableCloneClonesType3)
3636
LUAU_FASTFLAG(LuauUseWorkspacePropToChooseSolver)
3737
LUAU_FASTFLAG(LuauEmplaceNotPushBack)
38+
LUAU_FASTFLAG(LuauBuiltinTypeFunctionsArentGlobal)
3839

3940
namespace Luau
4041
{
@@ -368,8 +369,17 @@ void registerBuiltinGlobals(Frontend& frontend, GlobalTypes& globals, bool typeC
368369
NotNull<BuiltinTypes> builtinTypes = globals.builtinTypes;
369370
NotNull<Scope> globalScope{globals.globalScope.get()};
370371

371-
if (frontend.getLuauSolverMode() == SolverMode::New)
372-
builtinTypeFunctions().addToScope(NotNull{&arena}, NotNull{globals.globalScope.get()});
372+
if (FFlag::LuauBuiltinTypeFunctionsArentGlobal)
373+
{
374+
if (frontend.getLuauSolverMode() == SolverMode::New)
375+
builtinTypes->typeFunctions->addToScope(NotNull{&arena}, NotNull{globals.globalScope.get()});
376+
}
377+
else
378+
{
379+
if (frontend.getLuauSolverMode() == SolverMode::New)
380+
builtinTypeFunctions_DEPRECATED().addToScope(NotNull{&arena}, NotNull{globals.globalScope.get()});
381+
}
382+
373383

374384
LoadDefinitionFileResult loadResult = frontend.loadDefinitionFile(
375385
globals, globals.globalScope, getBuiltinDefinitionSource(), "@luau", /* captureComments */ false, typeCheckForAutocomplete
@@ -438,7 +448,13 @@ void registerBuiltinGlobals(Frontend& frontend, GlobalTypes& globals, bool typeC
438448
if (frontend.getLuauSolverMode() == SolverMode::New)
439449
{
440450
// getmetatable : <T>(T) -> getmetatable<T>
441-
TypeId getmtReturn = arena.addType(TypeFunctionInstanceType{builtinTypeFunctions().getmetatableFunc, {genericT}});
451+
TypeId getmtReturn = arena.addType(
452+
TypeFunctionInstanceType{
453+
FFlag::LuauBuiltinTypeFunctionsArentGlobal ? builtinTypes->typeFunctions->getmetatableFunc
454+
: builtinTypeFunctions_DEPRECATED().getmetatableFunc,
455+
{genericT}
456+
}
457+
);
442458
addGlobalBinding(globals, "getmetatable", makeFunction(arena, std::nullopt, {genericT}, {}, {genericT}, {getmtReturn}), "@luau");
443459
}
444460
else
@@ -450,7 +466,13 @@ void registerBuiltinGlobals(Frontend& frontend, GlobalTypes& globals, bool typeC
450466
if (frontend.getLuauSolverMode() == SolverMode::New)
451467
{
452468
// setmetatable<T: {}, MT>(T, MT) -> setmetatable<T, MT>
453-
TypeId setmtReturn = arena.addType(TypeFunctionInstanceType{builtinTypeFunctions().setmetatableFunc, {genericT, genericMT}});
469+
TypeId setmtReturn = arena.addType(
470+
TypeFunctionInstanceType{
471+
FFlag::LuauBuiltinTypeFunctionsArentGlobal ? builtinTypes->typeFunctions->setmetatableFunc
472+
: builtinTypeFunctions_DEPRECATED().setmetatableFunc,
473+
{genericT, genericMT}
474+
}
475+
);
454476
addGlobalBinding(
455477
globals, "setmetatable", makeFunction(arena, std::nullopt, {genericT, genericMT}, {}, {genericT, genericMT}, {setmtReturn}), "@luau"
456478
);
@@ -482,7 +504,12 @@ void registerBuiltinGlobals(Frontend& frontend, GlobalTypes& globals, bool typeC
482504
TypeId genericT = arena.addType(GenericType{globalScope, "T"});
483505
TypeId refinedTy = arena.addType(
484506
TypeFunctionInstanceType{
485-
NotNull{&builtinTypeFunctions().intersectFunc}, {genericT, arena.addType(NegationType{builtinTypes->falsyType})}, {}
507+
NotNull{
508+
FFlag::LuauBuiltinTypeFunctionsArentGlobal ? &builtinTypes->typeFunctions->intersectFunc
509+
: &builtinTypeFunctions_DEPRECATED().intersectFunc
510+
},
511+
{genericT, arena.addType(NegationType{builtinTypes->falsyType})},
512+
{}
486513
}
487514
);
488515

Analysis/src/BuiltinTypeFunctions.cpp

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ LUAU_FASTFLAG(LuauEGFixGenericsList)
2929
LUAU_FASTFLAG(LuauExplicitSkipBoundTypes)
3030
LUAU_FASTFLAG(LuauRawGetHandlesNil)
3131
LUAU_FASTFLAG(LuauNoMoreComparisonTypeFunctions)
32+
LUAU_FASTFLAGVARIABLE(LuauBuiltinTypeFunctionsArentGlobal)
33+
LUAU_FASTFLAG(LuauPassBindableGenericsByReference)
3234

3335
namespace Luau
3436
{
@@ -110,7 +112,10 @@ std::optional<TypeFunctionReductionResult<TypeId>> tryDistributeTypeFunctionApp(
110112

111113
TypeId resultTy = ctx->arena->addType(
112114
TypeFunctionInstanceType{
113-
NotNull{&builtinTypeFunctions().unionFunc},
115+
NotNull{
116+
FFlag::LuauBuiltinTypeFunctionsArentGlobal ? &ctx->builtins->typeFunctions->unionFunc
117+
: &builtinTypeFunctions_DEPRECATED().unionFunc
118+
},
114119
std::move(results),
115120
{},
116121
}
@@ -238,7 +243,12 @@ TypeFunctionReductionResult<TypeId> lenTypeFunction(
238243
return {std::nullopt, Reduction::Erroneous, {}, {}}; // occurs check failed
239244

240245
Subtyping subtyping{ctx->builtins, ctx->arena, ctx->simplifier, ctx->normalizer, ctx->typeFunctionRuntime, ctx->ice};
241-
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope).isSubtype) // TODO: is this the right variance?
246+
if (FFlag::LuauPassBindableGenericsByReference)
247+
{
248+
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope, {}).isSubtype)
249+
return {std::nullopt, Reduction::Erroneous, {}, {}};
250+
}
251+
else if (!subtyping.isSubtype_DEPRECATED(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope).isSubtype) // TODO: is this the right variance?
242252
return {std::nullopt, Reduction::Erroneous, {}, {}};
243253

244254
// `len` must return a `number`.
@@ -322,7 +332,13 @@ TypeFunctionReductionResult<TypeId> unmTypeFunction(
322332
if (!FFlag::LuauEGFixGenericsList)
323333
{
324334
Subtyping subtyping{ctx->builtins, ctx->arena, ctx->simplifier, ctx->normalizer, ctx->typeFunctionRuntime, ctx->ice};
325-
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope).isSubtype) // TODO: is this the right variance?
335+
if (FFlag::LuauPassBindableGenericsByReference)
336+
{
337+
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope, {}).isSubtype)
338+
return {std::nullopt, Reduction::Erroneous, {}, {}};
339+
}
340+
else if (!subtyping.isSubtype_DEPRECATED(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope)
341+
.isSubtype) // TODO: is this the right variance?
326342
return {std::nullopt, Reduction::Erroneous, {}, {}};
327343
}
328344

@@ -679,7 +695,12 @@ TypeFunctionReductionResult<TypeId> concatTypeFunction(
679695
return {std::nullopt, Reduction::Erroneous, {}, {}}; // occurs check failed
680696

681697
Subtyping subtyping{ctx->builtins, ctx->arena, ctx->simplifier, ctx->normalizer, ctx->typeFunctionRuntime, ctx->ice};
682-
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope).isSubtype) // TODO: is this the right variance?
698+
if (FFlag::LuauPassBindableGenericsByReference)
699+
{
700+
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope, {}).isSubtype)
701+
return {std::nullopt, Reduction::Erroneous, {}, {}};
702+
}
703+
else if (!subtyping.isSubtype_DEPRECATED(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope).isSubtype) // TODO: is this the right variance?
683704
return {std::nullopt, Reduction::Erroneous, {}, {}};
684705

685706
return {ctx->builtins->stringType, Reduction::MaybeOk, {}, {}};
@@ -888,7 +909,12 @@ static TypeFunctionReductionResult<TypeId> comparisonTypeFunction(
888909
return {std::nullopt, Reduction::Erroneous, {}, {}}; // occurs check failed
889910

890911
Subtyping subtyping{ctx->builtins, ctx->arena, ctx->simplifier, ctx->normalizer, ctx->typeFunctionRuntime, ctx->ice};
891-
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope).isSubtype) // TODO: is this the right variance?
912+
if (FFlag::LuauPassBindableGenericsByReference)
913+
{
914+
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope, {}).isSubtype)
915+
return {std::nullopt, Reduction::Erroneous, {}, {}};
916+
}
917+
else if (!subtyping.isSubtype_DEPRECATED(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope).isSubtype) // TODO: is this the right variance?
892918
return {std::nullopt, Reduction::Erroneous, {}, {}};
893919

894920
return {ctx->builtins->booleanType, Reduction::MaybeOk, {}, {}};
@@ -1017,7 +1043,12 @@ TypeFunctionReductionResult<TypeId> eqTypeFunction(
10171043
return {std::nullopt, Reduction::Erroneous, {}, {}}; // occurs check failed
10181044

10191045
Subtyping subtyping{ctx->builtins, ctx->arena, ctx->simplifier, ctx->normalizer, ctx->typeFunctionRuntime, ctx->ice};
1020-
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope).isSubtype) // TODO: is this the right variance?
1046+
if (FFlag::LuauPassBindableGenericsByReference)
1047+
{
1048+
if (!subtyping.isSubtype(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope, {}).isSubtype)
1049+
return {std::nullopt, Reduction::Erroneous, {}, {}};
1050+
}
1051+
else if (!subtyping.isSubtype_DEPRECATED(inferredArgPack, instantiatedMmFtv->argTypes, ctx->scope).isSubtype) // TODO: is this the right variance?
10211052
return {std::nullopt, Reduction::Erroneous, {}, {}};
10221053

10231054
return {ctx->builtins->booleanType, Reduction::MaybeOk, {}, {}};
@@ -1575,11 +1606,23 @@ struct CollectUnionTypeOptions : TypeOnceVisitor
15751606

15761607
bool visit(TypeId ty, const TypeFunctionInstanceType& tfit) override
15771608
{
1578-
if (tfit.function->name != builtinTypeFunctions().unionFunc.name)
1609+
if (FFlag::LuauBuiltinTypeFunctionsArentGlobal)
15791610
{
1580-
options.insert(ty);
1581-
blockingTypes.insert(ty);
1582-
return false;
1611+
if (tfit.function->name != ctx->builtins->typeFunctions->unionFunc.name)
1612+
{
1613+
options.insert(ty);
1614+
blockingTypes.insert(ty);
1615+
return false;
1616+
}
1617+
}
1618+
else
1619+
{
1620+
if (tfit.function->name != builtinTypeFunctions_DEPRECATED().unionFunc.name)
1621+
{
1622+
options.insert(ty);
1623+
blockingTypes.insert(ty);
1624+
return false;
1625+
}
15831626
}
15841627
return true;
15851628
}
@@ -2031,8 +2074,16 @@ bool searchPropsAndIndexer(
20312074
if (auto tfit = get<TypeFunctionInstanceType>(indexType))
20322075
{
20332076
// if we have an index function here, it means we're in a cycle, so let's see if it's well-founded if we tie the knot
2034-
if (tfit->function.get() == &builtinTypeFunctions().indexFunc)
2035-
indexType = follow(tblIndexer->indexResultType);
2077+
if (FFlag::LuauBuiltinTypeFunctionsArentGlobal)
2078+
{
2079+
if (tfit->function.get() == &ctx->builtins->typeFunctions->indexFunc)
2080+
indexType = follow(tblIndexer->indexResultType);
2081+
}
2082+
else
2083+
{
2084+
if (tfit->function.get() == &builtinTypeFunctions_DEPRECATED().indexFunc)
2085+
indexType = follow(tblIndexer->indexResultType);
2086+
}
20362087
}
20372088

20382089
if (isSubtype(ty, indexType, ctx->scope, ctx->builtins, ctx->simplifier, *ctx->ice, SolverMode::New))
@@ -2677,7 +2728,8 @@ void BuiltinTypeFunctions::addToScope(NotNull<TypeArena> arena, NotNull<Scope> s
26772728
scope->exportedTypeBindings[getmetatableFunc.name] = mkUnaryTypeFunction(&getmetatableFunc);
26782729
}
26792730

2680-
const BuiltinTypeFunctions& builtinTypeFunctions()
2731+
2732+
const BuiltinTypeFunctions& builtinTypeFunctions_DEPRECATED()
26812733
{
26822734
static std::unique_ptr<const BuiltinTypeFunctions> result = std::make_unique<BuiltinTypeFunctions>();
26832735

0 commit comments

Comments
 (0)