Skip to content

Commit f51119a

Browse files
committed
[Property wrappers] Sync up implicit "nil" initialization defaulting.
Perform implicit "nil" initialization for a wrapped property only when the memberwise initializer's parameter is of the wrapped type.
1 parent 493bed0 commit f51119a

File tree

5 files changed

+7
-7
lines changed

5 files changed

+7
-7
lines changed

lib/AST/Decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5830,7 +5830,7 @@ bool VarDecl::isPropertyMemberwiseInitializedWithWrappedType() const {
58305830
if (getAttachedPropertyWrapperTypeInfo(0).defaultInit)
58315831
return false;
58325832

5833-
// If all property wrappers have an initialValue initializer, the property
5833+
// If all property wrappers have a wrappedValue initializer, the property
58345834
// wrapper will be initialized that way.
58355835
return allAttachedPropertyWrappersHaveInitialValueInit();
58365836
}

lib/SILGen/SILGen.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,8 +1115,8 @@ emitStoredPropertyInitialization(PatternBindingDecl *pbd, unsigned i) {
11151115
->isPropertyMemberwiseInitializedWithWrappedType()) {
11161116
auto wrapperInfo =
11171117
originalProperty->getPropertyWrapperBackingPropertyInfo();
1118-
if (wrapperInfo.originalInitialValue)
1119-
init = wrapperInfo.originalInitialValue;
1118+
assert(wrapperInfo.originalInitialValue);
1119+
init = wrapperInfo.originalInitialValue;
11201120
}
11211121
}
11221122

lib/Sema/CodeSynthesis.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ static void maybeAddMemberwiseDefaultArg(ParamDecl *arg, VarDecl *var,
145145
var->getAttrs().hasAttribute<LazyAttr>() ||
146146
(!isExplicitlyInitialized && isDefaultInitializable &&
147147
var->getValueInterfaceType()->getAnyNominal() == ctx.getOptionalDecl() &&
148-
!var->getAttachedPropertyWrapperTypeInfo(0).defaultInit);
148+
(var->getAttachedPropertyWrappers().empty() ||
149+
var->isPropertyMemberwiseInitializedWithWrappedType()));
149150
if (isNilInitialized) {
150151
arg->setDefaultArgumentKind(DefaultArgumentKind::NilLiteral);
151152
return;

lib/Sema/TypeCheckStorage.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2436,8 +2436,7 @@ PropertyWrapperBackingPropertyInfoRequest::evaluate(Evaluator &evaluator,
24362436
}
24372437

24382438
// Get the property wrapper information.
2439-
if (!var->allAttachedPropertyWrappersHaveInitialValueInit() &&
2440-
!originalInitialValue) {
2439+
if (!var->allAttachedPropertyWrappersHaveInitialValueInit()) {
24412440
return PropertyWrapperBackingPropertyInfo(
24422441
backingVar, storageVar, nullptr, nullptr, nullptr);
24432442
}

test/IDE/print_property_wrappers.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ struct HasWrappers {
4747
var z: String
4848

4949
// Memberwise initializer.
50-
// CHECK: init(x: Wrapper<Int> = Wrapper(closure: foo), y: Bool = true, z: String = Wrapper())
50+
// CHECK: init(x: Wrapper<Int> = Wrapper(closure: foo), y: Bool = true, z: Wrapper<String> = Wrapper())
5151
}
5252

5353
func trigger() {

0 commit comments

Comments
 (0)