Skip to content

Commit d0ef4d2

Browse files
committed
test[SILGen]: Check local wrapped property is being contextualize
1 parent 5c2d8bf commit d0ef4d2

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

Diff for: lib/Sema/TypeCheckStorage.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -2690,7 +2690,7 @@ static VarDecl *synthesizePropertyWrapperProjectionVar(
26902690

26912691
static void typeCheckSynthesizedWrapperInitializer(VarDecl *wrappedVar,
26922692
Expr *&initializer,
2693-
bool contextualize = false) {
2693+
bool contextualize) {
26942694
auto *dc = wrappedVar->getInnermostDeclContext();
26952695
auto &ctx = wrappedVar->getASTContext();
26962696
auto *initContext = new (ctx) PropertyWrapperInitializer(
@@ -2985,7 +2985,8 @@ PropertyWrapperInitializerInfoRequest::evaluate(Evaluator &evaluator,
29852985
&& !wrapperInfo.defaultInit) {
29862986
auto ty = parentPBD->getPattern(patternNumber)->getType();
29872987
if (auto defaultInit = TypeChecker::buildDefaultInitializer(ty)) {
2988-
typeCheckSynthesizedWrapperInitializer(var, defaultInit);
2988+
typeCheckSynthesizedWrapperInitializer(var, defaultInit,
2989+
/*contextualize=*/false);
29892990
parentPBD->setInit(0, defaultInit);
29902991
parentPBD->setInitializerChecked(0);
29912992
}
@@ -3003,6 +3004,8 @@ PropertyWrapperInitializerInfoRequest::evaluate(Evaluator &evaluator,
30033004
// FIXME: Record this expression somewhere so that DI can perform the
30043005
// initialization itself.
30053006
Expr *defaultInit = nullptr;
3007+
// Only contextualize local wrapped property, the rest of wrapped
3008+
// property will be contextualized in visitPatternBindingDecl.
30063009
typeCheckSynthesizedWrapperInitializer(var, defaultInit, dc->isLocalContext());
30073010
pbd->setInit(0, defaultInit);
30083011
pbd->setInitializerChecked(0);
@@ -3073,7 +3076,8 @@ PropertyWrapperInitializerInfoRequest::evaluate(Evaluator &evaluator,
30733076
!var->getName().hasDollarPrefix()) {
30743077
wrappedValueInit = PropertyWrapperValuePlaceholderExpr::create(
30753078
ctx, var->getSourceRange(), var->getType(), /*wrappedValue=*/nullptr);
3076-
typeCheckSynthesizedWrapperInitializer(var, wrappedValueInit, true);
3079+
typeCheckSynthesizedWrapperInitializer(var, wrappedValueInit,
3080+
/*contextualize=*/true);
30773081
}
30783082

30793083
return PropertyWrapperInitializerInfo(wrappedValueInit, projectedValueInit);

Diff for: test/SILGen/property_wrappers.swift

+28
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,34 @@ struct TestAutoclosureComposition {
957957
@Once @ObservedObject var model = Model()
958958
}
959959

960+
@propertyWrapper
961+
struct SR_15940Foo {
962+
var wrappedValue: Int { 0 }
963+
}
964+
965+
struct SR_15940_C {
966+
func a() {
967+
@SR_15940Foo var b: Int
968+
}
969+
}
970+
971+
// CHECK-LABEL: sil hidden [ossa] @$s17property_wrappers10SR_15940_CV1ayyF : $@convention(method) (SR_15940_C) -> () {
972+
// CHECK: bb0(%0 : $SR_15940_C):
973+
// CHECK-NEXT: debug_value %0 : $SR_15940_C, let, name "self", argno 1, implicit
974+
// CHECK-NEXT: [[BOX:%.*]] = alloc_box ${ var SR_15940Foo }, var, name "_b"
975+
// CHECK-NEXT: [[LIFETIME:%.*]] = begin_borrow [lexical] [[BOX]] : ${ var SR_15940Foo }
976+
// CHECK-NEXT: [[BOXADDR:%.*]] = project_box [[LIFETIME]] : ${ var SR_15940Foo }, 0
977+
// CHECK-NEXT: [[METATYPE:%.*]] = metatype $@thin SR_15940Foo.Type
978+
// CHECK-NEXT: // function_ref SR_15940Foo.init()
979+
// CHECK-NEXT: [[DEFAULTVALUE_FN:%.*]] = function_ref @$s17property_wrappers11SR_15940FooVACycfC : $@convention(method) (@thin SR_15940Foo.Type) -> SR_15940Foo
980+
// CHECK-NEXT: [[DEFAULTRESULT:%.*]] = apply [[DEFAULTVALUE_FN]]([[METATYPE]]) : $@convention(method) (@thin SR_15940Foo.Type) -> SR_15940Foo
981+
// CHECK-NEXT: store [[DEFAULTRESULT]] to [trivial] [[BOXADDR]] : $*SR_15940Foo
982+
// CHECK-NEXT: end_borrow [[LIFETIME]] : ${ var SR_15940Foo }
983+
// CHECK-NEXT: destroy_value [[BOX]] : ${ var SR_15940Foo }
984+
// CHECK-NEXT: [[TUPLE:%.*]] = tuple ()
985+
// CHECK-NEXT: return [[TUPLE]] : $()
986+
// CHECK-NEXT: } // end sil function '$s17property_wrappers10SR_15940_CV1ayyF
987+
960988
// CHECK-LABEL: sil_vtable ClassUsingWrapper {
961989
// CHECK-NEXT: #ClassUsingWrapper.x!getter: (ClassUsingWrapper) -> () -> Int : @$s17property_wrappers17ClassUsingWrapperC1xSivg // ClassUsingWrapper.x.getter
962990
// CHECK-NEXT: #ClassUsingWrapper.x!setter: (ClassUsingWrapper) -> (Int) -> () : @$s17property_wrappers17ClassUsingWrapperC1xSivs // ClassUsingWrapper.x.setter

0 commit comments

Comments
 (0)