Skip to content

Commit 36d0cd6

Browse files
committed
[Sema] Pass self nominal type as a parameter to CheckRedeclarationRequest
The self nominal type decl needs to be passed as a parameter in here so this request doesn't tigger self nominal type computation, which results in an assertion failure.
1 parent 7e35924 commit 36d0cd6

File tree

4 files changed

+22
-8
lines changed

4 files changed

+22
-8
lines changed

include/swift/AST/TypeCheckRequests.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3103,7 +3103,8 @@ class LookupAllConformancesInContextRequest
31033103

31043104
class CheckRedeclarationRequest
31053105
: public SimpleRequest<
3106-
CheckRedeclarationRequest, evaluator::SideEffect(ValueDecl *),
3106+
CheckRedeclarationRequest,
3107+
evaluator::SideEffect(ValueDecl *, NominalTypeDecl *),
31073108
RequestFlags::SeparatelyCached | RequestFlags::DependencySource |
31083109
RequestFlags::DependencySink> {
31093110
public:
@@ -3113,10 +3114,13 @@ class CheckRedeclarationRequest
31133114
friend SimpleRequest;
31143115

31153116
// Evaluation.
3116-
evaluator::SideEffect
3117-
evaluate(Evaluator &evaluator, ValueDecl *VD) const;
3117+
/// \p SelfNominalType is \c VD->getDeclContext()->getSelfNominalType().
3118+
/// Passed as a parameter in here so this request doesn't tigger self nominal
3119+
/// type computation.
3120+
evaluator::SideEffect evaluate(Evaluator &evaluator, ValueDecl *VD,
3121+
NominalTypeDecl *SelfNominalType) const;
31183122

3119-
public:
3123+
public:
31203124
// Separate caching.
31213125
bool isCached() const { return true; }
31223126
Optional<evaluator::SideEffect> getCachedResult() const;

lib/AST/TypeCheckRequests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1324,7 +1324,7 @@ void CheckRedeclarationRequest::writeDependencySink(
13241324
return;
13251325

13261326
if (currentDC->isTypeContext()) {
1327-
if (auto nominal = currentDC->getSelfNominalTypeDecl()) {
1327+
if (auto nominal = std::get<1>(getStorage())) {
13281328
tracker.addUsedMember(nominal, current->getBaseName());
13291329
}
13301330
} else {

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,8 @@ static void checkRedeclaration(PrecedenceGroupDecl *group) {
542542

543543
/// Check whether \c current is a redeclaration.
544544
evaluator::SideEffect
545-
CheckRedeclarationRequest::evaluate(Evaluator &eval, ValueDecl *current) const {
545+
CheckRedeclarationRequest::evaluate(Evaluator &eval, ValueDecl *current,
546+
NominalTypeDecl *SelfNominalType) const {
546547
// Ignore invalid and anonymous declarations.
547548
if (current->isInvalid() || !current->hasName())
548549
return std::make_tuple<>();
@@ -1872,8 +1873,11 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
18721873
// Force some requests, which can produce diagnostics.
18731874

18741875
// Check redeclaration.
1875-
(void) evaluateOrDefault(Context.evaluator,
1876-
CheckRedeclarationRequest{VD}, {});
1876+
(void)evaluateOrDefault(
1877+
Context.evaluator,
1878+
CheckRedeclarationRequest{
1879+
VD, VD->getDeclContext()->getSelfNominalTypeDecl()},
1880+
{});
18771881

18781882
// Compute access level.
18791883
(void) VD->getFormalAccess();
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
func foo() {
2+
extension XXX {
3+
// RUN: %sourcekitd-test -req=cursor -pos=%(line + 1):9 %s -- %s
4+
var hex
5+
}
6+
}

0 commit comments

Comments
 (0)