Skip to content

Commit 11d8e86

Browse files
authored
Merge pull request #19990 from xedin/rdar-45470505
[CSDiagnostics] Fix requirement source lookup to support initializers
2 parents 1b847f3 + 70d9b2d commit 11d8e86

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

lib/Sema/CSDiagnostics.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,16 @@ ValueDecl *RequirementFailure::getDeclRef() const {
103103
locator = cs.getConstraintLocator(
104104
ctor.withPathElement(PathEltKind::ApplyFunction)
105105
.withPathElement(PathEltKind::ConstructorMember));
106-
} else if (isa<UnresolvedDotExpr>(anchor)) {
106+
} else if (auto *UDE = dyn_cast<UnresolvedDotExpr>(anchor)) {
107107
ConstraintLocatorBuilder member(locator);
108-
locator =
109-
cs.getConstraintLocator(member.withPathElement(PathEltKind::Member));
108+
109+
if (UDE->getName().isSimpleName(DeclBaseName::createConstructor())) {
110+
member = member.withPathElement(PathEltKind::ConstructorMember);
111+
} else {
112+
member = member.withPathElement(PathEltKind::Member);
113+
}
114+
115+
locator = cs.getConstraintLocator(member);
110116
} else if (isa<SubscriptExpr>(anchor)) {
111117
ConstraintLocatorBuilder subscript(locator);
112118
locator = cs.getConstraintLocator(

lib/Sema/CSDiagnostics.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ class RequirementFailure : public FailureDiagnostic {
163163
RequirementFailure(Expr *expr, ConstraintSystem &cs,
164164
ConstraintLocator *locator)
165165
: FailureDiagnostic(expr, cs, locator), AffectedDecl(getDeclRef()) {
166+
assert(AffectedDecl);
166167
auto *anchor = getAnchor();
167168
expr->forEachChildExpr([&](Expr *subExpr) -> Expr * {
168169
auto *AE = dyn_cast<ApplyExpr>(subExpr);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// RUN: %target-typecheck-verify-swift
2+
3+
extension BinaryInteger {
4+
init(bytes: [UInt8]) { fatalError() }
5+
6+
init<S: Sequence>(bytes: S) where S.Iterator.Element == UInt8 {
7+
self.init(bytes // expected-error {{ambiguous reference to initializer 'init(_:)'}}
8+
// expected-note@-1 {{}}
9+
10+
extension
11+
// expected-error@-1 {{declaration is only valid at file scope}}
12+
// expected-error@-2 {{expected ')' in expression list}}
13+
// expected-error@-3 {{expected '{' in extension}}
14+
}
15+
// expected-error@-1 {{expected type name in extension declaration}}
16+
}

0 commit comments

Comments
 (0)