Skip to content

Commit 542b10c

Browse files
authored
Merge pull request #25627 from DougGregor/property-wrappers-sr-10933-5.1
2 parents 42683c1 + 96f8205 commit 542b10c

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
lines changed

lib/Sema/CodeSynthesis.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,6 +1598,11 @@ PropertyWrapperBackingPropertyInfoRequest::evaluate(Evaluator &evaluator,
15981598
isInvalid = true;
15991599
}
16001600

1601+
if (!var->hasInterfaceType()) {
1602+
auto &tc = *static_cast<TypeChecker *>(ctx.getLazyResolver());
1603+
tc.validateDecl(var);
1604+
}
1605+
16011606
// Make sure that the property type matches the value of the
16021607
// wrapper type.
16031608
if (!storageType->hasError()) {
@@ -1646,9 +1651,6 @@ PropertyWrapperBackingPropertyInfoRequest::evaluate(Evaluator &evaluator,
16461651
if (parentPBD->isInitialized(patternNumber) &&
16471652
!parentPBD->isInitializerChecked(patternNumber)) {
16481653
auto &tc = *static_cast<TypeChecker *>(ctx.getLazyResolver());
1649-
if (!var->hasType())
1650-
tc.validateDecl(var);
1651-
16521654
tc.typeCheckPatternBinding(parentPBD, patternNumber);
16531655
}
16541656
// Mark the backing property as 'final'. There's no sensible way to override.

test/multifile/Inputs/sr10933a.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@propertyWrapper
2+
class Wrapper<T> {
3+
private var _value: T
4+
5+
var wrappedValue: T {
6+
get { _value }
7+
set { _value = newValue }
8+
}
9+
10+
init(defaultValue: T) {
11+
self._value = defaultValue
12+
}
13+
14+
}

test/multifile/Inputs/sr10933b.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
@propertyWrapper
2+
final class IntWrapper: Wrapper<Int> {
3+
override var value: Int {
4+
get { super.value }
5+
set { super.value = newValue }
6+
}
7+
}
8+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %target-swift-frontend -typecheck -primary-file %s %S/Inputs/sr10933a.swift %S/Inputs/sr10933b.swift
2+
3+
// SR-10933: crash involving multiple files
4+
class Holder {
5+
@IntWrapper(defaultValue: 100) var int: Int
6+
}
7+
8+
func main() {
9+
let h = Holder()
10+
}

0 commit comments

Comments
 (0)