@@ -90,6 +90,18 @@ SolverTrail::~SolverTrail() {
90
90
result.TheConstraint .Constraint = constraint; \
91
91
return result; \
92
92
}
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
+ }
93
105
#define SCORE_CHANGE (Name ) \
94
106
SolverTrail::Change \
95
107
SolverTrail::Change::Name (ScoreKind kind, unsigned value) { \
@@ -306,6 +318,19 @@ SolverTrail::Change::RetiredConstraint(ConstraintList::iterator where,
306
318
return result;
307
319
}
308
320
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
+
309
334
SyntacticElementTargetKey
310
335
SolverTrail::Change::getSyntacticElementTargetKey () const {
311
336
ASSERT (Kind == ChangeKind::RecordedTarget);
@@ -359,11 +384,9 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
359
384
cg.addConstraint (TheConstraint.TypeVar , TheConstraint.Constraint );
360
385
break ;
361
386
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 );
365
389
break ;
366
- }
367
390
368
391
case ChangeKind::RelatedTypeVariables:
369
392
cg.unrelateTypeVariables (Relation.TypeVar , Relation.OtherTypeVar );
@@ -373,9 +396,12 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
373
396
cg.retractBindings (TheConstraint.TypeVar , TheConstraint.Constraint );
374
397
break ;
375
398
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);
378
403
break ;
404
+ }
379
405
380
406
case ChangeKind::UpdatedTypeVariable:
381
407
Update.TypeVar ->getImpl ().setRawOptions (Options);
@@ -494,6 +520,45 @@ void SolverTrail::Change::undo(ConstraintSystem &cs) const {
494
520
cs.InactiveConstraints .insert (Retiree.Where ,
495
521
Retiree.Constraint );
496
522
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
+ }
497
562
}
498
563
}
499
564
@@ -541,6 +606,17 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
541
606
TheConstraint.TypeVar ->print (out, PO); \
542
607
out << " )\n " ; \
543
608
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 ;
544
620
#define SCORE_CHANGE (Name ) \
545
621
case ChangeKind::Name: \
546
622
out << " (" << #Name << " " ; \
@@ -692,6 +768,14 @@ void SolverTrail::Change::dump(llvm::raw_ostream &out,
692
768
indent + 2 );
693
769
out << " )\n " ;
694
770
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 ;
695
779
}
696
780
}
697
781
0 commit comments