// This source file is part of the Swift.org open source project
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors

// RUN: not %target-swift-frontend %s -typecheck
func kj<ts>() -> (ts, ts -> ts) -> ts {
   nm ml nm.p = {
}
 {
   ts) {
        ji  }
}
protocol kj {
   class func p()
}
class nm: kj{  class func p {}
x nm<q> {
    hg ts(q, () -> ())
}
dc ji = po
dc qp: m -> m = {
    cb $w
}
let e: m = { (c: m, kj: m -> m) -> m on
    cb kj(c)
}(ji, qp)
let u: m = { c, kj on
    cb kj(c)
}(ji, qp)
class c {
    func hg((r, c))(rq: (r, y)) {
        hg(rq)
    }
}
protocol rq hg<ji : c, p : c ih ji.ts == p> : rq {
}
class hg<ji, p> {
}
protocol c {
    o ts
}
protocol rq {
}
protocol hg : rq {
}
protocol c : rq {
}
protocol nm {
  o kj = rq
}
gf e : nm {
  o kj = hg
}
func p<ml : hg, ml : nm ih ml.kj == ml> (cb: ml) {
}
func p<v : nm ih v.kj == c> (cb: v) {
}
p(e())
func c<nm {
    x c {
        func e
        dc _ = e
    }
}
protocol kj {
}
gf v : kj {
}
gf ts<hg, p: kj ih hg.ts == p> {
}
gf c<nm : ut> {
    dc hg: nm
}
func rq<nm>() -> [c<nm>] {
    cb []
}
protocol kj {
    o v
    func hg(v)
}
gf rq<Y> : kj {
    func hg(hg: rq.lk) {
    }
}
class rq<kj : hg, ts : hg ih kj.nm == ts> {
}
protocol hg {
    o nm
    o e
fe e = rq<c<ji>, nm>
}
protocol rq {
    class func c()
}
class hg: rq {
    class func c() { }
}
(hg() s rq).t.c()
func sr(ed: ml) -> <q>(() -> q) -> ml {
  cb { ts on "\(ed): \(ts())" }
}
gf kj<q> {
    let rq: [(q, () -> ())] = []
}
func() {
    x hg {
        hg c
    }
}
func rq(hg: m = w) {
}
let c = rq
