Skip to content

Commit 854ce9a

Browse files
committed
---
yaml --- r: 349402 b: refs/heads/master-next c: 97f3c39 h: refs/heads/master
1 parent 76587a7 commit 854ce9a

File tree

3 files changed

+32
-3
lines changed

3 files changed

+32
-3
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
refs/heads/master: 3574c513bbc5578dd9346b4ea9ab5995c5927bb5
3-
refs/heads/master-next: 4aefbcf447d24250c246a9f04d7c31fe32b93a0f
3+
refs/heads/master-next: 97f3c39c46d969c8dbf21dbdeb3e9e12d5e9cb96
44
refs/tags/osx-passed: b6b74147ef8a386f532cf9357a1bde006e552c54
55
refs/tags/swift-2.2-SNAPSHOT-2015-12-01-a: 6bb18e013c2284f2b45f5f84f2df2887dc0f7dea
66
refs/tags/swift-2.2-SNAPSHOT-2015-12-01-b: 66d897bfcf64a82cb9a87f5e663d889189d06d07

branches/master-next/lib/Sema/TypeCheckDecl.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1964,8 +1964,17 @@ void TypeChecker::validateDecl(OperatorDecl *OD) {
19641964
}
19651965

19661966
bool swift::doesContextHaveValueSemantics(DeclContext *dc) {
1967-
if (Type contextTy = dc->getDeclaredInterfaceType())
1968-
return !contextTy->hasReferenceSemantics();
1967+
if (Type contextTy = dc->getDeclaredInterfaceType()) {
1968+
// If the decl context is an extension, then it could be imposing a class
1969+
// constraint (ex: where Self: SomeClass). Make sure we include that
1970+
// in our check as well.
1971+
auto extensionRequiresClass = false;
1972+
if (auto ED = dyn_cast<ExtensionDecl>(dc)) {
1973+
extensionRequiresClass =
1974+
ED->getGenericSignature()->requiresClass(ED->getSelfInterfaceType());
1975+
}
1976+
return !contextTy->hasReferenceSemantics() && !extensionRequiresClass;
1977+
}
19691978
return false;
19701979
}
19711980

branches/master-next/test/decl/ext/extensions.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,23 @@ struct WrapperContext {
124124
static let propUsingMember = originalValue
125125
}
126126
}
127+
128+
// SR-11298
129+
130+
protocol SR_11298_P {}
131+
132+
class SR_11298_C: SR_11298_P {
133+
var property: String = ""
134+
}
135+
136+
// Self: SR_11298_C requirement constrains this extension to SR_11298C and its subclasses.
137+
// Since this implies a class constraint, the setter should be implicitly nonmutating.
138+
extension SR_11298_P where Self: SR_11298_C {
139+
var wrappingProperty: String {
140+
get { return property }
141+
set { property = newValue }
142+
}
143+
}
144+
145+
let instance = SR_11298_C()
146+
instance.wrappingProperty = "" // Okay

0 commit comments

Comments
 (0)