Skip to content

Commit 7c145fb

Browse files
authored
Merge pull request swiftlang#27951 from zoecarver/key-path-default-arg
Fix KeyPath with default arg
2 parents 82aff15 + 3f7ee85 commit 7c145fb

File tree

7 files changed

+229
-33
lines changed

7 files changed

+229
-33
lines changed

lib/SILGen/SILGenApply.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6091,6 +6091,39 @@ RValue SILGenFunction::emitDynamicSubscriptExpr(DynamicSubscriptExpr *e,
60916091
return RValue(*this, e, emitManagedRValueWithCleanup(optResult, optTL));
60926092
}
60936093

6094+
SmallVector<ManagedValue, 4> SILGenFunction::emitKeyPathSubscriptOperands(
6095+
SubscriptDecl *subscript, SubstitutionMap subs, Expr *indexExpr) {
6096+
Type interfaceType = subscript->getInterfaceType();
6097+
CanFunctionType substFnType =
6098+
subs ? cast<FunctionType>(interfaceType->castTo<GenericFunctionType>()
6099+
->substGenericArgs(subs)
6100+
->getCanonicalType())
6101+
: cast<FunctionType>(interfaceType->getCanonicalType());
6102+
AbstractionPattern origFnType(substFnType);
6103+
auto fnType =
6104+
getLoweredType(origFnType, substFnType).castTo<SILFunctionType>();
6105+
6106+
SmallVector<ManagedValue, 4> argValues;
6107+
SmallVector<DelayedArgument, 2> delayedArgs;
6108+
ArgEmitter emitter(*this, fnType->getRepresentation(),
6109+
/*yield*/ false,
6110+
/*isForCoroutine*/ false,
6111+
ClaimedParamsRef(fnType, fnType->getParameters()),
6112+
argValues, delayedArgs,
6113+
/*foreign error*/ None, ImportAsMemberStatus());
6114+
6115+
auto prepared =
6116+
prepareSubscriptIndices(subscript, subs,
6117+
// Strategy doesn't matter
6118+
AccessStrategy::getStorage(), indexExpr);
6119+
emitter.emitPreparedArgs(std::move(prepared), origFnType);
6120+
6121+
if (!delayedArgs.empty())
6122+
emitDelayedArguments(*this, delayedArgs, argValues);
6123+
6124+
return argValues;
6125+
}
6126+
60946127
ManagedValue ArgumentScope::popPreservingValue(ManagedValue mv) {
60956128
formalEvalScope.pop();
60966129
return normalScope.popPreservingValue(mv);

lib/SILGen/SILGenExpr.cpp

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3575,27 +3575,6 @@ RValue RValueEmitter::visitKeyPathExpr(KeyPathExpr *E, SGFContext C) {
35753575

35763576
auto baseTy = rootTy;
35773577
SmallVector<SILValue, 4> operands;
3578-
3579-
auto lowerSubscriptOperands =
3580-
[this, &operands, E](const KeyPathExpr::Component &component) {
3581-
if (!component.getIndexExpr())
3582-
return;
3583-
3584-
// Evaluate the index arguments.
3585-
SmallVector<RValue, 2> indexValues;
3586-
auto indexResult = visit(component.getIndexExpr(), SGFContext());
3587-
if (isa<TupleType>(indexResult.getType())) {
3588-
std::move(indexResult).extractElements(indexValues);
3589-
} else {
3590-
indexValues.push_back(std::move(indexResult));
3591-
}
3592-
3593-
for (auto &rv : indexValues) {
3594-
operands.push_back(
3595-
std::move(rv).forwardAsSingleValue(SGF, E));
3596-
}
3597-
};
3598-
35993578

36003579
for (auto &component : E->getComponents()) {
36013580
switch (auto kind = component.getKind()) {
@@ -3615,11 +3594,18 @@ RValue RValueEmitter::visitKeyPathExpr(KeyPathExpr *E, SGFContext C) {
36153594
component.getSubscriptIndexHashableConformances(),
36163595
baseTy,
36173596
/*for descriptor*/ false));
3618-
lowerSubscriptOperands(component);
3619-
3620-
assert(numOperands == operands.size()
3621-
&& "operand count out of sync");
36223597
baseTy = loweredComponents.back().getComponentType();
3598+
if (kind == KeyPathExpr::Component::Kind::Property)
3599+
break;
3600+
3601+
auto subscript = cast<SubscriptDecl>(decl);
3602+
auto loweredArgs = SGF.emitKeyPathSubscriptOperands(
3603+
subscript, component.getDeclRef().getSubstitutions(),
3604+
component.getIndexExpr());
3605+
3606+
for (auto &arg : loweredArgs) {
3607+
operands.push_back(arg.forward(SGF));
3608+
}
36233609

36243610
break;
36253611
}

lib/SILGen/SILGenFunction.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,19 @@ class LLVM_LIBRARY_VISIBILITY SILGenFunction
688688
SubstitutionMap witnessSubs,
689689
IsFreeFunctionWitness_t isFree,
690690
bool isSelfConformance);
691-
691+
692+
/// Generates subscript arguments for keypath. This function handles lowering
693+
/// of all index expressions including default arguments.
694+
///
695+
/// \returns Lowered index arguments.
696+
/// \param subscript - The subscript decl who's arguments are being lowered.
697+
/// \param subs - Used to get subscript function type and to substitute generic args.
698+
/// \param indexExpr - An expression holding the indices of the
699+
/// subscript (either a TupleExpr or a ParenExpr).
700+
SmallVector<ManagedValue, 4>
701+
emitKeyPathSubscriptOperands(SubscriptDecl *subscript, SubstitutionMap subs,
702+
Expr *indexExpr);
703+
692704
/// Convert a block to a native function with a thunk.
693705
ManagedValue emitBlockToFunc(SILLocation loc,
694706
ManagedValue block,

lib/Sema/CSApply.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4591,9 +4591,6 @@ namespace {
45914591
/*applyExpr*/ nullptr, labels,
45924592
/*hasTrailingClosure*/ false, locator);
45934593

4594-
auto component = KeyPathExpr::Component::forSubscriptWithPrebuiltIndexExpr(
4595-
ref, newIndexExpr, labels, resolvedTy, componentLoc, {});
4596-
45974594
// We need to be able to hash the captured index values in order for
45984595
// KeyPath itself to be hashable, so check that all of the subscript
45994596
// index components are hashable and collect their conformances here.
@@ -4603,7 +4600,10 @@ namespace {
46034600
cs.getASTContext().getProtocol(KnownProtocolKind::Hashable);
46044601

46054602
auto fnType = overload.openedType->castTo<FunctionType>();
4606-
for (const auto &param : fnType->getParams()) {
4603+
SmallVector<Identifier, 4> newLabels;
4604+
for (auto &param : fnType->getParams()) {
4605+
newLabels.push_back(param.getLabel());
4606+
46074607
auto indexType = simplifyType(param.getPlainType());
46084608
// Index type conformance to Hashable protocol has been
46094609
// verified by the solver, we just need to get it again
@@ -4616,8 +4616,10 @@ namespace {
46164616
conformances.push_back(hashableConformance);
46174617
}
46184618

4619-
component.setSubscriptIndexHashableConformances(conformances);
4620-
return component;
4619+
return KeyPathExpr::Component::forSubscriptWithPrebuiltIndexExpr(
4620+
ref, newIndexExpr, cs.getASTContext().AllocateCopy(newLabels),
4621+
resolvedTy, componentLoc,
4622+
cs.getASTContext().AllocateCopy(conformances));
46214623
}
46224624

46234625
Expr *visitKeyPathDotExpr(KeyPathDotExpr *E) {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
public func foo(x: Int = 0) -> Int { x }
3+
4+
public struct Subscript1 {
5+
public init() { }
6+
public subscript(x: Int = 0) -> Int { x }
7+
}
8+
9+
public struct Subscript2 {
10+
public init() { }
11+
public subscript(x: String = #function) -> String { x }
12+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -emit-module -emit-module-path=%t/default_arg_other.swiftmodule -module-name=default_arg_other %S/Inputs/default_arg_other.swift
3+
// RUN: %target-swift-emit-silgen -module-name default_arg_multiple_modules -I %t %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-runtime
4+
5+
import default_arg_other
6+
7+
// CHECK-LABEL: sil hidden [ossa] @${{.*}}test1{{.*}}
8+
func test1() -> Int {
9+
// CHECK: [[DEF_ARG_FN:%[0-9]+]] = function_ref @$s17default_arg_other3foo1xS2i_tFfA_ : $@convention(thin) () -> Int
10+
// CHECK: [[DEF_ARG:%[0-9]+]] = apply [[DEF_ARG_FN]]() {{.*}}
11+
// CHECK: [[FN:%[0-9]+]] = function_ref @$s17default_arg_other3foo1xS2i_tF : $@convention(thin) (Int) -> Int
12+
// CHECK: [[CALL:%[0-9]+]] = apply [[FN]]([[DEF_ARG]]) {{.*}}
13+
// CHECK: return [[CALL]] : $Int
14+
return foo()
15+
}
16+
17+
// CHECK-LABEL: sil hidden [ossa] @${{.*}}test2{{.*}}
18+
func test2() -> Int {
19+
// CHECK: [[DEF_ARG_FN:%[0-9]+]] = function_ref @$s17default_arg_other10Subscript1VyS2icipfA_ : $@convention(thin) () -> Int
20+
// CHECK: [[DEF_ARG:%[0-9]+]] = apply [[DEF_ARG_FN]]() {{.*}}
21+
// CHECK: [[FN:%[0-9]+]] = function_ref @$s17default_arg_other10Subscript1VyS2icig : $@convention(method) (Int, Subscript1) -> Int
22+
// CHECK: [[CALL:%[0-9]+]] = apply [[FN]]([[DEF_ARG]], {{.*}}
23+
// CHECK: return [[CALL]] : $Int
24+
return Subscript1()[]
25+
}
26+
27+
// CHECK-LABEL: sil hidden [ossa] @${{.*}}test3{{.*}}
28+
func test3() -> String {
29+
// This should not call default arg constructor
30+
// CHECK: [[STR_LIT:%[0-9]+]] = string_literal utf8 "test3()"
31+
// CHECK: [[DEF_ARG:%[0-9]+]] = apply %{{[0-9]+}}([[STR_LIT]], {{.*}}
32+
// CHECK: [[FN:%[0-9]+]] = function_ref @$s17default_arg_other10Subscript2VyS2Scig : $@convention(method) (@guaranteed String, Subscript2) -> @owned String
33+
// CHECK: [[CALL:%[0-9]+]] = apply [[FN]]([[DEF_ARG]], {{.*}}
34+
// CHECK: return [[CALL]] : $String
35+
return Subscript2()[]
36+
}
37+
38+
// CHECK-LABEL: sil hidden [ossa] @${{.*}}test4{{.*}}
39+
func test4() {
40+
// CHECK: [[DEF_ARG_FN:%[0-9]+]] = function_ref @$s17default_arg_other10Subscript1VyS2icipfA_ : $@convention(thin) () -> Int
41+
// CHECK: [[DEF_ARG:%[0-9]+]] = apply [[DEF_ARG_FN]]() {{.*}}
42+
// CHECK: keypath $KeyPath<Subscript1, Int>, (root $Subscript1; gettable_property $Int, id @$s17default_arg_other10Subscript1VyS2icig : $@convention(method) (Int, Subscript1) -> Int, getter @$s17default_arg_other10Subscript1VyS2icipACTK : $@convention(thin) (@in_guaranteed Subscript1, UnsafeRawPointer) -> @out Int, indices [%$0 : $Int : $Int], indices_equals @$sSiTH : $@convention(thin) (UnsafeRawPointer, UnsafeRawPointer) -> Bool, indices_hash @$sSiTh : $@convention(thin) (UnsafeRawPointer) -> Int, external #Subscript1.subscript) ([[DEF_ARG]])
43+
_ = \Subscript1.[]
44+
}
45+
46+
// CHECK-LABEL: sil hidden [ossa] @${{.*}}test5{{.*}}
47+
func test5() {
48+
// This should not call default arg constructor
49+
// CHECK: [[STR_LIT:%[0-9]+]] = string_literal utf8 "test5()"
50+
// CHECK: [[DEF_ARG:%[0-9]+]] = apply %{{[0-9]+}}([[STR_LIT]], {{.*}}
51+
// CHECK: keypath $KeyPath<Subscript2, String>, (root $Subscript2; gettable_property $String, id @$s17default_arg_other10Subscript2VyS2Scig : $@convention(method) (@guaranteed String, Subscript2) -> @owned String, getter @$s17default_arg_other10Subscript2VyS2ScipACTK : $@convention(thin) (@in_guaranteed Subscript2, UnsafeRawPointer) -> @out String, indices [%$0 : $String : $String], indices_equals @$sSSTH : $@convention(thin) (UnsafeRawPointer, UnsafeRawPointer) -> Bool, indices_hash @$sSSTh : $@convention(thin) (UnsafeRawPointer) -> Int, external #Subscript2.subscript) ([[DEF_ARG]])
52+
_ = \Subscript2.[]
53+
}

test/SILGen/keypaths.swift

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,54 @@ struct Subscripts<T> {
322322
}
323323
}
324324

325-
// CHECK-LABEL: sil hidden [ossa] @{{.*}}10subscripts
325+
struct SubscriptDefaults1 {
326+
subscript(x: Int = 0) -> Int {
327+
get { fatalError() }
328+
set { fatalError() }
329+
}
330+
subscript(x: Int, y: Int, z: Int = 0) -> Int {
331+
get { fatalError() }
332+
set { fatalError() }
333+
}
334+
subscript(x: Bool, bool y: Bool = false) -> Bool {
335+
get { fatalError() }
336+
set { fatalError() }
337+
}
338+
subscript(bool x: Bool, y: Int, z: Int = 0) -> Int {
339+
get { fatalError() }
340+
set { fatalError() }
341+
}
342+
}
343+
344+
struct SubscriptDefaults2 {
345+
subscript(x: Int? = nil) -> Int {
346+
get { fatalError() }
347+
set { fatalError() }
348+
}
349+
}
350+
351+
struct SubscriptDefaults3 {
352+
subscript(x: Int = #line) -> Int {
353+
get { fatalError() }
354+
set { fatalError() }
355+
}
356+
}
357+
358+
struct SubscriptDefaults4 {
359+
subscript<T : Numeric>(x x: T, y y: T = 0) -> T {
360+
get { fatalError() }
361+
set { fatalError() }
362+
}
363+
}
364+
365+
struct SubscriptDefaults5 {
366+
subscript<T : ExpressibleByStringLiteral>(x x: T, y y: T = #function) -> T {
367+
get { fatalError() }
368+
set { fatalError() }
369+
}
370+
}
371+
372+
// CHECK-LABEL: sil hidden [ossa] @{{.*}}10subscripts1x1y1syx_q_SStSHRzSHR_r0_lF
326373
func subscripts<T: Hashable, U: Hashable>(x: T, y: U, s: String) {
327374
_ = \Subscripts<T>.[]
328375
_ = \Subscripts<T>.[generic: x]
@@ -352,6 +399,57 @@ func subscripts<T: Hashable, U: Hashable>(x: T, y: U, s: String) {
352399

353400
_ = \Subscripts<T>.[Bass()]
354401
_ = \Subscripts<T>.[Treble()]
402+
403+
_ = \SubscriptDefaults1.[]
404+
_ = \SubscriptDefaults1.[0]
405+
_ = \SubscriptDefaults1.[0, 0]
406+
_ = \SubscriptDefaults1.[0, 0, 0]
407+
_ = \SubscriptDefaults1.[false]
408+
_ = \SubscriptDefaults1.[false, bool: false]
409+
_ = \SubscriptDefaults1.[bool: false, 0]
410+
_ = \SubscriptDefaults1.[bool: false, 0, 0]
411+
412+
_ = \SubscriptDefaults2.[]
413+
_ = \SubscriptDefaults2.[0]
414+
_ = \SubscriptDefaults3.[]
415+
_ = \SubscriptDefaults3.[0]
416+
_ = \SubscriptDefaults4.[x: 0]
417+
_ = \SubscriptDefaults4.[x: 0, y: 0]
418+
_ = \SubscriptDefaults5.[x: ""]
419+
_ = \SubscriptDefaults5.[x: "", y: ""]
420+
}
421+
422+
// CHECK-LABEL: sil hidden [ossa] @{{.*}}check_default_subscripts
423+
func check_default_subscripts() {
424+
// CHECK: [[INTX:%[0-9]+]] = integer_literal $Builtin.IntLiteral, 0
425+
// CHECK: [[IX:%[0-9]+]] = apply %{{[0-9]+}}([[INTX]], {{.*}}
426+
// CHECK: [[INTY:%[0-9]+]] = integer_literal $Builtin.IntLiteral, 0
427+
// CHECK: [[IY:%[0-9]+]] = apply %{{[0-9]+}}([[INTY]], {{.*}}
428+
// CHECK: [[KEYPATH:%[0-9]+]] = keypath $WritableKeyPath<SubscriptDefaults4, Int>, (root $SubscriptDefaults4; settable_property $Int, id @$s8keypaths18SubscriptDefaults4V1x1yxx_xtcSjRzluig : $@convention(method) <τ_0_0 where τ_0_0 : Numeric> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, SubscriptDefaults4) -> @out τ_0_0, getter @$s8keypaths18SubscriptDefaults4V1x1yxx_xtcSjRzluipACSiTK : $@convention(thin) (@in_guaranteed SubscriptDefaults4, UnsafeRawPointer) -> @out Int, setter @$s8keypaths18SubscriptDefaults4V1x1yxx_xtcSjRzluipACSiTk : $@convention(thin) (@in_guaranteed Int, @inout SubscriptDefaults4, UnsafeRawPointer) -> (), indices [%$0 : $Int : $Int, %$1 : $Int : $Int], indices_equals @$sS2iTH : $@convention(thin) (UnsafeRawPointer, UnsafeRawPointer) -> Bool, indices_hash @$sS2iTh : $@convention(thin) (UnsafeRawPointer) -> Int) ([[IX]], [[IY]])
429+
_ = \SubscriptDefaults4.[x: 0, y: 0]
430+
431+
// CHECK: [[INTINIT:%[0-9]+]] = integer_literal $Builtin.IntLiteral, 0
432+
// CHECK: [[I:%[0-9]+]] = apply %{{[0-9]+}}([[INTINIT]], {{.*}}
433+
// CHECK: [[DFN:%[0-9]+]] = function_ref @$s8keypaths18SubscriptDefaults4V1x1yxx_xtcSjRzluipfA0_ : $@convention(thin) <τ_0_0 where τ_0_0 : Numeric> () -> @out τ_0_0
434+
// CHECK: [[ALLOC:%[0-9]+]] = alloc_stack $Int
435+
// CHECK: apply [[DFN]]<Int>([[ALLOC]]) : $@convention(thin) <τ_0_0 where τ_0_0 : Numeric> () -> @out τ_0_0
436+
// CHECK: [[LOAD:%[0-9]+]] = load [trivial] [[ALLOC]] : $*Int
437+
// CHECK: [[KEYPATH:%[0-9]+]] = keypath $WritableKeyPath<SubscriptDefaults4, Int>, (root $SubscriptDefaults4; settable_property $Int, id @$s8keypaths18SubscriptDefaults4V1x1yxx_xtcSjRzluig : $@convention(method) <τ_0_0 where τ_0_0 : Numeric> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, SubscriptDefaults4) -> @out τ_0_0, getter @$s8keypaths18SubscriptDefaults4V1x1yxx_xtcSjRzluipACSiTK : $@convention(thin) (@in_guaranteed SubscriptDefaults4, UnsafeRawPointer) -> @out Int, setter @$s8keypaths18SubscriptDefaults4V1x1yxx_xtcSjRzluipACSiTk : $@convention(thin) (@in_guaranteed Int, @inout SubscriptDefaults4, UnsafeRawPointer) -> (), indices [%$0 : $Int : $Int, %$1 : $Int : $Int], indices_equals @$sS2iTH : $@convention(thin) (UnsafeRawPointer, UnsafeRawPointer) -> Bool, indices_hash @$sS2iTh : $@convention(thin) (UnsafeRawPointer) -> Int) ([[I]], [[LOAD]])
438+
_ = \SubscriptDefaults4.[x: 0]
439+
440+
// CHECK: [[STRX_LIT:%[0-9]+]] = string_literal utf8 ""
441+
// CHECK: [[STRX:%[0-9]+]] = apply %{{[0-9]+}}([[STRX_LIT]], {{.*}}
442+
// CHECK: [[STRY_LIT:%[0-9]+]] = string_literal utf8 "check_default_subscripts()"
443+
// CHECK: [[DEF_ARG:%[0-9]+]] = apply %{{[0-9]+}}([[STRY_LIT]], {{.*}}
444+
// CHECK: keypath $WritableKeyPath<SubscriptDefaults5, String>, (root $SubscriptDefaults5; settable_property $String, id @$s8keypaths18SubscriptDefaults5V1x1yxx_xtcs26ExpressibleByStringLiteralRzluig : $@convention(method) <τ_0_0 where τ_0_0 : ExpressibleByStringLiteral> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, SubscriptDefaults5) -> @out τ_0_0, getter @$s8keypaths18SubscriptDefaults5V1x1yxx_xtcs26ExpressibleByStringLiteralRzluipACSSTK : $@convention(thin) (@in_guaranteed SubscriptDefaults5, UnsafeRawPointer) -> @out String, setter @$s8keypaths18SubscriptDefaults5V1x1yxx_xtcs26ExpressibleByStringLiteralRzluipACSSTk : $@convention(thin) (@in_guaranteed String, @inout SubscriptDefaults5, UnsafeRawPointer) -> (), indices [%$0 : $String : $String, %$1 : $String : $String], indices_equals @$sS2STH : $@convention(thin) (UnsafeRawPointer, UnsafeRawPointer) -> Bool, indices_hash @$sS2STh : $@convention(thin) (UnsafeRawPointer) -> Int) ([[STRX]], [[DEF_ARG]])
445+
_ = \SubscriptDefaults5.[x: ""]
446+
447+
// CHECK: [[STRX_LIT:%[0-9]+]] = string_literal utf8 ""
448+
// CHECK: [[STRX:%[0-9]+]] = apply %{{[0-9]+}}([[STRX_LIT]], {{.*}}
449+
// CHECK: [[STRY_LIT:%[0-9]+]] = string_literal utf8 ""
450+
// CHECK: [[STRY:%[0-9]+]] = apply %{{[0-9]+}}([[STRY_LIT]], {{.*}}
451+
// CHECK: keypath $WritableKeyPath<SubscriptDefaults5, String>, (root $SubscriptDefaults5; settable_property $String, id @$s8keypaths18SubscriptDefaults5V1x1yxx_xtcs26ExpressibleByStringLiteralRzluig : $@convention(method) <τ_0_0 where τ_0_0 : ExpressibleByStringLiteral> (@in_guaranteed τ_0_0, @in_guaranteed τ_0_0, SubscriptDefaults5) -> @out τ_0_0, getter @$s8keypaths18SubscriptDefaults5V1x1yxx_xtcs26ExpressibleByStringLiteralRzluipACSSTK : $@convention(thin) (@in_guaranteed SubscriptDefaults5, UnsafeRawPointer) -> @out String, setter @$s8keypaths18SubscriptDefaults5V1x1yxx_xtcs26ExpressibleByStringLiteralRzluipACSSTk : $@convention(thin) (@in_guaranteed String, @inout SubscriptDefaults5, UnsafeRawPointer) -> (), indices [%$0 : $String : $String, %$1 : $String : $String], indices_equals @$sS2STH : $@convention(thin) (UnsafeRawPointer, UnsafeRawPointer) -> Bool, indices_hash @$sS2STh : $@convention(thin) (UnsafeRawPointer) -> Int) ([[STRX]], [[STRY]])
452+
_ = \SubscriptDefaults5.[x: "", y: ""]
355453
}
356454

357455
// CHECK-LABEL: sil hidden [ossa] @{{.*}}subclass_generics

0 commit comments

Comments
 (0)