Skip to content

Commit d367dfc

Browse files
author
Nathan Hawes
authored
Merge pull request swiftlang#15627 from nathawes/reachable-unreachables
[CSGen] Mark visitDynamicMemberRefExpr as unreachable to match ExprRewriter and update SanitizeExpr to handle them
2 parents 6e81c68 + 0145439 commit d367dfc

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

lib/Sema/CSGen.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,9 +1406,7 @@ namespace {
14061406
}
14071407

14081408
Type visitDynamicMemberRefExpr(DynamicMemberRefExpr *expr) {
1409-
return addMemberRefConstraints(expr, expr->getBase(),
1410-
expr->getMember().getDecl(),
1411-
/*FIXME:*/FunctionRefKind::DoubleApply);
1409+
llvm_unreachable("Already typechecked");
14121410
}
14131411

14141412
virtual Type visitUnresolvedMemberExpr(UnresolvedMemberExpr *expr) {
@@ -3121,6 +3119,17 @@ namespace {
31213119
}
31223120
}
31233121

3122+
if (auto *dynamicMember = dyn_cast<DynamicMemberRefExpr>(expr)) {
3123+
if (auto memberRef = dynamicMember->getMember()) {
3124+
auto base = skipImplicitConversions(dynamicMember->getBase());
3125+
return new (TC.Context) MemberRefExpr(base,
3126+
dynamicMember->getDotLoc(),
3127+
memberRef,
3128+
dynamicMember->getNameLoc(),
3129+
expr->isImplicit());
3130+
}
3131+
}
3132+
31243133
if (auto dotIgnored = dyn_cast<DotSyntaxBaseIgnoredExpr>(expr)) {
31253134
// A DotSyntaxBaseIgnoredExpr is a static member reference that has
31263135
// already been type-checked down to a call where the argument doesn't
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck %s -verify
2+
// REQUIRES: objc_interop
3+
4+
import Foundation
5+
6+
@objc class Foo: NSObject {
7+
let x: Int = 0
8+
}
9+
@objc protocol Bar {
10+
@objc optional var foo: Foo {get}
11+
}
12+
13+
func baz(bar: Bar) {
14+
max(bar, bar.foo?.x ?? 0)
15+
// expected-error@-1 {{cannot invoke 'max' with an argument list of type '(Bar, Int)'}}
16+
// expected-note@-2 {{expected an argument list of type '(T, T)'}}
17+
}

0 commit comments

Comments
 (0)