Skip to content

Commit 1446b60

Browse files
committed
Reenable property wrapper composition.
This reverts commit 5e08f7d.
1 parent da38e25 commit 1446b60

File tree

4 files changed

+19
-31
lines changed

4 files changed

+19
-31
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4478,9 +4478,6 @@ ERROR(property_wrapper_attribute_not_on_property, none,
44784478
NOTE(property_wrapper_declared_here,none,
44794479
"property wrapper type %0 declared here", (DeclName))
44804480

4481-
ERROR(property_wrapper_composition_not_implemented, none,
4482-
"multiple property wrappers are not supported", ())
4483-
44844481
ERROR(property_wrapper_local,none,
44854482
"property wrappers are not yet supported on local properties", ())
44864483
ERROR(property_wrapper_top_level,none,

lib/Sema/TypeCheckPropertyWrapper.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -460,13 +460,6 @@ AttachedPropertyWrappersRequest::evaluate(Evaluator &evaluator,
460460
result.push_back(mutableAttr);
461461
}
462462

463-
// TODO: Property wrapper compositions do not yet compose correctly
464-
// in all situtaions.
465-
if (result.size() > 1) {
466-
ctx.Diags.diagnose(result[result.size() - 2]->getLocation(),
467-
diag::property_wrapper_composition_not_implemented);
468-
}
469-
470463
// Attributes are stored in reverse order in the AST, but we want them in
471464
// source order so that the outermost property wrapper comes first.
472465
std::reverse(result.begin(), result.end());

test/SILGen/property_wrappers.swift

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -308,33 +308,31 @@ struct WrapperC<Value> {
308308
var wrappedValue: Value?
309309
}
310310

311-
/* TODO: Reenable composed property wrappers
312311
struct CompositionMembers {
313312
// CompositionMembers.p1.getter
314-
// C/HECK-LABEL: sil hidden [ossa] @$s17property_wrappers18CompositionMembersV2p1SiSgvg : $@convention(method) (@guaranteed CompositionMembers) -> Optional<Int>
315-
// C/HECK: bb0([[SELF:%.*]] : @guaranteed $CompositionMembers):
316-
// C/HECK: [[P1:%.*]] = struct_extract [[SELF]] : $CompositionMembers, #CompositionMembers._p1
317-
// C/HECK: [[P1_VALUE:%.*]] = struct_extract [[P1]] : $WrapperA<WrapperB<WrapperC<Int>>>, #WrapperA.wrappedValue
318-
// C/HECK: [[P1_VALUE2:%.*]] = struct_extract [[P1_VALUE]] : $WrapperB<WrapperC<Int>>, #WrapperB.wrappedValue
319-
// C/HECK: [[P1_VALUE3:%.*]] = struct_extract [[P1_VALUE2]] : $WrapperC<Int>, #WrapperC.wrappedValue
320-
// C/HECK: return [[P1_VALUE3]] : $Optional<Int>
313+
// CHECK-LABEL: sil hidden [ossa] @$s17property_wrappers18CompositionMembersV2p1SiSgvg : $@convention(method) (@guaranteed CompositionMembers) -> Optional<Int>
314+
// CHECK: bb0([[SELF:%.*]] : @guaranteed $CompositionMembers):
315+
// CHECK: [[P1:%.*]] = struct_extract [[SELF]] : $CompositionMembers, #CompositionMembers._p1
316+
// CHECK: [[P1_VALUE:%.*]] = struct_extract [[P1]] : $WrapperA<WrapperB<WrapperC<Int>>>, #WrapperA.wrappedValue
317+
// CHECK: [[P1_VALUE2:%.*]] = struct_extract [[P1_VALUE]] : $WrapperB<WrapperC<Int>>, #WrapperB.wrappedValue
318+
// CHECK: [[P1_VALUE3:%.*]] = struct_extract [[P1_VALUE2]] : $WrapperC<Int>, #WrapperC.wrappedValue
319+
// CHECK: return [[P1_VALUE3]] : $Optional<Int>
321320
@WrapperA @WrapperB @WrapperC var p1: Int?
322321
@WrapperA @WrapperB @WrapperC var p2 = "Hello"
323322

324323
// variable initialization expression of CompositionMembers.$p2
325-
// C/HECK-LABEL: sil hidden [transparent] [ossa] @$s17property_wrappers18CompositionMembersV3_p233_{{.*}}8WrapperAVyAA0N1BVyAA0N1CVySSGGGvpfi : $@convention(thin) () -> @owned Optional<String> {
326-
// C/HECK: %0 = string_literal utf8 "Hello"
324+
// CHECK-LABEL: sil hidden [transparent] [ossa] @$s17property_wrappers18CompositionMembersV3_p233_{{.*}}8WrapperAVyAA0N1BVyAA0N1CVySSGGGvpfi : $@convention(thin) () -> @owned Optional<String> {
325+
// CHECK: %0 = string_literal utf8 "Hello"
327326

328-
// C/HECK-LABEL: sil hidden [ossa] @$s17property_wrappers18CompositionMembersV2p12p2ACSiSg_SSSgtcfC : $@convention(method) (Optional<Int>, @owned Optional<String>, @thin CompositionMembers.Type) -> @owned CompositionMembers
329-
// C/HECK: function_ref @$s17property_wrappers8WrapperCV12wrappedValueACyxGxSg_tcfC
330-
// C/HECK: function_ref @$s17property_wrappers8WrapperBV12wrappedValueACyxGx_tcfC
331-
// C/HECK: function_ref @$s17property_wrappers8WrapperAV12wrappedValueACyxGx_tcfC
327+
// CHECK-LABEL: sil hidden [ossa] @$s17property_wrappers18CompositionMembersV2p12p2ACSiSg_SSSgtcfC : $@convention(method) (Optional<Int>, @owned Optional<String>, @thin CompositionMembers.Type) -> @owned CompositionMembers
328+
// CHECK: function_ref @$s17property_wrappers8WrapperCV12wrappedValueACyxGxSg_tcfC
329+
// CHECK: function_ref @$s17property_wrappers8WrapperBV12wrappedValueACyxGx_tcfC
330+
// CHECK: function_ref @$s17property_wrappers8WrapperAV12wrappedValueACyxGx_tcfC
332331
}
333332

334333
func testComposition() {
335334
_ = CompositionMembers(p1: nil)
336335
}
337-
*/
338336

339337
// Observers with non-default mutatingness.
340338
@propertyWrapper

test/decl/var/property_wrappers.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ struct BadCombinations {
217217

218218
struct MultipleWrappers {
219219
@Wrapper(stored: 17)
220-
@WrapperWithInitialValue // expected-error{{extra argument 'wrappedValue' in call}} expected-error{{multiple property wrappers are not supported}}
220+
@WrapperWithInitialValue // expected-error{{extra argument 'wrappedValue' in call}}
221221
var x: Int = 17
222222

223223
@WrapperWithInitialValue // expected-error 2{{property wrapper can only apply to a single variable}}
@@ -959,11 +959,11 @@ struct WrapperE<Value> {
959959
}
960960

961961
struct TestComposition {
962-
@WrapperA @WrapperB @WrapperC var p1: Int? // expected-error{{multiple property wrappers are not supported}}
963-
@WrapperA @WrapperB @WrapperC var p2 = "Hello" // expected-error{{multiple property wrappers are not supported}}
964-
@WrapperD<WrapperE, Int, String> @WrapperE var p3: Int? // expected-error{{multiple property wrappers are not supported}}
965-
@WrapperD<WrapperC, Int, String> @WrapperC var p4: Int? // expected-error{{multiple property wrappers are not supported}}
966-
@WrapperD<WrapperC, Int, String> @WrapperE var p5: Int // expected-error{{property type 'Int' does not match that of the 'wrappedValue' property of its wrapper type 'WrapperD<WrapperC, Int, String>'}} // expected-error{{multiple property wrappers are not supported}}
962+
@WrapperA @WrapperB @WrapperC var p1: Int?
963+
@WrapperA @WrapperB @WrapperC var p2 = "Hello"
964+
@WrapperD<WrapperE, Int, String> @WrapperE var p3: Int?
965+
@WrapperD<WrapperC, Int, String> @WrapperC var p4: Int?
966+
@WrapperD<WrapperC, Int, String> @WrapperE var p5: Int // expected-error{{property type 'Int' does not match that of the 'wrappedValue' property of its wrapper type 'WrapperD<WrapperC, Int, String>'}}
967967

968968
func triggerErrors(d: Double) {
969969
p1 = d // expected-error{{cannot assign value of type 'Double' to type 'Int?'}}

0 commit comments

Comments
 (0)