Skip to content

Commit 36d75ec

Browse files
authored
Merge pull request #3954 from swiftwasm/katei/merge-main-2021-12-07
Merge main 2021-12-07
2 parents 6899f34 + 1ddea71 commit 36d75ec

File tree

153 files changed

+2717
-1127
lines changed

Some content is hidden

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

153 files changed

+2717
-1127
lines changed

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ cmake_dependent_option(LIBSWIFT_BUILD_MODE "How to build libswift. Possible valu
194194
BOOTSTRAPPING: libswift is built with a 2-stage bootstrapping process
195195
BOOTSTRAPPING-WITH-HOSTLIBS: libswift is built with a 2-stage bootstrapping process,
196196
but the compiler links against the host system swift libs (macOS only)
197+
CROSSCOMPILE: libswift is cross-compiled with a native host compiler, provided in
198+
`SWIFT_NATIVE_SWIFT_TOOLS_PATH` (non-Darwin only)
197199
CROSSCOMPILE-WITH-HOSTLIBS: libswift is built with a bootstrapping-with-hostlibs compiled
198200
compiler, provided in `SWIFT_NATIVE_SWIFT_TOOLS_PATH`"
199201
OFF "NOT CMAKE_GENERATOR STREQUAL \"Xcode\"" OFF)
@@ -625,6 +627,8 @@ elseif(LIBSWIFT_BUILD_MODE MATCHES "BOOTSTRAPPING.*")
625627
set(SWIFT_EXEC_FOR_LIBSWIFT "${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/swiftc")
626628
if(LIBSWIFT_BUILD_MODE STREQUAL "BOOTSTRAPPING-WITH-HOSTLIBS")
627629
set(LIBSWIFT_BUILD_MODE "CROSSCOMPILE-WITH-HOSTLIBS")
630+
elseif(LIBSWIFT_BUILD_MODE STREQUAL "BOOTSTRAPPING")
631+
set(LIBSWIFT_BUILD_MODE "CROSSCOMPILE")
628632
else()
629633
set(LIBSWIFT_BUILD_MODE "HOSTTOOLS")
630634
endif()

cmake/modules/AddSwift.cmake

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,10 @@ function(add_libswift name)
741741
get_filename_component(swift_exec_bin_dir ${ALS_SWIFT_EXEC} DIRECTORY)
742742
set(sdk_option ${sdk_option} "-resource-dir" "${swift_exec_bin_dir}/../bootstrapping0/lib/swift")
743743
endif()
744+
elseif(${LIBSWIFT_BUILD_MODE} STREQUAL "CROSSCOMPILE")
745+
set(sdk_option "-sdk" "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${SWIFT_HOST_VARIANT_ARCH}_PATH}")
746+
get_filename_component(swift_exec_bin_dir ${ALS_SWIFT_EXEC} DIRECTORY)
747+
set(sdk_option ${sdk_option} "-resource-dir" "${swift_exec_bin_dir}/../lib/swift")
744748
endif()
745749
get_versioned_target_triple(target ${SWIFT_HOST_VARIANT_SDK}
746750
${SWIFT_HOST_VARIANT_ARCH} "${deployment_version}")
@@ -967,22 +971,28 @@ function(add_swift_host_tool executable)
967971
BUILD_WITH_INSTALL_RPATH YES
968972
INSTALL_RPATH "${RPATH_LIST}")
969973
970-
elseif(SWIFT_HOST_VARIANT_SDK STREQUAL "LINUX" AND ASHT_HAS_LIBSWIFT AND LIBSWIFT_BUILD_MODE)
974+
elseif(SWIFT_HOST_VARIANT_SDK MATCHES "LINUX|ANDROID|OPENBSD" AND ASHT_HAS_LIBSWIFT AND LIBSWIFT_BUILD_MODE)
971975
set(swiftrt "swiftImageRegistrationObject${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_OBJECT_FORMAT}-${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}-${SWIFT_HOST_VARIANT_ARCH}")
972-
if(LIBSWIFT_BUILD_MODE STREQUAL "HOSTTOOLS")
976+
if(${LIBSWIFT_BUILD_MODE} MATCHES "HOSTTOOLS|CROSSCOMPILE")
973977
# At build time and and run time, link against the swift libraries in the
974978
# installed host toolchain.
975979
get_filename_component(swift_bin_dir ${SWIFT_EXEC_FOR_LIBSWIFT} DIRECTORY)
976980
get_filename_component(swift_dir ${swift_bin_dir} DIRECTORY)
977-
set(host_lib_dir "${swift_dir}/lib/swift/linux")
981+
set(host_lib_dir "${swift_dir}/lib/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}")
978982
979983
target_link_libraries(${executable} PRIVATE ${swiftrt})
980984
target_link_libraries(${executable} PRIVATE "swiftCore")
981985
982986
target_link_directories(${executable} PRIVATE ${host_lib_dir})
983-
set_target_properties(${executable} PROPERTIES
984-
BUILD_WITH_INSTALL_RPATH YES
985-
INSTALL_RPATH "${host_lib_dir}")
987+
if(LIBSWIFT_BUILD_MODE STREQUAL "HOSTTOOLS")
988+
set_target_properties(${executable} PROPERTIES
989+
BUILD_WITH_INSTALL_RPATH YES
990+
INSTALL_RPATH "${host_lib_dir}")
991+
else()
992+
set_target_properties(${executable} PROPERTIES
993+
BUILD_WITH_INSTALL_RPATH YES
994+
INSTALL_RPATH "$ORIGIN/../lib/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}")
995+
endif()
986996
987997
elseif(LIBSWIFT_BUILD_MODE STREQUAL "BOOTSTRAPPING")
988998
# At build time link against the built swift libraries from the
@@ -998,7 +1008,7 @@ function(add_swift_host_tool executable)
9981008
# bootstrapping stage.
9991009
set_target_properties(${executable} PROPERTIES
10001010
BUILD_WITH_INSTALL_RPATH YES
1001-
INSTALL_RPATH "$ORIGIN/../lib/swift/${SWIFT_SDK_LINUX_LIB_SUBDIR}")
1011+
INSTALL_RPATH "$ORIGIN/../lib/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}")
10021012
10031013
elseif(LIBSWIFT_BUILD_MODE STREQUAL "BOOTSTRAPPING-WITH-HOSTLIBS")
10041014
message(FATAL_ERROR "LIBSWIFT_BUILD_MODE 'BOOTSTRAPPING-WITH-HOSTLIBS' not supported on Linux")

docs/ReferenceGuides/UnderscoredAttributes.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,3 +634,8 @@ calls a runtime function which allocates memory or locks, respectively.
634634
The `@_noLocks` attribute implies `@_noAllocation` because a memory allocation
635635
also locks.
636636

637+
## `@_unavailableFromAsync`
638+
639+
Marks a synchronous API as being unavailable from asynchronous contexts. Direct
640+
usage of annotated API from asynchronous contexts will result in a warning from
641+
the compiler.

include/swift/AST/Attr.def

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,12 @@ CONTEXTUAL_SIMPLE_DECL_ATTR(_const, CompileTimeConst,
699699
ABIStableToAdd | ABIStableToRemove | APIBreakingToAdd | APIStableToRemove,
700700
126)
701701

702+
SIMPLE_DECL_ATTR(_unavailableFromAsync, UnavailableFromAsync,
703+
OnFunc | OnConstructor | UserInaccessible |
704+
ABIStableToAdd | ABIStableToRemove |
705+
APIBreakingToAdd | APIStableToRemove,
706+
127)
707+
702708
// If you're adding a new underscored attribute here, please document it in
703709
// docs/ReferenceGuides/UnderscoredAttributes.md.
704710

include/swift/AST/DeclContext.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,9 @@ class alignas(1 << DeclContextAlignInBits) DeclContext
296296
/// Returns the kind of context this is.
297297
DeclContextKind getContextKind() const;
298298

299+
/// Returns whether this context asynchronous
300+
bool isAsyncContext() const;
301+
299302
/// Returns whether this context has value semantics.
300303
bool hasValueSemantics() const;
301304

include/swift/AST/DiagnosticsSIL.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,7 @@ NOTE(sil_movekillscopyablevalue_use_here, none,
741741
NOTE(sil_movekillscopyablevalue_value_consumed_in_loop, none,
742742
"cyclic move here. move will occur multiple times in the loop", ())
743743
ERROR(sil_movekillscopyablevalue_move_applied_to_unsupported_move, none,
744-
"_move applied to value that the compiler does not supporting checking.",
744+
"_move applied to value that the compiler does not support checking",
745745
())
746746

747747
#define UNDEFINE_DIAGNOSTIC_MACROS

include/swift/AST/DiagnosticsSema.def

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4491,6 +4491,10 @@ ERROR(concurrent_access_of_local_capture,none,
44914491
"%select{mutation of|reference to}0 captured %1 %2 in "
44924492
"concurrently-executing code",
44934493
(bool, DescriptiveDeclKind, DeclName))
4494+
ERROR(non_sendable_capture,none,
4495+
"capture of %1 with non-sendable type %0 in a `@Sendable` closure",
4496+
(Type, DeclName))
4497+
44944498
NOTE(actor_isolated_sync_func,none,
44954499
"calls to %0 %1 from outside of its actor context are "
44964500
"implicitly asynchronous",
@@ -4705,6 +4709,15 @@ ERROR(actor_isolation_superclass_mismatch,none,
47054709
"%0 class %1 has different actor isolation from %2 superclass %3",
47064710
(ActorIsolation, DeclName, ActorIsolation, DeclName))
47074711

4712+
ERROR(async_decl_must_be_available_from_async,none,
4713+
"asynchronous %0 must be available from asynchronous contexts",
4714+
(DescriptiveDeclKind))
4715+
ERROR(async_named_decl_must_be_available_from_async,none,
4716+
"asynchronous %0 %1 must be available from asynchronous contexts",
4717+
(DescriptiveDeclKind, DeclName))
4718+
ERROR(async_unavailable_decl,none,
4719+
"%0 %1 is unavailable from asynchronous contexts", (DescriptiveDeclKind, DeclBaseName))
4720+
47084721
//------------------------------------------------------------------------------
47094722
// MARK: Type Check Types
47104723
//------------------------------------------------------------------------------

include/swift/AST/Expr.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3601,6 +3601,13 @@ class AbstractClosureExpr : public DeclContext, public Expr {
36013601
/// Only valid when \c hasSingleExpressionBody() is true.
36023602
Expr *getSingleExpressionBody() const;
36033603

3604+
/// Whether this closure has a body
3605+
bool hasBody() const;
3606+
3607+
/// Returns the body of closures that have a body
3608+
/// returns nullptr if the closure doesn't have a body
3609+
BraceStmt *getBody() const;
3610+
36043611
ClosureActorIsolation getActorIsolation() const { return actorIsolation; }
36053612

36063613
void setActorIsolation(ClosureActorIsolation actorIsolation) {

include/swift/Option/FrontendOptions.td

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -262,12 +262,12 @@ def enable_experimental_concurrency :
262262
def disable_lexical_lifetimes :
263263
Flag<["-"], "disable-lexical-lifetimes">,
264264
HelpText<"Disables early lexical lifetimes. Mutually exclusive with "
265-
"-enable-experimental-lexical-lifetimes">;
265+
"-enable-lexical-lifetimes">;
266266

267-
def enable_experimental_lexical_lifetimes :
268-
Flag<["-"], "enable-experimental-lexical-lifetimes">,
269-
HelpText<"Enable experimental lexical lifetimes. Mutually exclusive with "
270-
"-disable-early-lexical-lifetimes">;
267+
def enable_lexical_lifetimes :
268+
Flag<["-"], "enable-lexical-lifetimes">,
269+
HelpText<"Enable lexical lifetimes. Mutually exclusive with "
270+
"-disable-lexical-lifetimes">;
271271

272272
def enable_experimental_move_only :
273273
Flag<["-"], "enable-experimental-move-only">,

include/swift/SIL/BasicBlockDatastructures.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ class BasicBlockSetVector {
4343
iterator begin() const { return vector.begin(); }
4444
iterator end() const { return vector.end(); }
4545

46+
llvm::iterator_range<iterator> getRange() const {
47+
return llvm::make_range(begin(), end());
48+
}
49+
4650
bool empty() const { return vector.empty(); }
4751

4852
bool contains(SILBasicBlock *block) const { return set.contains(block); }

include/swift/SIL/SILBuilder.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,13 @@ class SILBuilder {
12711271
MoveValueInst(getSILDebugLocation(loc), operand));
12721272
}
12731273

1274+
MarkUnresolvedMoveAddrInst *createMarkUnresolvedMoveAddr(SILLocation loc,
1275+
SILValue srcAddr,
1276+
SILValue takeAddr) {
1277+
return insert(new (getModule()) MarkUnresolvedMoveAddrInst(
1278+
getSILDebugLocation(loc), srcAddr, takeAddr));
1279+
}
1280+
12741281
UnconditionalCheckedCastInst *
12751282
createUnconditionalCheckedCast(SILLocation Loc, SILValue op,
12761283
SILType destLoweredTy,

include/swift/SIL/SILCloner.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,6 +1341,16 @@ SILCloner<ImplClass>::visitCopyAddrInst(CopyAddrInst *Inst) {
13411341
Inst->isInitializationOfDest()));
13421342
}
13431343

1344+
template <typename ImplClass>
1345+
void SILCloner<ImplClass>::visitMarkUnresolvedMoveAddrInst(
1346+
MarkUnresolvedMoveAddrInst *Inst) {
1347+
getBuilder().setCurrentDebugScope(getOpScope(Inst->getDebugScope()));
1348+
auto *MVI = getBuilder().createMarkUnresolvedMoveAddr(
1349+
getOpLocation(Inst->getLoc()), getOpValue(Inst->getSrc()),
1350+
getOpValue(Inst->getDest()));
1351+
recordClonedInstruction(Inst, MVI);
1352+
}
1353+
13441354
template<typename ImplClass>
13451355
void
13461356
SILCloner<ImplClass>::visitBindMemoryInst(BindMemoryInst *Inst) {

include/swift/SIL/SILInstruction.h

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1793,6 +1793,10 @@ struct SILDebugVariable {
17931793
Implicit == V.Implicit && Type == V.Type && Loc == V.Loc &&
17941794
Scope == V.Scope;
17951795
}
1796+
1797+
bool isLet() const { return Name.size() && Constant; }
1798+
1799+
bool isVar() const { return Name.size() && !Constant; }
17961800
};
17971801

17981802
/// A DebugVariable where storage for the strings has been
@@ -2004,7 +2008,20 @@ class AllocStackInst final
20042008
auto VI = TailAllocatedDebugVariable(RawValue);
20052009
return VI.get(getDecl(), getTrailingObjects<char>(), AuxVarType, VarDeclLoc,
20062010
VarDeclScope, DIExprElements);
2007-
};
2011+
}
2012+
2013+
bool isLet() const {
2014+
if (auto varInfo = getVarInfo())
2015+
return varInfo->isLet();
2016+
return false;
2017+
}
2018+
2019+
bool isVar() const {
2020+
if (auto varInfo = getVarInfo())
2021+
return varInfo->isVar();
2022+
return false;
2023+
}
2024+
20082025
void setArgNo(unsigned N) {
20092026
auto RawValue = SILNode::Bits.AllocStackInst.VarInfo;
20102027
auto VI = TailAllocatedDebugVariable(RawValue);
@@ -7424,6 +7441,35 @@ class MoveValueInst
74247441
void setAllowsDiagnostics(bool newValue) { allowDiagnostics = newValue; }
74257442
};
74267443

7444+
/// Equivalent to a copy_addr to [init] except that it is used for diagnostics
7445+
/// and should not be pattern matched. During the diagnostic passes, the "move
7446+
/// function" checker for addresses always converts this to a copy_addr [init]
7447+
/// (if we emitted a diagnostic and proved we could not emit a move here) or a
7448+
/// copy_addr [take][init] if we can. So this should never occur in canonical
7449+
/// SIL.
7450+
class MarkUnresolvedMoveAddrInst
7451+
: public InstructionBase<SILInstructionKind::MarkUnresolvedMoveAddrInst,
7452+
NonValueInstruction>,
7453+
public CopyLikeInstruction {
7454+
friend class SILBuilder;
7455+
7456+
FixedOperandList<2> Operands;
7457+
7458+
MarkUnresolvedMoveAddrInst(SILDebugLocation DebugLoc, SILValue srcAddr,
7459+
SILValue takeAddr)
7460+
: InstructionBase(DebugLoc), Operands(this, srcAddr, takeAddr) {}
7461+
7462+
public:
7463+
SILValue getSrc() const { return Operands[Src].get(); }
7464+
SILValue getDest() const { return Operands[Dest].get(); }
7465+
7466+
void setSrc(SILValue V) { Operands[Src].set(V); }
7467+
void setDest(SILValue V) { Operands[Dest].set(V); }
7468+
7469+
ArrayRef<Operand> getAllOperands() const { return Operands.asArray(); }
7470+
MutableArrayRef<Operand> getAllOperands() { return Operands.asArray(); }
7471+
};
7472+
74277473
/// Given an object reference, return true iff it is non-nil and refers
74287474
/// to a native swift object with strong reference count of 1.
74297475
class IsUniqueInst

include/swift/SIL/SILNodes.def

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -591,8 +591,15 @@ ABSTRACT_VALUE_AND_INST(SingleValueInstruction, ValueBase, SILInstruction)
591591
SingleValueInstruction, None, MayRelease)
592592
// A move_value is an OSSA only instruction. Its result does not have any side
593593
// effects relative to other OSSA values like copy_value.
594-
SINGLE_VALUE_INST(MoveValueInst, move_value,
595-
SingleValueInstruction, None, DoesNotRelease)
594+
SINGLE_VALUE_INST(MoveValueInst, move_value, SingleValueInstruction, None,
595+
DoesNotRelease)
596+
597+
// A move_addr is a Raw SIL only instruction that is equivalent to a copy_addr
598+
// [init]. It is lowered during the diagnostic passes to a copy_addr [init] if
599+
// the move checker found uses that prevented us from converting this to a
600+
// move or if we do not find such uses, a copy_addr [init] [take].
601+
NON_VALUE_INST(MarkUnresolvedMoveAddrInst, mark_unresolved_move_addr,
602+
SILInstruction, None, DoesNotRelease)
596603

597604
// IsUnique does not actually write to memory but should be modeled
598605
// as such. Its operand is a pointer to an object reference. The

include/swift/SILOptimizer/PassManager/Passes.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,9 @@ PASS(MoveKillsCopyableValuesChecker, "sil-move-kills-copyable-values-checker",
427427
"to _move do not have any uses later than the _move")
428428
PASS(LexicalLifetimeEliminator, "sil-lexical-lifetime-eliminator",
429429
"Pass that removes lexical lifetime markers from borrows and alloc stack")
430+
PASS(MoveKillsCopyableAddressesChecker, "sil-move-kills-copyable-addresses-checker",
431+
"Pass that checks that any copyable (non-move only) address that is passed "
432+
"to _move do not have any uses later than the _move")
430433
PASS(PruneVTables, "prune-vtables",
431434
"Mark class methods that do not require vtable dispatch")
432435
PASS_RANGE(AllPasses, AADumper, PruneVTables)

include/swift/Sema/CSBindings.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,14 @@ class BindingSet {
338338

339339
TypeVariableType *getTypeVariable() const { return Info.TypeVar; }
340340

341+
/// Check whether this binding set belongs to a type variable
342+
/// that represents a result type of a closure.
343+
bool forClosureResult() const;
344+
345+
/// Check whether this binding set belongs to a type variable
346+
/// that represents a generic parameter.
347+
bool forGenericParameter() const;
348+
341349
bool canBeNil() const;
342350

343351
/// If this type variable doesn't have any viable bindings, or

include/swift/Sema/CSFix.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2308,6 +2308,10 @@ class SpecifyClosureParameterType final : public ConstraintFix {
23082308

23092309
bool diagnose(const Solution &solution, bool asNote = false) const override;
23102310

2311+
bool diagnoseForAmbiguity(CommonFixesArray commonFixes) const override {
2312+
return diagnose(*commonFixes.front().first);
2313+
}
2314+
23112315
static SpecifyClosureParameterType *create(ConstraintSystem &cs,
23122316
ConstraintLocator *locator);
23132317

include/swift/Sema/Constraint.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,8 @@ class Constraint final : public llvm::ilist_node<Constraint>,
442442
ASTNode Element;
443443
/// Contextual information associated with the element (if any).
444444
ContextualTypeInfo Context;
445+
/// Identifies whether result of this node is unused.
446+
bool IsDiscarded;
445447
} ClosureElement;
446448
};
447449

@@ -495,7 +497,7 @@ class Constraint final : public llvm::ilist_node<Constraint>,
495497
SmallPtrSetImpl<TypeVariableType *> &typeVars);
496498

497499
/// Construct a closure body element constraint.
498-
Constraint(ASTNode node, ContextualTypeInfo context,
500+
Constraint(ASTNode node, ContextualTypeInfo context, bool isDiscarded,
499501
ConstraintLocator *locator,
500502
SmallPtrSetImpl<TypeVariableType *> &typeVars);
501503

@@ -585,12 +587,14 @@ class Constraint final : public llvm::ilist_node<Constraint>,
585587

586588
static Constraint *createClosureBodyElement(ConstraintSystem &cs,
587589
ASTNode node,
588-
ConstraintLocator *locator);
590+
ConstraintLocator *locator,
591+
bool isDiscarded = false);
589592

590593
static Constraint *createClosureBodyElement(ConstraintSystem &cs,
591594
ASTNode node,
592595
ContextualTypeInfo context,
593-
ConstraintLocator *locator);
596+
ConstraintLocator *locator,
597+
bool isDiscarded = false);
594598

595599
/// Determine the kind of constraint.
596600
ConstraintKind getKind() const { return Kind; }
@@ -857,6 +861,11 @@ class Constraint final : public llvm::ilist_node<Constraint>,
857861
return ClosureElement.Context;
858862
}
859863

864+
bool isDiscardedElement() const {
865+
assert(Kind == ConstraintKind::ClosureBodyElement);
866+
return ClosureElement.IsDiscarded;
867+
}
868+
860869
/// For an applicable function constraint, retrieve the trailing closure
861870
/// matching rule.
862871
Optional<TrailingClosureMatching> getTrailingClosureMatching() const;

0 commit comments

Comments
 (0)