@@ -666,51 +666,59 @@ void PropertyMap::checkConcreteTypeRequirements() {
666
666
auto concreteType = pair.first ;
667
667
unsigned concreteTypeRule = pair.second ;
668
668
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
-
680
669
// If the concrete type is not a class and we have a superclass
681
670
// requirement, we have a conflict.
682
- } else if (props->hasSuperclassBound ()) {
671
+ if (!concreteType.getConcreteType ()->getClassOrBoundGenericClass () &&
672
+ props->hasSuperclassBound ()) {
683
673
const auto &req = props->getSuperclassRequirement ();
684
674
for (auto pair : req.SuperclassRules ) {
685
- System.recordConflict (concreteTypeRule, pair.second );
675
+ if (checkRulePairOnce (concreteTypeRule, pair.second ))
676
+ System.recordConflict (concreteTypeRule, pair.second );
686
677
}
687
678
}
688
679
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
+ }
705
692
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
+ }
708
714
709
715
// If the concrete type does not satisfy a class layout constraint and
710
716
// 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 );
714
722
}
715
723
}
716
724
}
0 commit comments