@@ -90,6 +90,18 @@ SolverTrail::~SolverTrail() {
9090 result.TheConstraint .Constraint = constraint; \
9191 return result; \
9292 }
93+ #define BINDING_RELATION_CHANGE (Name ) \
94+ SolverTrail::Change \
95+ SolverTrail::Change::Name (TypeVariableType *typeVar, \
96+ TypeVariableType *otherTypeVar, \
97+ Constraint *constraint) { \
98+ Change result; \
99+ result.Kind = ChangeKind::Name; \
100+ result.BindingRelation .TypeVar = typeVar; \
101+ result.BindingRelation .OtherTypeVar = otherTypeVar; \
102+ result.BindingRelation .Constraint = constraint; \
103+ return result; \
104+ }
93105#define SCORE_CHANGE (Name ) \
94106 SolverTrail::Change \
95107 SolverTrail::Change::Name (ScoreKind kind, unsigned value) { \
@@ -306,6 +318,19 @@ SolverTrail::Change::RetiredConstraint(ConstraintList::iterator where,
306318 return result;
307319}
308320
321+ SolverTrail::Change
322+ SolverTrail::Change::RetractedBinding (TypeVariableType *typeVar,
323+ inference::PotentialBinding binding) {
324+ Change result;
325+ result.Kind = ChangeKind::RetractedBinding;
326+ result.Binding .TypeVar = typeVar;
327+ result.Binding .BindingType = binding.BindingType ;
328+ result.Binding .BindingSource = binding.BindingSource ;
329+ result.Options = unsigned (binding.Kind );
330+
331+ return result;
332+ }
333+
309334SyntacticElementTargetKey
310335SolverTrail::Change::getSyntacticElementTargetKey () const {
311336 ASSERT (Kind == ChangeKind::RecordedTarget);
@@ -359,11 +384,9 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
359384 cg.addConstraint (TheConstraint.TypeVar , TheConstraint.Constraint );
360385 break ;
361386
362- case ChangeKind::ExtendedEquivalenceClass: {
363- auto &node = cg[EquivClass.TypeVar ];
364- node.truncateEquivalenceClass (EquivClass.PrevSize );
387+ case ChangeKind::ExtendedEquivalenceClass:
388+ cg[EquivClass.TypeVar ].truncateEquivalenceClass (EquivClass.PrevSize );
365389 break ;
366- }
367390
368391 case ChangeKind::RelatedTypeVariables:
369392 cg.unrelateTypeVariables (Relation.TypeVar , Relation.OtherTypeVar );
@@ -373,9 +396,12 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
373396 cg.retractBindings (TheConstraint.TypeVar , TheConstraint.Constraint );
374397 break ;
375398
376- case ChangeKind::RetractedBindings:
377- cg.inferBindings (TheConstraint.TypeVar , TheConstraint.Constraint );
399+ case ChangeKind::RetractedBindings: {
400+ auto &bindings = cg[TheConstraint.TypeVar ].getPotentialBindings ();
401+ bool inserted = bindings.Constraints .insert (TheConstraint.Constraint );
402+ ASSERT (inserted);
378403 break ;
404+ }
379405
380406 case ChangeKind::UpdatedTypeVariable:
381407 Update.TypeVar ->getImpl ().setRawOptions (Options);
@@ -494,6 +520,45 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
494520 cs.InactiveConstraints .insert (Retiree.Where ,
495521 Retiree.Constraint );
496522 break ;
523+
524+ case ChangeKind::RetractedDelayedBy:
525+ cg[TheConstraint.TypeVar ].getPotentialBindings ()
526+ .DelayedBy .push_back (TheConstraint.Constraint );
527+ break ;
528+
529+ case ChangeKind::RetractedAdjacentVar:
530+ cg[BindingRelation.TypeVar ].getPotentialBindings ()
531+ .AdjacentVars .emplace_back (BindingRelation.OtherTypeVar ,
532+ BindingRelation.Constraint );
533+ break ;
534+
535+ case ChangeKind::RetractedSubtypeOf:
536+ cg[BindingRelation.TypeVar ].getPotentialBindings ()
537+ .SubtypeOf .emplace_back (BindingRelation.OtherTypeVar ,
538+ BindingRelation.Constraint );
539+ break ;
540+
541+ case ChangeKind::RetractedSupertypeOf:
542+ cg[BindingRelation.TypeVar ].getPotentialBindings ()
543+ .SupertypeOf .emplace_back (BindingRelation.OtherTypeVar ,
544+ BindingRelation.Constraint );
545+ break ;
546+
547+ case ChangeKind::RetractedEquivalentTo:
548+ cg[BindingRelation.TypeVar ].getPotentialBindings ()
549+ .EquivalentTo .emplace_back (BindingRelation.OtherTypeVar ,
550+ BindingRelation.Constraint );
551+ break ;
552+
553+ case ChangeKind::RetractedBinding: {
554+ PotentialBinding binding (Binding.BindingType ,
555+ AllowedBindingKind (Options),
556+ Binding.BindingSource );
557+
558+ auto &bindings = cg[BindingRelation.TypeVar ].getPotentialBindings ();
559+ bindings.Bindings .push_back (binding);
560+ break ;
561+ }
497562 }
498563}
499564
@@ -541,6 +606,17 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
541606 TheConstraint.TypeVar ->print (out, PO); \
542607 out << " )\n " ; \
543608 break ;
609+ #define BINDING_RELATION_CHANGE (Name ) \
610+ case ChangeKind::Name: \
611+ out << " (" << #Name << " " ; \
612+ BindingRelation.Constraint ->print (out, &cs.getASTContext ().SourceMgr , \
613+ indent + 2 ); \
614+ out << " on type variable " ; \
615+ BindingRelation.TypeVar ->print (out, PO); \
616+ out << " and " ; \
617+ BindingRelation.OtherTypeVar ->print (out, PO); \
618+ out << " )\n " ; \
619+ break ;
544620#define SCORE_CHANGE (Name ) \
545621 case ChangeKind::Name: \
546622 out << " (" << #Name << " " ; \
@@ -692,6 +768,14 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
692768 indent + 2 );
693769 out << " )\n " ;
694770 break ;
771+
772+ case ChangeKind::RetractedBinding:
773+ out << " (RetractedBinding " ;
774+ Binding.TypeVar ->print (out, PO);
775+ out << " with type " ;
776+ Binding.BindingType ->print (out, PO);
777+ out << " and kind " << Options << " )\n " ;
778+ break ;
695779 }
696780}
697781
0 commit comments