Skip to content

Commit 0145439

Browse files
author
Nathan Hawes
committed
[CSGen] Mark visitDynamicMemberRefExpr as unreachable to match ExprRewriter and update SanitizeExpr to handle them
We were hitting an unreachable in visitDynamicMemberExpr in ExprRewriter when re-typechecking during a salvage. Check for these earlier (in CSGen) and update SanitizeExpr to handle them. Resolves rdar://problem/39055736
1 parent 1e55118 commit 0145439

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) {
@@ -3113,6 +3111,17 @@ namespace {
31133111
}
31143112
}
31153113

3114+
if (auto *dynamicMember = dyn_cast<DynamicMemberRefExpr>(expr)) {
3115+
if (auto memberRef = dynamicMember->getMember()) {
3116+
auto base = skipImplicitConversions(dynamicMember->getBase());
3117+
return new (TC.Context) MemberRefExpr(base,
3118+
dynamicMember->getDotLoc(),
3119+
memberRef,
3120+
dynamicMember->getNameLoc(),
3121+
expr->isImplicit());
3122+
}
3123+
}
3124+
31163125
if (auto dotIgnored = dyn_cast<DotSyntaxBaseIgnoredExpr>(expr)) {
31173126
// A DotSyntaxBaseIgnoredExpr is a static member reference that has
31183127
// 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)