@@ -56,8 +56,33 @@ void ConstraintSystem::PotentialBindings::inferTransitiveBindings(
5656
5757 auto &bindings = relatedBindings->getSecond ();
5858
59- // Infer transitive protocol requirements.
60- llvm::copy (bindings.Protocols , std::back_inserter (Protocols));
59+ // FIXME: This is a workaround necessary because solver doesn't filter
60+ // bindings based on protocol requirements placed on a type variable.
61+ //
62+ // Forward propagate (subtype -> supertype) only literal conformance
63+ // requirements since that helps solver to infer more types at
64+ // parameter positions.
65+ //
66+ // \code
67+ // func foo<T: ExpressibleByStringLiteral>(_: String, _: T) -> T {
68+ // fatalError()
69+ // }
70+ //
71+ // func bar(_: Any?) {}
72+ //
73+ // func test() {
74+ // bar(foo("", ""))
75+ // }
76+ // \endcode
77+ //
78+ // If one of the literal arguments doesn't propagate its
79+ // `ExpressibleByStringLiteral` conformance, we'd end up picking
80+ // `T` with only one type `Any?` which is incorrect.
81+ llvm::copy_if (bindings.Protocols , std::back_inserter (Protocols),
82+ [](const Constraint *protocol) {
83+ return protocol->getKind () ==
84+ ConstraintKind::LiteralConformsTo;
85+ });
6186
6287 // Infer transitive defaults.
6388 llvm::copy (bindings.Defaults , std::back_inserter (Defaults));
@@ -906,15 +931,7 @@ bool ConstraintSystem::PotentialBindings::infer(
906931
907932 case ConstraintKind::ConformsTo:
908933 case ConstraintKind::SelfObjectOfProtocol:
909- // Swift 3 allowed the use of default types for normal conformances
910- // to expressible-by-literal protocols.
911- if (cs.getASTContext ().LangOpts .EffectiveLanguageVersion [0 ] >= 4 )
912- return false ;
913-
914- if (!constraint->getSecondType ()->is <ProtocolType>())
915- return false ;
916-
917- LLVM_FALLTHROUGH;
934+ return false ;
918935
919936 case ConstraintKind::LiteralConformsTo: {
920937 // Record constraint where protocol requirement originated
0 commit comments