Skip to content

Commit b5f3829

Browse files
authored
Merge pull request #19934 from xedin/rdar-45242032
[CSDiag] Don't increase candidate curry level if base is ignored
2 parents c4697c3 + efd2069 commit b5f3829

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

lib/Sema/CalleeCandidateInfo.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,16 @@ void CalleeCandidateInfo::collectCalleeCandidates(Expr *fn,
717717
if (auto UDE = dyn_cast<UnresolvedDotExpr>(fn)) {
718718
declName = UDE->getName().getBaseName().userFacingName();
719719
uncurryLevel = 1;
720-
720+
721+
// If base is a module or metatype, this is just a simple
722+
// reference so its curry level should be 0.
723+
if (auto *DRE = dyn_cast<DeclRefExpr>(UDE->getBase())) {
724+
if (auto baseType = DRE->getType())
725+
uncurryLevel =
726+
(baseType->is<ModuleType>() || baseType->is<AnyMetatypeType>()) ? 0
727+
: 1;
728+
}
729+
721730
// If we actually resolved the member to use, return it.
722731
auto loc = CS.getConstraintLocator(UDE, ConstraintLocator::Member);
723732
if (auto *member = CS.findResolvedMemberRef(loc)) {

test/Constraints/rdar45242032.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// RUN: %target-typecheck-verify-swift -module-name M
2+
3+
protocol P {
4+
var v: String { get }
5+
}
6+
7+
func foo(bar: [P], baz: [P]) {
8+
// expected-note@-1 {{'foo(bar:baz:)' declared here}}
9+
}
10+
11+
struct S {
12+
static func bar(fiz: [P], baz: [P]) {}
13+
// expected-note@-1 {{'bar(fiz:baz:)' declared here}}
14+
}
15+
16+
do {
17+
let _ = M.foo(bar & // expected-error {{missing argument for parameter 'bar' in call}}
18+
} // expected-error {{expected expression after operator}}
19+
20+
do {
21+
let _ = S.bar(fiz & // expected-error {{missing argument for parameter 'fiz' in call}}
22+
} // expected-error {{expected expression after operator}}

0 commit comments

Comments
 (0)