Skip to content

Commit e0b6a96

Browse files
committed
Sema: Retire disjunctions in trail instead of restoring in ~DisjunctionStep
Fixes #77008.
1 parent 58a6a64 commit e0b6a96

File tree

3 files changed

+9
-6
lines changed

3 files changed

+9
-6
lines changed

lib/Sema/CSStep.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,9 +425,11 @@ StepResult ComponentStep::take(bool prevFailed) {
425425
case StepKind::Binding:
426426
return suspend(
427427
std::make_unique<TypeVariableStep>(*bestBindings, Solutions));
428-
case StepKind::Disjunction:
428+
case StepKind::Disjunction: {
429+
CS.retireConstraint(disjunction);
429430
return suspend(
430431
std::make_unique<DisjunctionStep>(CS, disjunction, Solutions));
432+
}
431433
case StepKind::Conjunction:
432434
return suspend(
433435
std::make_unique<ConjunctionStep>(CS, conjunction, Solutions));

lib/Sema/CSStep.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -684,16 +684,14 @@ class TypeVariableStep final : public BindingStep<TypeVarBindingProducer> {
684684
class DisjunctionStep final : public BindingStep<DisjunctionChoiceProducer> {
685685
Constraint *Disjunction;
686686
SmallVector<Constraint *, 4> DisabledChoices;
687-
ConstraintList::iterator AfterDisjunction;
688687

689688
std::optional<Score> BestNonGenericScore;
690689
std::optional<std::pair<Constraint *, Score>> LastSolvedChoice;
691690

692691
public:
693692
DisjunctionStep(ConstraintSystem &cs, Constraint *disjunction,
694693
SmallVectorImpl<Solution> &solutions)
695-
: BindingStep(cs, {cs, disjunction}, solutions), Disjunction(disjunction),
696-
AfterDisjunction(erase(disjunction)) {
694+
: BindingStep(cs, {cs, disjunction}, solutions), Disjunction(disjunction) {
697695
assert(Disjunction->getKind() == ConstraintKind::Disjunction);
698696
pruneOverloadSet(Disjunction);
699697
++cs.solverState->NumDisjunctions;
@@ -702,8 +700,6 @@ class DisjunctionStep final : public BindingStep<DisjunctionChoiceProducer> {
702700
~DisjunctionStep() override {
703701
// Rewind back any changes left after attempting last choice.
704702
ActiveChoice.reset();
705-
// Return disjunction constraint back to the system.
706-
restore(AfterDisjunction, Disjunction);
707703
// Re-enable previously disabled overload choices.
708704
for (auto *choice : DisabledChoices)
709705
choice->setEnabled();

test/Constraints/issue-77008.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: not %target-swift-frontend -typecheck %s
2+
3+
// Just don't crash.
4+
5+
Binding<Bool>Binding<Bool>

0 commit comments

Comments
 (0)