Skip to content

Commit 47ff956

Browse files
committed
Sema: Assert if attempting to assign discriminator too early
1 parent 0739991 commit 47ff956

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

lib/Sema/TypeCheckStmt.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,8 @@ namespace {
356356
// Assign the next discriminator.
357357
Identifier name = valueDecl->getBaseIdentifier();
358358
auto &discriminator = DeclDiscriminators[name];
359-
discriminator = std::max(discriminator, std::max(InitialDiscriminator, valueDecl->getLocalDiscriminator() + 1));
359+
discriminator = std::max(discriminator,
360+
std::max(InitialDiscriminator, valueDecl->getLocalDiscriminator() + 1));
360361
}
361362
}
362363

@@ -411,7 +412,13 @@ unsigned LocalDiscriminatorsRequest::evaluate(
411412
ParameterList *params = nullptr;
412413
ParamDecl *selfParam = nullptr;
413414
if (auto func = dyn_cast<AbstractFunctionDecl>(dc)) {
414-
node = func->getBody();
415+
if (!func->isBodySkipped()) {
416+
assert(func->getBodyKind() != AbstractFunctionDecl::BodyKind::Unparsed &&
417+
func->getBodyKind() != AbstractFunctionDecl::BodyKind::Parsed &&
418+
"Computing local discriminators too early");
419+
node = func->getBody();
420+
}
421+
415422
selfParam = func->getImplicitSelfDecl();
416423
params = func->getParameters();
417424

@@ -428,6 +435,7 @@ unsigned LocalDiscriminatorsRequest::evaluate(
428435
}
429436
}
430437
} else if (auto closure = dyn_cast<ClosureExpr>(dc)) {
438+
assert(closure->getType());
431439
node = closure->getBody();
432440
params = closure->getParameters();
433441
} else if (auto topLevel = dyn_cast<TopLevelCodeDecl>(dc)) {

0 commit comments

Comments
 (0)