// RUN: %target-run-simple-swift | FileCheck %s
// REQUIRES: executable_test

class A {
  init() { print("a") }
  init(_ x:Int) { print("b") }
  init<T>(_ x:Int, _ y:T) { print("c") }
}

class B<T> {
  init() { print("d") }
  init(_ x:Int) { print("e") }
  init(_ x:T) { print("f") }

  init<U>(_ x:Int, _ y:U) { print("g") }
  init<U>(_ x:T, _ y:U) { print("h") }
}

protocol Runcible {}

class C<T : Runcible> {
  init() { print("i") }
  init(_ x:Int) { print("j") }
  init(_ x:T) { print("k") }
}

// CHECK: a
A()
// CHECK: b
A(1)
// CHECK: c
A(1, "2")

typealias BChar = B<UnicodeScalar>
// CHECK: d
BChar()
// CHECK: e
BChar(1)
// CHECK: f
BChar("2")
// CHECK: g
BChar(1, "2")
// CHECK: h
BChar("1", "2")

// <rdar://problem/12965934> Destructors for classes with constrained type parameters

struct Hat : Runcible {}

typealias CHat = C<Hat>
// CHECK: i
CHat()
// CHECK: j
CHat(1)
// CHECK: k
CHat(Hat())
