@@ -666,51 +666,59 @@ void PropertyMap::checkConcreteTypeRequirements() {
666666 auto concreteType = pair.first ;
667667 unsigned concreteTypeRule = pair.second ;
668668
669- // A rule (T.[concrete: C] => T) where C is a class type induces a rule
670- // (T.[superclass: C] => T).
671- if (concreteType.getConcreteType ()->getClassOrBoundGenericClass ()) {
672- auto superclassSymbol = Symbol::forSuperclass (
673- concreteType.getConcreteType (),
674- concreteType.getSubstitutions (),
675- Context);
676-
677- recordRelation (props->getKey (), concreteTypeRule,
678- superclassSymbol, System, debug);
679-
680669 // If the concrete type is not a class and we have a superclass
681670 // requirement, we have a conflict.
682- } else if (props->hasSuperclassBound ()) {
671+ if (!concreteType.getConcreteType ()->getClassOrBoundGenericClass () &&
672+ props->hasSuperclassBound ()) {
683673 const auto &req = props->getSuperclassRequirement ();
684674 for (auto pair : req.SuperclassRules ) {
685- System.recordConflict (concreteTypeRule, pair.second );
675+ if (checkRulePairOnce (concreteTypeRule, pair.second ))
676+ System.recordConflict (concreteTypeRule, pair.second );
686677 }
687678 }
688679
689- // A rule (T.[concrete: C] => T) where C is a class type induces a rule
690- // (T.[layout: L] => T), where L is either AnyObject or _NativeObject.
691- if (concreteType.getConcreteType ()->satisfiesClassConstraint ()) {
692- Type superclassType = concreteType.getConcreteType ();
693- if (!superclassType->getClassOrBoundGenericClass ())
694- superclassType = superclassType->getSuperclass ();
695-
696- auto layoutConstraint = LayoutConstraintKind::Class;
697- if (superclassType)
698- if (auto *classDecl = superclassType->getClassOrBoundGenericClass ())
699- layoutConstraint = classDecl->getLayoutConstraintKind ();
700-
701- auto layout =
702- LayoutConstraint::getLayoutConstraint (
703- layoutConstraint, Context.getASTContext ());
704- auto layoutSymbol = Symbol::forLayout (layout, Context);
680+ if (checkRuleOnce (concreteTypeRule)) {
681+ if (concreteType.getConcreteType ()->getClassOrBoundGenericClass ()) {
682+ // A rule (T.[concrete: C] => T) where C is a class type induces a rule
683+ // (T.[superclass: C] => T).
684+ auto superclassSymbol = Symbol::forSuperclass (
685+ concreteType.getConcreteType (),
686+ concreteType.getSubstitutions (),
687+ Context);
688+
689+ recordRelation (props->getKey (), concreteTypeRule,
690+ superclassSymbol, System, debug);
691+ }
705692
706- recordRelation (props->getKey (), concreteTypeRule,
707- layoutSymbol, System, debug);
693+ // A rule (T.[concrete: C] => T) where C is a class type induces a rule
694+ // (T.[layout: L] => T), where L is either AnyObject or _NativeObject.
695+ if (concreteType.getConcreteType ()->satisfiesClassConstraint ()) {
696+ Type superclassType = concreteType.getConcreteType ();
697+ if (!superclassType->getClassOrBoundGenericClass ())
698+ superclassType = superclassType->getSuperclass ();
699+
700+ auto layoutConstraint = LayoutConstraintKind::Class;
701+ if (superclassType)
702+ if (auto *classDecl = superclassType->getClassOrBoundGenericClass ())
703+ layoutConstraint = classDecl->getLayoutConstraintKind ();
704+
705+ auto layout =
706+ LayoutConstraint::getLayoutConstraint (
707+ layoutConstraint, Context.getASTContext ());
708+ auto layoutSymbol = Symbol::forLayout (layout, Context);
709+
710+ recordRelation (props->getKey (), concreteTypeRule,
711+ layoutSymbol, System, debug);
712+ }
713+ }
708714
709715 // If the concrete type does not satisfy a class layout constraint and
710716 // we have such a layout requirement, we have a conflict.
711- } else if (props->LayoutRule &&
712- props->Layout ->isClass ()) {
713- System.recordConflict (concreteTypeRule, *props->LayoutRule );
717+ if (!concreteType.getConcreteType ()->satisfiesClassConstraint () &&
718+ props->LayoutRule &&
719+ props->Layout ->isClass ()) {
720+ if (checkRulePairOnce (concreteTypeRule, *props->LayoutRule ))
721+ System.recordConflict (concreteTypeRule, *props->LayoutRule );
714722 }
715723 }
716724 }
0 commit comments