Skip to content

Commit f95eb6b

Browse files
committed
[Sema] Tighten up function call check in resolveKeyPathExpr
Check for `CallExpr` instead of `ApplyExpr`, we don't support arbitrary postfix operators in key paths.
1 parent 2e18973 commit f95eb6b

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

lib/Sema/PreCheckTarget.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2531,11 +2531,11 @@ void PreCheckTarget::resolveKeyPathExpr(KeyPathExpr *KPE) {
25312531
(void)outermostExpr;
25322532
assert(OEE == outermostExpr);
25332533
expr = OEE->getSubExpr();
2534-
} else if (auto AE = dyn_cast<ApplyExpr>(expr)) {
2534+
} else if (auto CE = dyn_cast<CallExpr>(expr)) {
25352535
// foo(), foo(val value: Int) or unapplied foo
25362536
components.push_back(KeyPathExpr::Component::forUnresolvedApply(
2537-
getASTContext(), AE->getArgs()));
2538-
expr = AE->getFn();
2537+
getASTContext(), CE->getArgs()));
2538+
expr = CE->getFn();
25392539
} else {
25402540
if (emitErrors) {
25412541
// \(<expr>) may be an attempt to write a string interpolation outside

test/StringProcessing/Parse/forward-slash-regex.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,6 @@ _ = /\()/
407407
// expected-error@-1 {{'/' is not a prefix unary operator}}
408408
// expected-error@-2 {{'/' is not a postfix unary operator}}
409409
// expected-error@-3 {{invalid component of Swift key path}}
410-
// expected-error@-4 {{type of expression is ambiguous without a type annotation}}
411410

412411
do {
413412
let _: Regex = (/whatever\)/

test/expr/unary/keypath/keypath-unsupported-methods.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,16 @@ func f_56996() {
4646
_ = \Int.byteSwapped.signum() // expected-error {{key path cannot refer to instance method 'signum()'}}
4747
_ = \Int.byteSwapped.init() // expected-error {{key path cannot refer to initializer 'init()'}}
4848
}
49+
50+
postfix operator ^
51+
postfix func ^ <T>(_ x: T) -> T { x }
52+
53+
func unsupportedOperator() {
54+
struct S {
55+
var x: Int
56+
}
57+
_ = \.^ // expected-error {{invalid component of Swift key path}}
58+
_ = \S^ // expected-error {{invalid component of Swift key path}}
59+
_ = \S.x^ // expected-error {{invalid component of Swift key path}}
60+
_ = \.x^ // expected-error {{invalid component of Swift key path}}
61+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// {"signature":"(anonymous namespace)::ConstraintWalker::walkToExprPost(swift::Expr*)"}
2+
// RUN: not %target-swift-frontend -typecheck %s
3+
\.+=

0 commit comments

Comments
 (0)