Skip to content

Commit 31df22f

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 89e31cd commit 31df22f

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
@@ -3524,13 +3524,19 @@ class ExprAvailabilityWalker : public ASTWalker {
35243524
return call;
35253525
}
35263526

3527-
/// Walks up to the first enclosing LoadExpr and returns it.
3527+
/// Walks up from a potential member reference to the first LoadExpr that would
3528+
/// make the member reference an r-value instead of an l-value.
35283529
const LoadExpr *getEnclosingLoadExpr() const {
35293530
assert(!ExprStack.empty() && "must be called while visiting an expression");
35303531
ArrayRef<const Expr *> stack = ExprStack;
35313532
stack = stack.drop_back();
35323533

35333534
for (auto expr : llvm::reverse(stack)) {
3535+
// Do not search past the first enclosing ApplyExpr. Any enclosing
3536+
// LoadExpr from this point only applies to the result of the call.
3537+
if (auto applyExpr = dyn_cast<ApplyExpr>(expr))
3538+
return nullptr;
3539+
35343540
if (auto loadExpr = dyn_cast<LoadExpr>(expr))
35353541
return loadExpr;
35363542
}

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)