// RUN: %target-swift-frontend %s -emit-ir public protocol ObservableType { associatedtype E } public protocol SubjectType : ObservableType { associatedtype SubjectObserverType : ObserverType } extension ObservableType { public func multicast(_ subject: S) -> Observable { while true {} } } extension ObservableType { public func publish() -> Observable { return self.multicast(PublishSubject()) } } public class Observable : ObservableType { public typealias E = Element } public protocol ObserverType { associatedtype E } public final class PublishSubject : Observable, SubjectType, ObserverType { public typealias SubjectObserverType = PublishSubject }