Skip to content

Commit 0f0be6b

Browse files
committed
Sema: A LoadExpr enclosing a call does not affect the arguments.
Fixes missing setter availability diagnostics in some edge cases.
1 parent 1e167f6 commit 0f0be6b

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3532,13 +3532,19 @@ class ExprAvailabilityWalker : public ASTWalker {
35323532
return call;
35333533
}
35343534

3535-
/// Walks up to the first enclosing LoadExpr and returns it.
3535+
/// Walks up from a potential member reference to the first LoadExpr that would
3536+
/// make the member reference an r-value instead of an l-value.
35363537
const LoadExpr *getEnclosingLoadExpr() const {
35373538
assert(!ExprStack.empty() && "must be called while visiting an expression");
35383539
ArrayRef<const Expr *> stack = ExprStack;
35393540
stack = stack.drop_back();
35403541

35413542
for (auto expr : llvm::reverse(stack)) {
3543+
// Do not search past the first enclosing ApplyExpr. Any enclosing
3544+
// LoadExpr from this point only applies to the result of the call.
3545+
if (auto applyExpr = dyn_cast<ApplyExpr>(expr))
3546+
return nullptr;
3547+
35423548
if (auto loadExpr = dyn_cast<LoadExpr>(expr))
35433549
return loadExpr;
35443550
}

test/Sema/availability_accessors.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,14 @@ struct BaseStruct<T: ValueProto> {
7272
var unavailableSetter: T {
7373
get { .defaultValue }
7474
@available(*, unavailable)
75-
set { fatalError() } // expected-note 36 {{setter for 'unavailableSetter' has been explicitly marked unavailable here}}
75+
set { fatalError() } // expected-note 37 {{setter for 'unavailableSetter' has been explicitly marked unavailable here}}
7676
}
7777

7878
var unavailableGetterAndSetter: T {
7979
@available(*, unavailable)
8080
get { fatalError() } // expected-note 62 {{getter for 'unavailableGetterAndSetter' has been explicitly marked unavailable here}}
8181
@available(*, unavailable)
82-
set { fatalError() } // expected-note 36 {{setter for 'unavailableGetterAndSetter' has been explicitly marked unavailable here}}
82+
set { fatalError() } // expected-note 37 {{setter for 'unavailableGetterAndSetter' has been explicitly marked unavailable here}}
8383
}
8484
}
8585

@@ -461,8 +461,7 @@ func testDiscardedApplyOfFuncWithInOutParam_Class() {
461461
_ = takesInOut(&x.unavailableGetter[0].b).magnitude // expected-error {{getter for 'unavailableGetter' is unavailable}}
462462

463463
_ = takesInOut(&x.unavailableSetter) // expected-error {{setter for 'unavailableSetter' is unavailable}}
464-
// FIXME: missing diagnostic for setter
465-
_ = takesInOut(&x.unavailableSetter).a
464+
_ = takesInOut(&x.unavailableSetter).a // expected-error {{setter for 'unavailableSetter' is unavailable}}
466465
_ = takesInOut(&x.unavailableSetter.a)
467466
_ = takesInOut(&x.unavailableSetter.a).b
468467
_ = takesInOut(&x.unavailableSetter[0])
@@ -471,8 +470,7 @@ func testDiscardedApplyOfFuncWithInOutParam_Class() {
471470
_ = takesInOut(&x.unavailableSetter[0].b).magnitude
472471

473472
_ = takesInOut(&x.unavailableGetterAndSetter) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
474-
// FIXME: missing diagnostic for setter
475-
_ = takesInOut(&x.unavailableGetterAndSetter).a // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
473+
_ = takesInOut(&x.unavailableGetterAndSetter).a // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}} expected-error {{setter for 'unavailableGetterAndSetter' is unavailable}}
476474
_ = takesInOut(&x.unavailableGetterAndSetter.a) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
477475
_ = takesInOut(&x.unavailableGetterAndSetter.a).b // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}
478476
_ = takesInOut(&x.unavailableGetterAndSetter[0]) // expected-error {{getter for 'unavailableGetterAndSetter' is unavailable}}

0 commit comments

Comments
 (0)