 	}
 }
 
-extension SignalProducer where Error == AnyError {
+// FIXME: SWIFT_COMPILER_ISSUE
+//
+// One of the `SignalProducer.attempt` overloads is kept in the protocol to
+// mitigate an overloading issue. Moving them back to the concrete type would be
+// a binary-breaking, source-compatible change.
+
+extension SignalProducerProtocol where Error == AnyError {
 	/// Create a `SignalProducer` that will attempt the given failable operation once for
 	/// each invocation of `start()`.
 	///

	/// - returns: A producer that sends events from `self` and then from
	///            `replacement` when `self` completes.
	public func then<U>(_ replacement: SignalProducer<U, NoError>) -> SignalProducer<U, Error> {
		return self.then(replacement.promoteErrors(Error.self))
	}

	/// Start the producer, then block, waiting for the first value.
	///
	/// When a single value or error is sent, the returned `Result` will

	/// - returns: A `SignalProducer` that will forward `success`ful `result` as
	///            `value` event and then complete or `failed` event if `result`
	///            is a `failure`.
	public static func attempt(_ operation: @escaping () -> Result<Value, Error>) -> SignalProducer<Value, Error> {
		return SignalProducer<Value, Error> { observer, disposable in
			operation().analysis(ifSuccess: { value in
				observer.send(value: value)
				observer.sendCompleted()
