Skip to content

Commit 3baf0bd

Browse files
committed
[Property Wrappers] Fix disallowing dynamic Self for property wrapper
wrappedValue/projectedValue to also cover optional.
1 parent ea293cf commit 3baf0bd

File tree

2 files changed

+14
-18
lines changed

2 files changed

+14
-18
lines changed

lib/Sema/TypeCheckPropertyWrapper.cpp

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -406,25 +406,21 @@ PropertyWrapperTypeInfoRequest::evaluate(
406406
}
407407
}
408408

409-
auto diagnoseInvalidDynamicSelf = [&]() -> bool {
410-
bool invalidDynamicSelf = false;
411-
if (result.projectedValueVar &&
412-
result.projectedValueVar->getValueInterfaceType()->is<DynamicSelfType>()) {
413-
result.projectedValueVar->diagnose(
414-
diag::property_wrapper_dynamic_self_type, /*projectedValue=*/true);
415-
invalidDynamicSelf = true;
416-
}
417-
418-
if (result.valueVar->getValueInterfaceType()->is<DynamicSelfType>()) {
419-
result.valueVar->diagnose(
420-
diag::property_wrapper_dynamic_self_type, /*projectedValue=*/false);
421-
invalidDynamicSelf = true;
422-
}
409+
bool hasInvalidDynamicSelf = false;
410+
if (result.projectedValueVar &&
411+
result.projectedValueVar->getValueInterfaceType()->hasDynamicSelfType()) {
412+
result.projectedValueVar->diagnose(
413+
diag::property_wrapper_dynamic_self_type, /*projectedValue=*/true);
414+
hasInvalidDynamicSelf = true;
415+
}
423416

424-
return invalidDynamicSelf;
425-
};
417+
if (result.valueVar->getValueInterfaceType()->hasDynamicSelfType()) {
418+
result.valueVar->diagnose(
419+
diag::property_wrapper_dynamic_self_type, /*projectedValue=*/false);
420+
hasInvalidDynamicSelf = true;
421+
}
426422

427-
if (diagnoseInvalidDynamicSelf())
423+
if (hasInvalidDynamicSelf)
428424
return PropertyWrapperTypeInfo();
429425

430426
return result;

test/decl/var/property_wrappers.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ struct DynamicSelfStruct {
833833
@propertyWrapper
834834
class DynamicSelf {
835835
var wrappedValue: Self { self } // expected-error {{property wrapper wrapped value cannot have dynamic Self type}}
836-
var projectedValue: Self { self } // expected-error {{property wrapper projected value cannot have dynamic Self type}}
836+
var projectedValue: Self? { self } // expected-error {{property wrapper projected value cannot have dynamic Self type}}
837837
}
838838

839839
struct UseDynamicSelfWrapper {

0 commit comments

Comments
 (0)