@@ -3173,7 +3173,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
31733173 TAD ->getUnderlyingTypeLoc ().setInvalidType (TC .Context );
31743174 } else if (TAD ->getDeclContext ()->isGenericContext ()) {
31753175 TAD ->setInterfaceType (
3176- TC .getInterfaceTypeFromInternalType (TAD ->getDeclContext (),
3176+ TC .getInterfaceTypeFromInternalType (TAD ->getDeclContext (),
31773177 TAD ->getType ()));
31783178 }
31793179
@@ -3192,6 +3192,19 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
31923192 }
31933193
31943194 void visitAssociatedTypeDecl (AssociatedTypeDecl *assocType) {
3195+ if (assocType->isBeingTypeChecked ()) {
3196+
3197+ if (!assocType->hasType ()) {
3198+ assocType->setInvalid ();
3199+ assocType->overwriteType (ErrorType::get (TC .Context ));
3200+ }
3201+
3202+ TC .diagnose (assocType->getLoc (), diag::circular_type_alias, assocType->getName ());
3203+ return ;
3204+ }
3205+
3206+ assocType->setIsBeingTypeChecked ();
3207+
31953208 TC .checkDeclAttributesEarly (assocType);
31963209 if (!assocType->hasAccessibility ())
31973210 assocType->setAccessibility (assocType->getProtocol ()->getFormalAccess ());
@@ -3205,6 +3218,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
32053218 defaultDefinition.setInvalidType (TC .Context );
32063219 }
32073220 TC .checkDeclAttributes (assocType);
3221+
3222+ assocType->setIsBeingTypeChecked (false );
32083223 }
32093224
32103225 bool checkUnsupportedNestedGeneric (NominalTypeDecl *NTD ) {
0 commit comments