@@ -443,6 +443,8 @@ void RewritePathEvaluator::applyConcreteTypeWitness(const RewriteStep &step,
443
443
llvm::errs () << " Conformance: " << witness.ConcreteConformance << " \n " ;
444
444
llvm::errs () << " Assoc type: " << witness.AssocType << " \n " ;
445
445
llvm::errs () << " Concrete type: " << witness.ConcreteType << " \n " ;
446
+ llvm::errs () << " End offset: " << step.EndOffset << " \n " ;
447
+ llvm::errs () << " Inverse: " << step.Inverse << " \n " ;
446
448
abort ();
447
449
};
448
450
@@ -496,7 +498,7 @@ void RewritePathEvaluator::applySameTypeWitness(const RewriteStep &step,
496
498
497
499
const auto &witness = system.getConcreteTypeWitness (step.RuleID );
498
500
auto fail = [&]() {
499
- llvm::errs () << " Bad concrete type witness term:\n " ;
501
+ llvm::errs () << " Bad same- type witness term:\n " ;
500
502
llvm::errs () << term << " \n\n " ;
501
503
llvm::errs () << " Conformance: " << witness.ConcreteConformance << " \n " ;
502
504
llvm::errs () << " Assoc type: " << witness.AssocType << " \n " ;
@@ -505,26 +507,30 @@ void RewritePathEvaluator::applySameTypeWitness(const RewriteStep &step,
505
507
};
506
508
507
509
#ifndef NDEBUG
508
- if ((witness.ConcreteType .getConcreteType () !=
509
- witness.ConcreteConformance .getConcreteType ()) ||
510
- (witness.ConcreteType .getSubstitutions () !=
511
- witness.ConcreteConformance .getSubstitutions ())) {
510
+ if (witness.ConcreteType .getConcreteType () !=
511
+ witness.ConcreteConformance .getConcreteType ()) {
512
512
fail ();
513
513
}
514
514
#endif
515
515
516
+ auto witnessConcreteType = Symbol::forConcreteType (
517
+ witness.ConcreteConformance .getConcreteType (),
518
+ witness.ConcreteConformance .getSubstitutions (),
519
+ system.getRewriteContext ());
520
+
516
521
if (!step.Inverse ) {
517
522
// Make sure the term takes the following form, where |V| == EndOffset:
518
523
//
519
- // U.[concrete: C : P].[P:X].V
520
- if (term.size () <= step.EndOffset + 2 ||
521
- *(term.end () - step.EndOffset - 2 ) != witness.ConcreteConformance ||
522
- *(term.end () - step.EndOffset - 1 ) != witness.AssocType ) {
524
+ // U.[concrete: C : P].[P:X].[concrete: C].V
525
+ if (term.size () <= step.EndOffset + 3 ||
526
+ *(term.end () - step.EndOffset - 3 ) != witness.ConcreteConformance ||
527
+ *(term.end () - step.EndOffset - 2 ) != witness.AssocType ||
528
+ *(term.end () - step.EndOffset - 1 ) != witnessConcreteType) {
523
529
fail ();
524
530
}
525
531
526
532
// Get the subterm U.[concrete: C : P].
527
- MutableTerm newTerm (term.begin (), term.end () - step.EndOffset - 1 );
533
+ MutableTerm newTerm (term.begin (), term.end () - step.EndOffset - 2 );
528
534
529
535
// Add the subterm V, to get U.[concrete: C : P].V.
530
536
newTerm.append (term.end () - step.EndOffset , term.end ());
@@ -545,9 +551,12 @@ void RewritePathEvaluator::applySameTypeWitness(const RewriteStep &step,
545
551
// Add the symbol [P:X].
546
552
newTerm.add (witness.AssocType );
547
553
554
+ // Add the symbol [concrete: C].
555
+ newTerm.add (witnessConcreteType);
556
+
548
557
// Add the subterm V, to get
549
558
//
550
- // U.[concrete: C : P].[P:X].V
559
+ // U.[concrete: C : P].[P:X].[concrete: C]. V
551
560
newTerm.append (term.end () - step.EndOffset , term.end ());
552
561
553
562
term = newTerm;
0 commit comments