diff --git a/lib/Sema/OpenedExistentials.cpp b/lib/Sema/OpenedExistentials.cpp index b1d7a76c9a5b0..0ca3de042be3b 100644 --- a/lib/Sema/OpenedExistentials.cpp +++ b/lib/Sema/OpenedExistentials.cpp @@ -315,7 +315,8 @@ findGenericParameterReferencesRec(CanGenericSignature genericSig, return GenericParameterReferenceInfo(); } - if (auto reducedTy = genericSig.getReducedType(type)) { + auto reducedTy = genericSig.getReducedType(type); + if (reducedTy && !reducedTy->is()) { if (!reducedTy->isEqual(type)) { // Note: origParam becomes openedParam for the recursive call, // because concreteTy is written in terms of genericSig and not diff --git a/test/decl/protocol/existential_member_access/invalid_type_parameter.swift b/test/decl/protocol/existential_member_access/invalid_type_parameter.swift new file mode 100644 index 0000000000000..3e9ddc74a68d3 --- /dev/null +++ b/test/decl/protocol/existential_member_access/invalid_type_parameter.swift @@ -0,0 +1,27 @@ +// RUN: %target-typecheck-verify-swift -target %target-swift-5.9-abi-triple + +// https://github.com/swiftlang/swift/issues/77840 +do { + struct G {} + + protocol P { + associatedtype A where A == Undefined + // expected-error@-1 {{cannot find type 'Undefined' in scope}} + associatedtype B where B == G + // expected-error@-1 {{cannot find type 'Undefined' in scope}} + + func fooTakesA(_: A) + func fooTakesB(_: B) + + func fooReturnsA() -> A + func fooReturnsB() -> B + } + + let p: any P + let _ = p.fooTakesA + // expected-error@-1 {{member 'fooTakesA' cannot be used on value of type 'any P'; consider using a generic constraint instead}} + let _ = p.fooTakesB + // expected-error@-1 {{member 'fooTakesB' cannot be used on value of type 'any P'; consider using a generic constraint instead}} + let _ = p.fooReturnsA() + let _ = p.fooReturnsB() +}