Skip to content

Commit 75a9407

Browse files
authored
Merge pull request #21619 from rjmccall/sil-parser-overloaded-accessors
When parsing SILDeclRefs, ignore declarations that lack the right accessor
2 parents f19aca6 + e674d65 commit 75a9407

File tree

2 files changed

+37
-11
lines changed

2 files changed

+37
-11
lines changed

lib/ParseSIL/ParseSIL.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,21 +1399,24 @@ bool SILParser::parseSILDeclRef(SILDeclRef &Result,
13991399
ParseState = 1;
14001400
} else if (!ParseState &&
14011401
(accessorKind = getAccessorKind(Id.str())).hasValue()) {
1402-
auto storageDecl = dyn_cast<AbstractStorageDecl>(VD);
1403-
auto accessor = (storageDecl
1404-
? storageDecl->getAccessor(*accessorKind)
1405-
: nullptr);
1406-
if (!accessor) {
1402+
// Drill down to the corresponding accessor for each declaration,
1403+
// compacting away decls that lack it.
1404+
size_t destI = 0;
1405+
for (size_t srcI = 0, e = values.size(); srcI != e; ++srcI) {
1406+
if (auto storage = dyn_cast<AbstractStorageDecl>(values[srcI]))
1407+
if (auto accessor = storage->getAccessor(*accessorKind))
1408+
values[destI++] = accessor;
1409+
}
1410+
values.resize(destI);
1411+
1412+
// Complain if none of the decls had a corresponding accessor.
1413+
if (destI == 0) {
14071414
P.diagnose(IdLoc, diag::referenced_value_no_accessor, 0);
14081415
return true;
14091416
}
1417+
14101418
Kind = SILDeclRef::Kind::Func;
1411-
VD = accessor;
1412-
// Update values for this accessor kind.
1413-
for (unsigned I = 0, E = values.size(); I < E; I++)
1414-
if (auto otherDecl = dyn_cast<AbstractStorageDecl>(values[I]))
1415-
if (auto otherAccessor = otherDecl->getAccessor(*accessorKind))
1416-
values[I] = otherAccessor;
1419+
VD = values[0];
14171420
ParseState = 1;
14181421
} else if (!ParseState && Id.str() == "allocator") {
14191422
Kind = SILDeclRef::Kind::Allocator;

test/SIL/Parser/overloaded_member.sil

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,26 @@ bb0(%0 : $A, %1 : @owned $X):
3737
destroy_value %2 : $<τ_0_0> { var τ_0_0 } <X>
3838
return %15 : $X
3939
}
40+
41+
// rdar://46650834
42+
// Don't complain that the first lookup result lacks an accessor when a
43+
// later lookup result provides it.
44+
class B {
45+
typealias Index = Int
46+
typealias Element = String
47+
48+
subscript(owned index: Index) -> Element { get }
49+
50+
@_borrowed
51+
subscript(borrowed index: Index) -> Element { get }
52+
}
53+
54+
sil [ossa] @test_overloaded_subscript : $@convention(thin) (@guaranteed B, B.Index) -> () {
55+
bb0(%0 : $B, %1 : $B.Index):
56+
%reader = class_method %0 : $B, #B.subscript!read.1 : (B) -> (B.Index) -> (), $@convention(method) @yield_once (B.Index, @guaranteed B) -> @yields @guaranteed B.Element
57+
(%element, %token) = begin_apply %reader(%1, %0) : $@convention(method) @yield_once (B.Index, @guaranteed B) -> @yields @guaranteed B.Element
58+
end_apply %token
59+
60+
%result = tuple ()
61+
return %result : $()
62+
}

0 commit comments

Comments
 (0)