diff --git a/lib/Sema/TypeCheckGeneric.cpp b/lib/Sema/TypeCheckGeneric.cpp index 9feb689a74511..5763586508785 100644 --- a/lib/Sema/TypeCheckGeneric.cpp +++ b/lib/Sema/TypeCheckGeneric.cpp @@ -203,9 +203,28 @@ Type CompleteGenericTypeResolver::resolveDependentMemberType( concrete->getDeclContext() ->getAsProtocolOrProtocolExtensionContext()) { tc.validateDecl(proto); - auto subMap = SubstitutionMap::getProtocolSubstitutions( - proto, baseTy, ProtocolConformanceRef(proto)); - return concrete->getDeclaredInterfaceType().subst(subMap); + Type depTy = DependentMemberType::get(baseTy, concrete->getName()); + + auto memberEquivClass = + builder.resolveEquivalenceClass( + depTy, + ArchetypeResolutionKind::CompleteWellFormed); + if (memberEquivClass->concreteType) { + return memberEquivClass->concreteType.transformRec( + [&](TypeBase *type) -> Optional { + if (auto gp = dyn_cast(type)) { + auto genericParams = genericSig->getGenericParams(); + unsigned index = + GenericParamKey(gp).findIndexIn(genericParams); + return Type(genericParams[index]); + } + + return None; + }); + } + + return memberEquivClass->getAnchor(builder, + genericSig->getGenericParams()); } if (auto superclass = baseEquivClass->superclass) { diff --git a/test/decl/typealias/protocol.swift b/test/decl/typealias/protocol.swift index 856863a431acc..e625f2366577c 100644 --- a/test/decl/typealias/protocol.swift +++ b/test/decl/typealias/protocol.swift @@ -245,3 +245,10 @@ struct CandyEdible : Edible { // Edible.Snack is witnessed by 'typealias Snack' inside the // constrained extension of CandyWrapper above extension CandyBar : Edible {} + +protocol P9 { + typealias A = Int +} + +func testT9a(_: T, _: U) where T.A == U { } +func testT9b(_: T) where T.A == Float { } // expected-error{{'T.A' cannot be equal to both 'Float' and 'P9.A' (aka 'Int')}}