@@ -443,6 +443,8 @@ void RewritePathEvaluator::applyConcreteTypeWitness(const RewriteStep &step,
443443 llvm::errs () << " Conformance: " << witness.ConcreteConformance << " \n " ;
444444 llvm::errs () << " Assoc type: " << witness.AssocType << " \n " ;
445445 llvm::errs () << " Concrete type: " << witness.ConcreteType << " \n " ;
446+ llvm::errs () << " End offset: " << step.EndOffset << " \n " ;
447+ llvm::errs () << " Inverse: " << step.Inverse << " \n " ;
446448 abort ();
447449 };
448450
@@ -496,7 +498,7 @@ void RewritePathEvaluator::applySameTypeWitness(const RewriteStep &step,
496498
497499 const auto &witness = system.getConcreteTypeWitness (step.RuleID );
498500 auto fail = [&]() {
499- llvm::errs () << " Bad concrete type witness term:\n " ;
501+ llvm::errs () << " Bad same- type witness term:\n " ;
500502 llvm::errs () << term << " \n\n " ;
501503 llvm::errs () << " Conformance: " << witness.ConcreteConformance << " \n " ;
502504 llvm::errs () << " Assoc type: " << witness.AssocType << " \n " ;
@@ -505,26 +507,30 @@ void RewritePathEvaluator::applySameTypeWitness(const RewriteStep &step,
505507 };
506508
507509#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 ()) {
512512 fail ();
513513 }
514514#endif
515515
516+ auto witnessConcreteType = Symbol::forConcreteType (
517+ witness.ConcreteConformance .getConcreteType (),
518+ witness.ConcreteConformance .getSubstitutions (),
519+ system.getRewriteContext ());
520+
516521 if (!step.Inverse ) {
517522 // Make sure the term takes the following form, where |V| == EndOffset:
518523 //
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) {
523529 fail ();
524530 }
525531
526532 // 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 );
528534
529535 // Add the subterm V, to get U.[concrete: C : P].V.
530536 newTerm.append (term.end () - step.EndOffset , term.end ());
@@ -545,9 +551,12 @@ void RewritePathEvaluator::applySameTypeWitness(const RewriteStep &step,
545551 // Add the symbol [P:X].
546552 newTerm.add (witness.AssocType );
547553
554+ // Add the symbol [concrete: C].
555+ newTerm.add (witnessConcreteType);
556+
548557 // Add the subterm V, to get
549558 //
550- // U.[concrete: C : P].[P:X].V
559+ // U.[concrete: C : P].[P:X].[concrete: C]. V
551560 newTerm.append (term.end () - step.EndOffset , term.end ());
552561
553562 term = newTerm;
0 commit comments