Skip to content

Commit 5e08f7d

Browse files
committed
Disable property wrapper composition.
There are ABI-affecting bugs with composition like SR-11138, so disable until those bugs can be fixed. rdar://problem/53428736
1 parent 0a04d0c commit 5e08f7d

File tree

4 files changed

+32
-20
lines changed

4 files changed

+32
-20
lines changed

include/swift/AST/DiagnosticsSema.def

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

4479+
ERROR(property_wrapper_composition_not_implemented, none,
4480+
"multiple property wrappers are not supported", ())
4481+
44794482
ERROR(property_wrapper_local,none,
44804483
"property wrappers are not yet supported on local properties", ())
44814484
ERROR(property_wrapper_top_level,none,

lib/Sema/TypeCheckPropertyWrapper.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,10 +462,17 @@ AttachedPropertyWrappersRequest::evaluate(Evaluator &evaluator,
462462
ctx.Diags.diagnose(attr->getLocation(), diag::property_wrapper_computed);
463463
continue;
464464
}
465-
465+
466466
result.push_back(mutableAttr);
467467
}
468468

469+
// TODO: Property wrapper compositions do not yet compose correctly
470+
// in all situtaions.
471+
if (result.size() > 1) {
472+
ctx.Diags.diagnose(result[result.size() - 2]->getLocation(),
473+
diag::property_wrapper_composition_not_implemented);
474+
}
475+
469476
// Attributes are stored in reverse order in the AST, but we want them in
470477
// source order so that the outermost property wrapper comes first.
471478
std::reverse(result.begin(), result.end());

test/SILGen/property_wrappers.swift

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

311+
/* TODO: Reenable composed property wrappers
311312
struct CompositionMembers {
312313
// CompositionMembers.p1.getter
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>
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>
320321
@WrapperA @WrapperB @WrapperC var p1: Int?
321322
@WrapperA @WrapperB @WrapperC var p2 = "Hello"
322323

323324
// variable initialization expression of CompositionMembers.$p2
324-
// CHECK-LABEL: sil hidden [transparent] [ossa] @$s17property_wrappers18CompositionMembersV3_p233_{{.*}}8WrapperAVyAA0N1BVyAA0N1CVySSGGGvpfi : $@convention(thin) () -> @owned Optional<String> {
325-
// CHECK: %0 = string_literal utf8 "Hello"
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"
326327

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
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
331332
}
332333

333334
func testComposition() {
334335
_ = CompositionMembers(p1: nil)
335336
}
337+
*/
336338

337339
// Observers with non-default mutatingness.
338340
@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}}
220+
@WrapperWithInitialValue // expected-error{{extra argument 'wrappedValue' in call}} expected-error{{multiple property wrappers are not supported}}
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?
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>'}}
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}}
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)