Skip to content

Commit 1283b54

Browse files
authored
Merge pull request #16251 from huonw/no-std-function
std::function -> llvm::function_ref for some non-escaping params.
2 parents 53c065a + 401b7c4 commit 1283b54

40 files changed

+132
-134
lines changed

include/swift/AST/Expr.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,13 +459,13 @@ class alignas(8) Expr {
459459
/// Enumerate each immediate child expression of this node, invoking the
460460
/// specific functor on it. This ignores statements and other non-expression
461461
/// children.
462-
void forEachImmediateChildExpr(const std::function<Expr*(Expr*)> &callback);
462+
void forEachImmediateChildExpr(llvm::function_ref<Expr *(Expr *)> callback);
463463

464464
/// Enumerate each expr node within this expression subtree, invoking the
465465
/// specific functor on it. This ignores statements and other non-expression
466466
/// children, and if there is a closure within the expression, this does not
467467
/// walk into the body of it (unless it is single-expression).
468-
void forEachChildExpr(const std::function<Expr*(Expr*)> &callback);
468+
void forEachChildExpr(llvm::function_ref<Expr *(Expr *)> callback);
469469

470470
/// Determine whether this expression refers to a type by name.
471471
///

include/swift/AST/Pattern.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,14 @@ class alignas(8) Pattern {
166166

167167
/// \brief apply the specified function to all variables referenced in this
168168
/// pattern.
169-
void forEachVariable(const std::function<void(VarDecl*)> &f) const;
169+
void forEachVariable(llvm::function_ref<void(VarDecl *)> f) const;
170170

171171
/// \brief apply the specified function to all pattern nodes recursively in
172172
/// this pattern. This is a pre-order traversal.
173-
void forEachNode(const std::function<void(Pattern*)> &f);
173+
void forEachNode(llvm::function_ref<void(Pattern *)> f);
174174

175-
void forEachNode(const std::function<void(const Pattern*)> &f) const {
176-
const std::function<void(Pattern*)> &f2 = f;
175+
void forEachNode(llvm::function_ref<void(const Pattern *)> f) const {
176+
llvm::function_ref<void(Pattern *)> f2 = f;
177177
const_cast<Pattern *>(this)->forEachNode(f2);
178178
}
179179

include/swift/AST/Types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,7 @@ class alignas(1 << TypeAlignInBits) TypeBase {
835835
/// paramsAndResultMatch which determines in a client-specific way
836836
/// whether the parameters and result of the types match.
837837
bool matchesFunctionType(Type other, TypeMatchOptions matchOptions,
838-
std::function<bool()> paramsAndResultMatch);
838+
llvm::function_ref<bool()> paramsAndResultMatch);
839839

840840
/// \brief Determines whether this type has a retainable pointer
841841
/// representation, i.e. whether it is representable as a single,

include/swift/Frontend/FrontendOptions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class FrontendOptions {
3838
InputFileKind InputKind = InputFileKind::IFK_Swift;
3939

4040
void forAllOutputPaths(const InputFile &input,
41-
std::function<void(StringRef)> fn) const;
41+
llvm::function_ref<void(StringRef)> fn) const;
4242

4343
bool isOutputFileDirectory() const;
4444

include/swift/IDE/Utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ bool initInvocationByClangArguments(ArrayRef<const char *> ArgList,
8787
/// Visits all overridden declarations exhaustively from VD, including protocol
8888
/// conformances and clang declarations.
8989
void walkOverriddenDecls(const ValueDecl *VD,
90-
std::function<void(llvm::PointerUnion<
90+
llvm::function_ref<void(llvm::PointerUnion<
9191
const ValueDecl*, const clang::NamedDecl*>)> Fn);
9292

9393
void collectModuleNames(StringRef SDKPath, std::vector<std::string> &Modules);

include/swift/Parse/Parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ class Parser {
675675
ParserStatus parseList(tok RightK, SourceLoc LeftLoc, SourceLoc &RightLoc,
676676
bool AllowSepAfterLast, Diag<> ErrorDiag,
677677
syntax::SyntaxKind Kind,
678-
std::function<ParserStatus()> callback);
678+
llvm::function_ref<ParserStatus()> callback);
679679

680680
void consumeTopLevelDecl(ParserPosition BeginParserPosition,
681681
TopLevelCodeDecl *TLCD);

include/swift/SIL/MemAccessUtils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ bool isPossibleFormalAccessBase(const AccessedStorage &storage, SILFunction *F);
295295
/// This only visits instructions that modify memory in some user-visible way,
296296
/// which could be considered part of a formal access.
297297
void visitAccessedAddress(SILInstruction *I,
298-
std::function<void(Operand *)> visitor);
298+
llvm::function_ref<void(Operand *)> visitor);
299299

300300
} // end namespace swift
301301

include/swift/SILOptimizer/Analysis/ClosureScope.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ class TopDownClosureFunctionOrder {
177177
// Visit all functions in a module, visiting each closure scope function
178178
// before
179179
// the closure function itself.
180-
void visitFunctions(std::function<void(SILFunction *)> visitor);
180+
void visitFunctions(llvm::function_ref<void(SILFunction *)> visitor);
181181
};
182182

183183
} // end namespace swift

include/swift/SILOptimizer/Utils/Local.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ NullablePtr<SILInstruction> createDecrementBefore(SILValue Ptr,
6363
void
6464
recursivelyDeleteTriviallyDeadInstructions(
6565
ArrayRef<SILInstruction*> I, bool Force = false,
66-
std::function<void(SILInstruction *)> C = [](SILInstruction *){});
66+
llvm::function_ref<void(SILInstruction *)> C = [](SILInstruction *){});
6767

6868
/// \brief If the given instruction is dead, delete it along with its dead
6969
/// operands.
@@ -76,7 +76,7 @@ void
7676
recursivelyDeleteTriviallyDeadInstructions(
7777
SILInstruction *I,
7878
bool Force = false,
79-
std::function<void(SILInstruction *)> C = [](SILInstruction *){});
79+
llvm::function_ref<void(SILInstruction *)> C = [](SILInstruction *){});
8080

8181
/// \brief Perform a fast local check to see if the instruction is dead.
8282
///
@@ -96,7 +96,7 @@ collectUsesOfValue(SILValue V, llvm::SmallPtrSetImpl<SILInstruction *> &Insts);
9696
/// instruction itself)
9797
void eraseUsesOfInstruction(
9898
SILInstruction *Inst,
99-
std::function<void(SILInstruction *)> C = [](SILInstruction *){});
99+
llvm::function_ref<void(SILInstruction *)> C = [](SILInstruction *){});
100100

101101
/// \brief Recursively erase all of the uses of the value (but not the
102102
/// value itself)

include/swift/Syntax/AtomicCache.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include <functional>
1717
#include "swift/Syntax/References.h"
18+
#include "llvm/ADT/STLExtras.h"
1819

1920
namespace swift {
2021

@@ -38,7 +39,7 @@ class AtomicCache {
3839

3940
/// Gets the value inside the cache, or creates it atomically using the
4041
/// provided lambda if it doesn't already exist.
41-
RC<T> getOrCreate(std::function<RC<T> ()> Create) const {
42+
RC<T> getOrCreate(llvm::function_ref<RC<T>()> Create) const {
4243
auto &Ptr = *reinterpret_cast<std::atomic<uintptr_t> *>(&Storage);
4344

4445
// If an atomic load gets an initialized value, then return Storage.

lib/AST/ASTPrinter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ class PrintAST : public ASTVisitor<PrintAST> {
624624
bool Curried, bool ArgNameIsAPIByDefault);
625625

626626
void printParameterList(ParameterList *PL, Type paramListTy, bool isCurried,
627-
std::function<bool()> isAPINameByDefault);
627+
llvm::function_ref<bool()> isAPINameByDefault);
628628

629629
/// \brief Print the function parameters in curried or selector style,
630630
/// to match the original function declaration.
@@ -2310,7 +2310,7 @@ void PrintAST::printOneParameter(const ParamDecl *param,
23102310

23112311
void PrintAST::printParameterList(ParameterList *PL, Type paramListTy,
23122312
bool isCurried,
2313-
std::function<bool()> isAPINameByDefault) {
2313+
llvm::function_ref<bool()> isAPINameByDefault) {
23142314
SmallVector<ParameterTypeFlags, 4> paramFlags;
23152315
if (paramListTy && !paramListTy->hasError()) {
23162316
if (auto parenTy = dyn_cast<ParenType>(paramListTy.getPointer())) {

lib/AST/ASTVerifier.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3414,9 +3414,8 @@ class Verifier : public ASTWalker {
34143414

34153415
/// \brief Verify that the given source ranges is contained within the
34163416
/// parent's source range.
3417-
void checkSourceRanges(SourceRange Current,
3418-
ASTWalker::ParentTy Parent,
3419-
std::function<void()> printEntity) {
3417+
void checkSourceRanges(SourceRange Current, ASTWalker::ParentTy Parent,
3418+
llvm::function_ref<void()> printEntity) {
34203419
SourceRange Enclosing;
34213420
if (Parent.isNull())
34223421
return;

lib/AST/Expr.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -540,12 +540,12 @@ ConcreteDeclRef Expr::getReferencedDecl() const {
540540
/// specific functor on it. This ignores statements and other non-expression
541541
/// children.
542542
void Expr::
543-
forEachImmediateChildExpr(const std::function<Expr*(Expr*)> &callback) {
543+
forEachImmediateChildExpr(llvm::function_ref<Expr *(Expr *)> callback) {
544544
struct ChildWalker : ASTWalker {
545-
const std::function<Expr*(Expr*)> &callback;
545+
llvm::function_ref<Expr *(Expr *)> callback;
546546
Expr *ThisNode;
547547

548-
ChildWalker(const std::function<Expr*(Expr*)> &callback, Expr *ThisNode)
548+
ChildWalker(llvm::function_ref<Expr *(Expr *)> callback, Expr *ThisNode)
549549
: callback(callback), ThisNode(ThisNode) {}
550550

551551
std::pair<bool, Expr *> walkToExprPre(Expr *E) override {
@@ -576,11 +576,11 @@ forEachImmediateChildExpr(const std::function<Expr*(Expr*)> &callback) {
576576
/// Enumerate each immediate child expression of this node, invoking the
577577
/// specific functor on it. This ignores statements and other non-expression
578578
/// children.
579-
void Expr::forEachChildExpr(const std::function<Expr*(Expr*)> &callback) {
579+
void Expr::forEachChildExpr(llvm::function_ref<Expr *(Expr *)> callback) {
580580
struct ChildWalker : ASTWalker {
581-
const std::function<Expr*(Expr*)> &callback;
581+
llvm::function_ref<Expr *(Expr *)> callback;
582582

583-
ChildWalker(const std::function<Expr*(Expr*)> &callback)
583+
ChildWalker(llvm::function_ref<Expr *(Expr *)> callback)
584584
: callback(callback) {}
585585

586586
std::pair<bool, Expr *> walkToExprPre(Expr *E) override {

lib/AST/Pattern.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ namespace {
190190

191191
/// \brief apply the specified function to all variables referenced in this
192192
/// pattern.
193-
void Pattern::forEachVariable(const std::function<void(VarDecl*)> &fn) const {
193+
void Pattern::forEachVariable(llvm::function_ref<void(VarDecl *)> fn) const {
194194
switch (getKind()) {
195195
case PatternKind::Any:
196196
case PatternKind::Bool:
@@ -235,7 +235,7 @@ void Pattern::forEachVariable(const std::function<void(VarDecl*)> &fn) const {
235235

236236
/// \brief apply the specified function to all pattern nodes recursively in
237237
/// this pattern. This is a pre-order traversal.
238-
void Pattern::forEachNode(const std::function<void(Pattern*)> &f) {
238+
void Pattern::forEachNode(llvm::function_ref<void(Pattern*)> f) {
239239
f(this);
240240

241241
switch (getKind()) {

lib/AST/Type.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2226,7 +2226,7 @@ namespace {
22262226
static bool matchesFunctionType(CanAnyFunctionType fn1, CanAnyFunctionType fn2,
22272227
TypeMatchOptions matchMode,
22282228
OptionalUnwrapping insideOptional,
2229-
std::function<bool()> paramsAndResultMatch) {
2229+
llvm::function_ref<bool()> paramsAndResultMatch) {
22302230
// FIXME: Handle generic functions in non-ABI matches.
22312231
if (!matchMode.contains(TypeMatchFlags::AllowABICompatible)) {
22322232
if (!isa<FunctionType>(fn1) || !isa<FunctionType>(fn2))
@@ -2335,7 +2335,7 @@ static bool matches(CanType t1, CanType t2, TypeMatchOptions matchMode,
23352335
if (!fn1)
23362336
return false;
23372337

2338-
std::function<bool()> paramsAndResultMatch = [=]() {
2338+
auto paramsAndResultMatch = [&]() {
23392339
// Inputs are contravariant, results are covariant.
23402340
return (matches(fn2.getInput(), fn1.getInput(), matchMode,
23412341
ParameterPosition::Parameter, OptionalUnwrapping::None) &&
@@ -2371,7 +2371,7 @@ bool TypeBase::matchesParameter(Type other, TypeMatchOptions matchMode) {
23712371
}
23722372

23732373
bool TypeBase::matchesFunctionType(Type other, TypeMatchOptions matchMode,
2374-
std::function<bool()> paramsAndResultMatch) {
2374+
llvm::function_ref<bool()> paramsAndResultMatch) {
23752375
auto thisFnTy = dyn_cast<AnyFunctionType>(getCanonicalType());
23762376
auto otherFnTy = dyn_cast<AnyFunctionType>(other->getCanonicalType());
23772377

lib/Driver/Driver.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,7 @@ static Arg *makeInputArg(const DerivedArgList &Args, OptTable &Opts,
871871
return A;
872872
}
873873

874-
using RemainingArgsHandler = std::function<void(InputArgList &, unsigned)>;
874+
using RemainingArgsHandler = llvm::function_ref<void(InputArgList &, unsigned)>;
875875

876876
std::unique_ptr<InputArgList>
877877
parseArgsUntil(const llvm::opt::OptTable& Opts,

lib/Frontend/FrontendOptions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ bool FrontendOptions::shouldActionOnlyParse(ActionType action) {
108108
}
109109

110110
void FrontendOptions::forAllOutputPaths(
111-
const InputFile &input, std::function<void(StringRef)> fn) const {
111+
const InputFile &input, llvm::function_ref<void(StringRef)> fn) const {
112112
if (RequestedAction != FrontendOptions::ActionType::EmitModuleOnly &&
113113
RequestedAction != FrontendOptions::ActionType::MergeModules) {
114114
if (InputsAndOutputs.isWholeModule())

lib/IDE/Utils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ static void walkOverriddenClangDecls(const clang::NamedDecl *D, const FnTy &Fn){
375375

376376
void
377377
ide::walkOverriddenDecls(const ValueDecl *VD,
378-
std::function<void(llvm::PointerUnion<
378+
llvm::function_ref<void(llvm::PointerUnion<
379379
const ValueDecl*, const clang::NamedDecl*>)> Fn) {
380380
for (auto CurrOver = VD; CurrOver; CurrOver = CurrOver->getOverriddenDecl()) {
381381
if (CurrOver != VD)

lib/IRGen/GenEnum.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3895,7 +3895,7 @@ namespace {
38953895
}
38963896

38973897
void forNontrivialPayloads(IRGenFunction &IGF, llvm::Value *tag,
3898-
std::function<void (unsigned, EnumImplStrategy::Element)> f)
3898+
llvm::function_ref<void(unsigned, EnumImplStrategy::Element)> f)
38993899
const {
39003900
auto *endBB = llvm::BasicBlock::Create(IGF.IGM.getLLVMContext());
39013901

lib/IRGen/GenExistential.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,12 +1545,11 @@ TypeConverter::convertExistentialMetatypeType(ExistentialMetatypeType *T) {
15451545

15461546
/// Emit protocol witness table pointers for the given protocol conformances,
15471547
/// passing each emitted witness table index into the given function body.
1548-
static void forEachProtocolWitnessTable(IRGenFunction &IGF,
1549-
CanType srcType, llvm::Value **srcMetadataCache,
1550-
CanType destType,
1551-
ArrayRef<ProtocolEntry> protocols,
1552-
ArrayRef<ProtocolConformanceRef> conformances,
1553-
std::function<void (unsigned, llvm::Value*)> body) {
1548+
static void forEachProtocolWitnessTable(
1549+
IRGenFunction &IGF, CanType srcType, llvm::Value **srcMetadataCache,
1550+
CanType destType, ArrayRef<ProtocolEntry> protocols,
1551+
ArrayRef<ProtocolConformanceRef> conformances,
1552+
llvm::function_ref<void(unsigned, llvm::Value *)> body) {
15541553
// Collect the conformances that need witness tables.
15551554
auto layout = destType.getExistentialLayout();
15561555
auto destProtocols = layout.getProtocols();

lib/Parse/Parser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ static SyntaxKind getListElementKind(SyntaxKind ListKind) {
884884
ParserStatus
885885
Parser::parseList(tok RightK, SourceLoc LeftLoc, SourceLoc &RightLoc,
886886
bool AllowSepAfterLast, Diag<> ErrorDiag, SyntaxKind Kind,
887-
std::function<ParserStatus()> callback) {
887+
llvm::function_ref<ParserStatus()> callback) {
888888
llvm::Optional<SyntaxParsingContext> ListContext;
889889
ListContext.emplace(SyntaxContext, Kind);
890890
if (Kind == SyntaxKind::Unknown)

lib/PrintAsObjC/PrintAsObjC.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2158,7 +2158,7 @@ class ModuleWriter {
21582158
}
21592159

21602160
void forwardDeclare(const NominalTypeDecl *NTD,
2161-
std::function<void (void)> Printer) {
2161+
llvm::function_ref<void(void)> Printer) {
21622162
if (NTD->getModuleContext()->isStdlibModule())
21632163
return;
21642164
auto &state = seenTypes[NTD];

lib/SIL/MemAccessUtils.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ bool swift::isPossibleFormalAccessBase(const AccessedStorage &storage,
331331
/// including arguments to @noescape functions that are passed as closures to
332332
/// the current call.
333333
static void visitApplyAccesses(ApplySite apply,
334-
std::function<void(Operand *)> visitor) {
334+
llvm::function_ref<void(Operand *)> visitor) {
335335
for (Operand &oper : apply.getArgumentOperands()) {
336336
// Consider any address-type operand an access. Whether it is read or modify
337337
// depends on the argument convention.
@@ -355,7 +355,7 @@ static void visitApplyAccesses(ApplySite apply,
355355
}
356356

357357
static void visitBuiltinAddress(BuiltinInst *builtin,
358-
std::function<void(Operand *)> visitor) {
358+
llvm::function_ref<void(Operand *)> visitor) {
359359
if (auto kind = builtin->getBuiltinKind()) {
360360
switch (kind.getValue()) {
361361
default:
@@ -430,7 +430,7 @@ static void visitBuiltinAddress(BuiltinInst *builtin,
430430
}
431431

432432
void swift::visitAccessedAddress(SILInstruction *I,
433-
std::function<void(Operand *)> visitor) {
433+
llvm::function_ref<void(Operand *)> visitor) {
434434
assert(I->mayReadOrWriteMemory());
435435

436436
// Reference counting instructions do not access user visible memory.

lib/SILGen/SILGenBuilder.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -431,9 +431,10 @@ ManagedValue SILGenBuilder::createFormalAccessCopyAddr(
431431
return SGF.emitFormalAccessManagedBufferWithCleanup(loc, newAddr);
432432
}
433433

434-
ManagedValue SILGenBuilder::bufferForExpr(
435-
SILLocation loc, SILType ty, const TypeLowering &lowering,
436-
SGFContext context, std::function<void (SILValue)> rvalueEmitter) {
434+
ManagedValue
435+
SILGenBuilder::bufferForExpr(SILLocation loc, SILType ty,
436+
const TypeLowering &lowering, SGFContext context,
437+
llvm::function_ref<void(SILValue)> rvalueEmitter) {
437438
// If we have a single-buffer "emit into" initialization, use that for the
438439
// result.
439440
SILValue address = context.getAddressForInPlaceInitialization(SGF, loc);
@@ -459,10 +460,9 @@ ManagedValue SILGenBuilder::bufferForExpr(
459460
return SGF.emitManagedBufferWithCleanup(address);
460461
}
461462

462-
463463
ManagedValue SILGenBuilder::formalAccessBufferForExpr(
464464
SILLocation loc, SILType ty, const TypeLowering &lowering,
465-
SGFContext context, std::function<void(SILValue)> rvalueEmitter) {
465+
SGFContext context, llvm::function_ref<void(SILValue)> rvalueEmitter) {
466466
// If we have a single-buffer "emit into" initialization, use that for the
467467
// result.
468468
SILValue address = context.getAddressForInPlaceInitialization(SGF, loc);

lib/SILGen/SILGenBuilder.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,8 @@ class SILGenBuilder : public SILBuilder {
236236
///
237237
/// \return an empty value if the buffer was taken from the context.
238238
ManagedValue bufferForExpr(SILLocation loc, SILType ty,
239-
const TypeLowering &lowering,
240-
SGFContext context,
241-
std::function<void(SILValue)> rvalueEmitter);
239+
const TypeLowering &lowering, SGFContext context,
240+
llvm::function_ref<void(SILValue)> rvalueEmitter);
242241

243242
using SILBuilder::createUncheckedEnumData;
244243
ManagedValue createUncheckedEnumData(SILLocation loc, ManagedValue operand,
@@ -276,9 +275,10 @@ class SILGenBuilder : public SILBuilder {
276275

277276
ManagedValue createSemanticLoadBorrow(SILLocation loc, ManagedValue addr);
278277

279-
ManagedValue formalAccessBufferForExpr(
280-
SILLocation loc, SILType ty, const TypeLowering &lowering,
281-
SGFContext context, std::function<void(SILValue)> rvalueEmitter);
278+
ManagedValue
279+
formalAccessBufferForExpr(SILLocation loc, SILType ty,
280+
const TypeLowering &lowering, SGFContext context,
281+
llvm::function_ref<void(SILValue)> rvalueEmitter);
282282

283283
using SILBuilder::createUnconditionalCheckedCastValue;
284284
ManagedValue

0 commit comments

Comments
 (0)