@@ -549,14 +549,21 @@ void RewriteSystem::verifyRewriteRules(ValidityPolicy policy) const {
549549
550550 if (index != lhs.size () - 1 ) {
551551 ASSERT_RULE (symbol.getKind () != Symbol::Kind::Layout);
552- ASSERT_RULE (!symbol.hasSubstitutions ());
552+ ASSERT_RULE (symbol.getKind () != Symbol::Kind::Superclass);
553+ ASSERT_RULE (symbol.getKind () != Symbol::Kind::ConcreteType);
554+ }
555+
556+ if (!rule.isLHSSimplified () &&
557+ index != lhs.size () - 1 ) {
558+ ASSERT_RULE (symbol.getKind () != Symbol::Kind::ConcreteConformance);
553559 }
554560
555561 if (index != 0 ) {
556562 ASSERT_RULE (symbol.getKind () != Symbol::Kind::GenericParam);
557563 }
558564
559- if (index != 0 && index != lhs.size () - 1 ) {
565+ if (!rule.isLHSSimplified () &&
566+ index != 0 && index != lhs.size () - 1 ) {
560567 ASSERT_RULE (symbol.getKind () != Symbol::Kind::Protocol);
561568 }
562569 }
@@ -585,13 +592,29 @@ void RewriteSystem::verifyRewriteRules(ValidityPolicy policy) const {
585592 }
586593
587594 ASSERT_RULE (symbol.getKind () != Symbol::Kind::Layout);
588- ASSERT_RULE (!symbol.hasSubstitutions ());
595+ ASSERT_RULE (symbol.getKind () != Symbol::Kind::Superclass);
596+ ASSERT_RULE (symbol.getKind () != Symbol::Kind::ConcreteType);
597+
598+ // Completion can introduce a rule of the form
599+ //
600+ // (T.[P] => T.[concrete: C : P])
601+ //
602+ // Such rules are immediately simplified away. Otherwise, we should
603+ // never see a symbol with substitutions (concrete type, superclass,
604+ // concrete conformance) on the right hand side of a rule.
605+ if (!(rule.isRHSSimplified () &&
606+ index == rhs.size () - 1 )) {
607+ ASSERT_RULE (symbol.getKind () != Symbol::Kind::Superclass);
608+ ASSERT_RULE (symbol.getKind () != Symbol::Kind::ConcreteType);
609+ ASSERT_RULE (symbol.getKind () != Symbol::Kind::ConcreteConformance);
610+ }
589611
590612 if (index != 0 ) {
591613 ASSERT_RULE (symbol.getKind () != Symbol::Kind::GenericParam);
592614 }
593615
594- if (index != 0 && !rule.isRHSSimplified ()) {
616+ if (!rule.isRHSSimplified () &&
617+ index != 0 ) {
595618 ASSERT_RULE (symbol.getKind () != Symbol::Kind::Protocol);
596619 }
597620 }
0 commit comments