diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index 30b3ee134ebf2..773aca7a2e8a7 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -3059,8 +3059,8 @@ operator()(SubstitutableType *maybeOpaqueType) const { })) return maybeOpaqueType; - // If the type still contains opaque types, recur. - if (substTy->hasOpaqueArchetype()) { + // If the type changed, but still contains opaque types, recur. + if (!substTy->isEqual(maybeOpaqueType) && substTy->hasOpaqueArchetype()) { return ::substOpaqueTypesWithUnderlyingTypes( substTy, inContext, contextExpansion, isContextWholeModule); } diff --git a/test/SILGen/Inputs/replace_opaque_type_public_assoc_type_m.swift b/test/SILGen/Inputs/replace_opaque_type_public_assoc_type_m.swift new file mode 100644 index 0000000000000..c2120db7cb831 --- /dev/null +++ b/test/SILGen/Inputs/replace_opaque_type_public_assoc_type_m.swift @@ -0,0 +1,11 @@ +public protocol Gesture { + associatedtype Body: Gesture + var body: Body { get } + + associatedtype Value + var value: Value { get } +} + +extension Gesture { + public var value: Body.Value { return body.value } +} diff --git a/test/SILGen/replace_opaque_type_public_assoc_type.swift b/test/SILGen/replace_opaque_type_public_assoc_type.swift new file mode 100644 index 0000000000000..c256b3237748c --- /dev/null +++ b/test/SILGen/replace_opaque_type_public_assoc_type.swift @@ -0,0 +1,14 @@ +// RUN: %empty-directory(%t) +// RUN: %target-swift-frontend -disable-availability-checking -emit-module-path %t/replace_opaque_type_public_assoc_type_m.swiftmodule %S/Inputs/replace_opaque_type_public_assoc_type_m.swift +// RUN: %target-swift-emit-silgen -disable-availability-checking -I %t %s -verify + +import replace_opaque_type_public_assoc_type_m + +struct PiggyBack: Gesture { + var action: () -> Void + + var body: some Gesture { + action() + return self + } +}