Skip to content

Commit 760a9a7

Browse files
authored
Merge pull request #15140 from slavapestov/materialize-for-set-fixes
Fixes for exotic materializeForSet
2 parents fae5182 + f7dd583 commit 760a9a7

14 files changed

+77
-54
lines changed

lib/AST/ASTVerifier.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2143,29 +2143,30 @@ class Verifier : public ASTWalker {
21432143
if (ASD->getSetter() &&
21442144
ASD->getSetter()->getFormalAccess() != setterAccess) {
21452145
Out << "AbstractStorageDecl's setter access is out of sync"
2146-
" with the access actually on the setter";
2146+
" with the access actually on the setter\n";
21472147
abort();
21482148
}
21492149
}
21502150

21512151
if (auto getter = ASD->getGetter()) {
21522152
if (getter->isMutating() != ASD->isGetterMutating()) {
21532153
Out << "AbstractStorageDecl::isGetterMutating is out of sync"
2154-
" with whether the getter is actually mutating";
2154+
" with whether the getter is actually mutating\n";
21552155
abort();
21562156
}
21572157
}
21582158
if (auto setter = ASD->getSetter()) {
21592159
if (setter->isMutating() != ASD->isSetterMutating()) {
21602160
Out << "AbstractStorageDecl::isSetterMutating is out of sync"
2161-
" with whether the setter is actually mutating";
2161+
" with whether the setter is actually mutating\n";
21622162
abort();
21632163
}
21642164
}
21652165
if (auto materializeForSet = ASD->getMaterializeForSetFunc()) {
2166-
if (materializeForSet->isMutating() != ASD->isSetterMutating()) {
2167-
Out << "AbstractStorageDecl::isSetterMutating is out of sync"
2168-
" with whether materializeForSet is mutating";
2166+
if (materializeForSet->isMutating() !=
2167+
(ASD->isSetterMutating() || ASD->isGetterMutating())) {
2168+
Out << "AbstractStorageDecl::is{Getter,Setter}Mutating is out of sync"
2169+
" with whether materializeForSet is mutating\n";
21692170
abort();
21702171
}
21712172
}

lib/SIL/SILVerifier.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2342,14 +2342,6 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
23422342
case SILInstructionKind::ApplyInst:
23432343
case SILInstructionKind::TryApplyInst:
23442344
case SILInstructionKind::PartialApplyInst:
2345-
// Non-Mutating set pattern that allows a inout (that can't really
2346-
// write back. Only SILGen generates PointerToThinkFunction
2347-
// instructions in the writeback code.
2348-
if (auto *AI = dyn_cast<ApplyInst>(inst)) {
2349-
if (isa<PointerToThinFunctionInst>(AI->getCallee())) {
2350-
break;
2351-
}
2352-
}
23532345
if (isConsumingOrMutatingApplyUse(use))
23542346
return true;
23552347
else

lib/SIL/TypeLowering.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,25 +2071,28 @@ CanSILFunctionType TypeConverter::getMaterializeForSetCallbackType(
20712071
auto selfMetatypeType = MetatypeType::get(selfType,
20722072
MetatypeRepresentation::Thick);
20732073

2074+
auto canSelfType = selfType->getCanonicalType(genericSig);
2075+
auto canSelfMetatypeType = selfMetatypeType->getCanonicalType(genericSig);
2076+
auto selfConvention = (storage->isSetterMutating()
2077+
? ParameterConvention::Indirect_Inout
2078+
: ParameterConvention::Indirect_In_Guaranteed);
2079+
20742080
{
20752081
GenericContextScope scope(*this, genericSig);
20762082

20772083
// If 'self' is a metatype, make it @thin or @thick as needed, but not inside
20782084
// selfMetatypeType.
2079-
if (auto metatype = selfType->getAs<MetatypeType>()) {
2085+
if (auto metatype = canSelfType->getAs<MetatypeType>()) {
20802086
if (!metatype->hasRepresentation())
2081-
selfType = getLoweredType(metatype).getSwiftRValueType();
2087+
canSelfType = getLoweredType(metatype).getSwiftRValueType();
20822088
}
20832089
}
20842090

2085-
auto canSelfType = selfType->getCanonicalType(genericSig);
2086-
auto canSelfMetatypeType = selfMetatypeType->getCanonicalType(genericSig);
2087-
20882091
// Create the SILFunctionType for the callback.
20892092
SILParameterInfo params[] = {
20902093
{ ctx.TheRawPointerType, ParameterConvention::Direct_Unowned },
20912094
{ ctx.TheUnsafeValueBufferType, ParameterConvention::Indirect_Inout },
2092-
{ canSelfType, ParameterConvention::Indirect_Inout },
2095+
{ canSelfType, selfConvention },
20932096
{ canSelfMetatypeType, ParameterConvention::Direct_Unowned },
20942097
};
20952098
ArrayRef<SILResultInfo> results = {};

lib/SILGen/SILGenMaterializeForSet.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,7 @@ MaterializeForSetEmitter::createSetterCallback(SILFunction &F,
964964
}
965965

966966
// The callback gets the address of 'self' at +0.
967-
ManagedValue mSelf = ManagedValue::forLValue(self);
967+
ManagedValue mSelf = ManagedValue::forUnmanaged(self);
968968

969969
// That's enough to build the l-value.
970970
LValue lvalue = buildLValue(SGF, loc, mSelf, std::move(indices),

lib/Sema/CodeSynthesis.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,9 @@ static void maybeMarkTransparent(FuncDecl *accessor,
296296

297297
static AccessorDecl *
298298
createMaterializeForSetPrototype(AbstractStorageDecl *storage,
299-
FuncDecl *setter, TypeChecker &TC) {
299+
FuncDecl *getter,
300+
FuncDecl *setter,
301+
TypeChecker &TC) {
300302
auto &ctx = storage->getASTContext();
301303
SourceLoc loc = storage->getLoc();
302304

@@ -319,7 +321,7 @@ createMaterializeForSetPrototype(AbstractStorageDecl *storage,
319321
params.push_back(buildIndexForwardingParamList(storage, bufferElements));
320322

321323
// The accessor returns (temporary: Builtin.RawPointer,
322-
// callback: Builtin.RawPointer),
324+
// callback: Optional<Builtin.RawPointer>),
323325
// where the first pointer is the materialized address and the
324326
// second is the address of an optional callback.
325327
TupleTypeElt retElts[] = {
@@ -349,10 +351,15 @@ createMaterializeForSetPrototype(AbstractStorageDecl *storage,
349351
// Open-code the setMutating() calculation since we might run before
350352
// the setter has been type checked.
351353
Type contextTy = DC->getDeclaredInterfaceType();
352-
if (contextTy && !contextTy->hasReferenceSemantics() &&
354+
if (contextTy && !contextTy->hasReferenceSemantics()) {
355+
bool hasMutatingSetter =
353356
!setter->getAttrs().hasAttribute<NonMutatingAttr>() &&
354-
storage->isSetterMutating())
355-
materializeForSet->setSelfAccessKind(SelfAccessKind::Mutating);
357+
storage->isSetterMutating();
358+
bool hasMutatingGetter =
359+
getter->getAttrs().hasAttribute<MutatingAttr>();
360+
if (hasMutatingSetter || hasMutatingGetter)
361+
materializeForSet->setSelfAccessKind(SelfAccessKind::Mutating);
362+
}
356363

357364
materializeForSet->setStatic(storage->isStatic());
358365

@@ -847,7 +854,7 @@ static FuncDecl *addMaterializeForSet(AbstractStorageDecl *storage,
847854
}
848855

849856
auto materializeForSet = createMaterializeForSetPrototype(
850-
storage, storage->getSetter(), TC);
857+
storage, storage->getGetter(), storage->getSetter(), TC);
851858
addMemberToContextIfNeeded(materializeForSet, storage->getDeclContext(),
852859
storage->getSetter());
853860
storage->setMaterializeForSetFunc(materializeForSet);
@@ -1815,7 +1822,9 @@ void swift::maybeAddAccessorsToVariable(VarDecl *var, TypeChecker &TC) {
18151822

18161823
AccessorDecl *materializeForSet = nullptr;
18171824
if (dc->getAsNominalTypeOrNominalTypeExtensionContext())
1818-
materializeForSet = createMaterializeForSetPrototype(var, setter, TC);
1825+
materializeForSet = createMaterializeForSetPrototype(var,
1826+
getter, setter,
1827+
TC);
18191828

18201829
var->makeComputed(SourceLoc(), getter, setter, materializeForSet, SourceLoc());
18211830

test/SILGen/accessors.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,8 @@ func test0(_ ref: A) {
6666
// CHECK-NEXT: switch_enum [[OPT_CALLBACK]] : $Optional<Builtin.RawPointer>, case #Optional.some!enumelt.1: [[WRITEBACK:bb[0-9]+]], case #Optional.none!enumelt: [[CONT:bb[0-9]+]]
6767

6868
// CHECK: [[WRITEBACK]]([[CALLBACK_ADDR:%.*]] : @trivial $Builtin.RawPointer):
69-
// CHECK-NEXT: [[CALLBACK:%.*]] = pointer_to_thin_function [[CALLBACK_ADDR]] : $Builtin.RawPointer to $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout A, @thick A.Type) -> ()
69+
// CHECK-NEXT: [[CALLBACK:%.*]] = pointer_to_thin_function [[CALLBACK_ADDR]] : $Builtin.RawPointer to $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed A, @thick A.Type) -> ()
7070
// CHECK-NEXT: [[TEMP2:%.*]] = alloc_stack $A
71-
// SEMANTIC SIL TODO: This is an issue caused by the callback for materializeForSet in the class case taking the value as @inout when it should really take it as @guaranteed.
7271
// CHECK-NEXT: store_borrow [[BORROWED_ARG_LHS]] to [[TEMP2]] : $*A
7372
// CHECK-NEXT: [[T0:%.*]] = metatype $@thick A.Type
7473
// CHECK-NEXT: [[T1:%.*]] = address_to_pointer [[ADDR]] : $*OrdinarySub to $Builtin.RawPointer
@@ -129,7 +128,7 @@ func test1(_ ref: B) {
129128
// CHECK-NEXT: switch_enum [[OPT_CALLBACK]] : $Optional<Builtin.RawPointer>, case #Optional.some!enumelt.1: [[WRITEBACK:bb[0-9]+]], case #Optional.none!enumelt: [[CONT:bb[0-9]+]]
130129
//
131130
// CHECK: [[WRITEBACK]]([[CALLBACK_ADDR:%.*]] : @trivial $Builtin.RawPointer):
132-
// CHECK-NEXT: [[CALLBACK:%.*]] = pointer_to_thin_function [[CALLBACK_ADDR]] : $Builtin.RawPointer to $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout B, @thick B.Type) -> ()
131+
// CHECK-NEXT: [[CALLBACK:%.*]] = pointer_to_thin_function [[CALLBACK_ADDR]] : $Builtin.RawPointer to $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed B, @thick B.Type) -> ()
133132
// CHECK-NEXT: [[TEMP2:%.*]] = alloc_stack $B
134133
// CHECK-NEXT: store_borrow [[BORROWED_ARG_RHS]] to [[TEMP2]] : $*B
135134
// CHECK-NEXT: [[T0:%.*]] = metatype $@thick B.Type
@@ -155,7 +154,7 @@ func test1(_ ref: B) {
155154
// CHECK-NEXT: switch_enum [[OPT_CALLBACK]] : $Optional<Builtin.RawPointer>, case #Optional.some!enumelt.1: [[WRITEBACK:bb[0-9]+]], case #Optional.none!enumelt: [[CONT:bb[0-9]+]]
156155
//
157156
// CHECK: [[WRITEBACK]]([[CALLBACK_ADDR:%.*]] : @trivial $Builtin.RawPointer):
158-
// CHECK-NEXT: [[CALLBACK:%.*]] = pointer_to_thin_function [[CALLBACK_ADDR]] : $Builtin.RawPointer to $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout B, @thick B.Type) -> ()
157+
// CHECK-NEXT: [[CALLBACK:%.*]] = pointer_to_thin_function [[CALLBACK_ADDR]] : $Builtin.RawPointer to $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed B, @thick B.Type) -> ()
159158
// CHECK-NEXT: [[TEMP2:%.*]] = alloc_stack $B
160159
// CHECK-NEXT: store_borrow [[BORROWED_ARG_LHS]] to [[TEMP2]] : $*B
161160
// CHECK-NEXT: [[T0:%.*]] = metatype $@thick B.Type

test/SILGen/addressors.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ class G {
355355
// CHECK: strong_release [[OWNER]] : $Builtin.NativeObject
356356

357357
// materializeForSet callback for G.value
358-
// CHECK-LABEL: sil private [transparent] @$S10addressors1GC5values5Int32VvmytfU_ : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout G, @thick G.Type) -> () {
358+
// CHECK-LABEL: sil private [transparent] @$S10addressors1GC5values5Int32VvmytfU_ : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed G, @thick G.Type) -> () {
359359
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $*G, [[SELFTYPE:%3]] : $@thick G.Type):
360360
// CHECK: [[T0:%.*]] = project_value_buffer $Builtin.NativeObject in [[STORAGE]] : $*Builtin.UnsafeValueBuffer
361361
// CHECK: [[OWNER:%.*]] = load [[T0]]
@@ -476,7 +476,7 @@ class I {
476476
// CHECK: strong_unpin [[OWNER]] : $Optional<Builtin.NativeObject>
477477

478478
// materializeForSet callback for I.value
479-
// CHECK-LABEL: sil private [transparent] @$S10addressors1IC5values5Int32VvmytfU_ : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout I, @thick I.Type) -> () {
479+
// CHECK-LABEL: sil private [transparent] @$S10addressors1IC5values5Int32VvmytfU_ : $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed I, @thick I.Type) -> () {
480480
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $*I, [[SELFTYPE:%3]] : $@thick I.Type):
481481
// CHECK: [[T0:%.*]] = project_value_buffer $Optional<Builtin.NativeObject> in [[STORAGE]] : $*Builtin.UnsafeValueBuffer
482482
// CHECK: [[OWNER:%.*]] = load [[T0]]

test/SILGen/constrained_extensions.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public class GenericClass<X, Y> {}
138138
extension GenericClass where Y == () {
139139
// CHECK-LABEL: sil @$S22constrained_extensions12GenericClassCAAytRs_rlE5valuexvg : $@convention(method) <X, Y where Y == ()> (@guaranteed GenericClass<X, ()>) -> @out X
140140
// CHECK-LABEL: sil @$S22constrained_extensions12GenericClassCAAytRs_rlE5valuexvs : $@convention(method) <X, Y where Y == ()> (@in X, @guaranteed GenericClass<X, ()>) -> ()
141-
// CHECK-LABEL: sil shared [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlE5valuexvmytfU_ : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout GenericClass<X, ()>, @thick GenericClass<X, ()>.Type) -> ()
141+
// CHECK-LABEL: sil shared [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlE5valuexvmytfU_ : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed GenericClass<X, ()>, @thick GenericClass<X, ()>.Type) -> ()
142142
// CHECK-LABEL: sil [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlE5valuexvm : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed GenericClass<X, ()>) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>)
143143
public var value: X {
144144
get { while true {} }
@@ -147,7 +147,7 @@ extension GenericClass where Y == () {
147147

148148
// CHECK-LABEL: sil @$S22constrained_extensions12GenericClassCAAytRs_rlE5emptyytvg : $@convention(method) <X, Y where Y == ()> (@guaranteed GenericClass<X, ()>) -> ()
149149
// CHECK-LABEL: sil @$S22constrained_extensions12GenericClassCAAytRs_rlE5emptyytvs : $@convention(method) <X, Y where Y == ()> (@guaranteed GenericClass<X, ()>) -> ()
150-
// CHECK-LABEL: sil shared [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlE5emptyytvmytfU_ : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout GenericClass<X, ()>, @thick GenericClass<X, ()>.Type) -> ()
150+
// CHECK-LABEL: sil shared [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlE5emptyytvmytfU_ : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed GenericClass<X, ()>, @thick GenericClass<X, ()>.Type) -> ()
151151
// CHECK-LABEL: sil [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlE5emptyytvm : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed GenericClass<X, ()>) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>)
152152
public var empty: Y {
153153
get { return () }
@@ -156,7 +156,7 @@ extension GenericClass where Y == () {
156156

157157
// CHECK-LABEL: sil @$S22constrained_extensions12GenericClassCAAytRs_rlEyxyt_tcig : $@convention(method) <X, Y where Y == ()> (@guaranteed GenericClass<X, ()>) -> @out X
158158
// CHECK-LABEL: sil @$S22constrained_extensions12GenericClassCAAytRs_rlEyxyt_tcis : $@convention(method) <X, Y where Y == ()> (@in X, @guaranteed GenericClass<X, ()>) -> ()
159-
// CHECK-LABEL: sil shared [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlEyxyt_tcimytfU_ : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout GenericClass<X, ()>, @thick GenericClass<X, ()>.Type) -> ()
159+
// CHECK-LABEL: sil shared [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlEyxyt_tcimytfU_ : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed GenericClass<X, ()>, @thick GenericClass<X, ()>.Type) -> ()
160160
// CHECK-LABEL: sil [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlEyxyt_tcim : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed GenericClass<X, ()>) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>)
161161
public subscript(_: Y) -> X {
162162
get { while true {} }
@@ -165,7 +165,7 @@ extension GenericClass where Y == () {
165165

166166
// CHECK-LABEL: sil @$S22constrained_extensions12GenericClassCAAytRs_rlEyyxcig : $@convention(method) <X, Y where Y == ()> (@in X, @guaranteed GenericClass<X, ()>) -> ()
167167
// CHECK-LABEL: sil @$S22constrained_extensions12GenericClassCAAytRs_rlEyyxcis : $@convention(method) <X, Y where Y == ()> (@in X, @guaranteed GenericClass<X, ()>) -> ()
168-
// CHECK-LABEL: sil shared [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlEyyxcimytfU_ : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout GenericClass<X, ()>, @thick GenericClass<X, ()>.Type) -> ()
168+
// CHECK-LABEL: sil shared [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlEyyxcimytfU_ : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed GenericClass<X, ()>, @thick GenericClass<X, ()>.Type) -> ()
169169
// CHECK-LABEL: sil [transparent] [serialized] @$S22constrained_extensions12GenericClassCAAytRs_rlEyyxcim : $@convention(method) <X, Y where Y == ()> (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in X, @guaranteed GenericClass<X, ()>) -> (Builtin.RawPointer, Optional<Builtin.RawPointer>)
170170
public subscript(_: X) -> Y {
171171
get { while true {} }

test/SILGen/lifetime.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ func logical_lvalue_lifetime(_ r: RefWithProp, _ i: Int, _ v: Val) {
390390
// CHECK: [[ADDR:%.*]] = pointer_to_address [[PTR]]
391391
// CHECK: [[MARKED_ADDR:%.*]] = mark_dependence [[ADDR]] : $*Aleph on [[R2]]
392392
// CHECK: {{.*}}([[CALLBACK_ADDR:%.*]] :
393-
// CHECK: [[CALLBACK:%.*]] = pointer_to_thin_function [[CALLBACK_ADDR]] : $Builtin.RawPointer to $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout RefWithProp, @thick RefWithProp.Type) -> ()
393+
// CHECK: [[CALLBACK:%.*]] = pointer_to_thin_function [[CALLBACK_ADDR]] : $Builtin.RawPointer to $@convention(method) (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @in_guaranteed RefWithProp, @thick RefWithProp.Type) -> ()
394394
// CHECK: [[TEMP:%.*]] = alloc_stack $RefWithProp
395395
// CHECK: store [[R2]] to [init] [[TEMP]]
396396
// CHECK: apply [[CALLBACK]]({{.*}}, [[STORAGE]], [[TEMP]], {{%.*}})

0 commit comments

Comments
 (0)