// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_1 | %FileCheck %s -check-prefix=ASSIGN_1
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_2 | %FileCheck %s -check-prefix=ASSIGN_2
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_3 | %FileCheck %s -check-prefix=ASSIGN_3
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_4 | %FileCheck %s -check-prefix=ASSIGN_4
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_5 | %FileCheck %s -check-prefix=ASSIGN_5
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_6 | %FileCheck %s -check-prefix=ASSIGN_6

// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_7 | %FileCheck %s -check-prefix=ASSIGN_7
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_8 | %FileCheck %s -check-prefix=ASSIGN_8
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_9 | %FileCheck %s -check-prefix=ASSIGN_9
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_10 | %FileCheck %s -check-prefix=ASSIGN_10
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_11 | %FileCheck %s -check-prefix=ASSIGN_11
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_12 | %FileCheck %s -check-prefix=ASSIGN_12

// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_13 | %FileCheck %s -check-prefix=ASSIGN_13
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_14 | %FileCheck %s -check-prefix=ASSIGN_14
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_15 | %FileCheck %s -check-prefix=ASSIGN_15
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_16 | %FileCheck %s -check-prefix=ASSIGN_16
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_17 | %FileCheck %s -check-prefix=ASSIGN_17
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_18 | %FileCheck %s -check-prefix=ASSIGN_18
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ASSIGN_19 | %FileCheck %s -check-prefix=ASSIGN_19

class C1 {
var I1 = 1
var I2 = 3
var IO1 : Int?

var S1 = ""
var S2 = ""
var SO1 : String?

enum D1 {
  case case1
  case case2
}
enum D2 {
  case case3
  case case4
}

func IntGenerator() -> Int {
  return 0
}

func IntOpGenerator() -> Int? {
  return 0
}

func StringGenerator() -> String {
  return ""
}

func StringOpGenerator() -> String? {
  return ""
}

func VoidGen() {}

class C2 {
  func IntGen() -> Int { return 1 }
  func IntOpGen() -> Int? { return 1 }
  func D1Gen() -> D1 { return D1.case1 }
  func D2Gen() -> D2 { return D2.case3 }
  func VoidGen() {}
  var InternalC2 = C2()
}

func C2Gen() -> C2 { return C2() }

func f1() {
	var I3 : Int
	I3 = #^ASSIGN_1^#
}

// ASSIGN_1-DAG: Decl[LocalVar]/Local/TypeRelation[Convertible]:               	I3[#Int#]; name=I3
// ASSIGN_1-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:      	I1[#Int#]; name=I1
// ASSIGN_1-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:      	I2[#Int#]; name=I2
// ASSIGN_1-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]:   	IntGenerator()[#Int#]; name=IntGenerator()
// ASSIGN_1-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: 			VoidGen()[#Void#]; name=VoidGen()
// ASSIGN_1-DAG: Decl[InstanceVar]/CurrNominal:                               S1[#String#]; name=S1

func f2() {
	var I3 : Int?
	I3 = #^ASSIGN_2^#
}

// ASSIGN_2-DAG: Decl[LocalVar]/Local/TypeRelation[Convertible]:               		I3[#Int?#]; name=I3
// ASSIGN_2-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:      	I1[#Int#]; name=I1
// ASSIGN_2-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:      	I2[#Int#]; name=I2
// ASSIGN_2-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:      		IO1[#Int?#]; name=IO1
// ASSIGN_2-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]:   	IntGenerator()[#Int#]; name=IntGenerator()
// ASSIGN_2-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]:      IntOpGenerator()[#Int?#]; name=IntOpGenerator()
// ASSIGN_2-DAG: Decl[InstanceVar]/CurrNominal:                                 S1[#String#]; name=S1

	func f3() {
		var S3 = ""
		S3 = #^ASSIGN_3^#
	}

// ASSIGN_3-DAG: Decl[LocalVar]/Local/TypeRelation[Convertible]:                S3[#String#]; name=S3
// ASSIGN_3-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:       S1[#String#]; name=S1
// ASSIGN_3-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:       S2[#String#]; name=S2
// ASSIGN_3-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]:    StringGenerator()[#String#]; name=StringGenerator()
// ASSIGN_3-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]:      VoidGen()[#Void#]; name=VoidGen()
// ASSIGN_3-DAG: Decl[InstanceVar]/CurrNominal:                               I1[#Int#]; name=I1

	func f4() {
		var S4 : String?
		S4 = #^ASSIGN_4^#
	}

// ASSIGN_4-DAG: Decl[LocalVar]/Local/TypeRelation[Convertible]:                S4[#String?#]; name=S4
// ASSIGN_4-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:     S1[#String#]; name=S1
// ASSIGN_4-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:     S2[#String#]; name=S2
// ASSIGN_4-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:       SO1[#String?#]; name=SO1
// ASSIGN_4-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]:  StringGenerator()[#String#]; name=StringGenerator()
// ASSIGN_4-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]:    StringOpGenerator()[#String?#]; name=StringOpGenerator()
// ASSIGN_4-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]:      VoidGen()[#Void#]; name=VoidGen()
// ASSIGN_4-DAG: Decl[InstanceVar]/CurrNominal:                               I1[#Int#]; name=I1

	func f5() {
	  var d : D1
	  d = .#^ASSIGN_5^#
	}

// ASSIGN_5: Begin completions, 3 items
// ASSIGN_5-DAG: Decl[EnumElement]/CurrNominal/Flair[ExprSpecific]/TypeRelation[Convertible]:     case2[#D1#]; name=case2
// ASSIGN_5-DAG: Decl[EnumElement]/CurrNominal/Flair[ExprSpecific]/TypeRelation[Convertible]:     case1[#D1#]; name=case1
// ASSIGN_5-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]:     hash({#(self): D1#})[#(into: inout Hasher) -> Void#]; name=hash(:)

	func f6() {
	  var d : D2
	  d = .#^ASSIGN_6^#
	}
// ASSIGN_6: Begin completions, 3 items
// ASSIGN_6-DAG: Decl[EnumElement]/CurrNominal/Flair[ExprSpecific]/TypeRelation[Convertible]:     case3[#D2#]; name=case3
// ASSIGN_6-DAG: Decl[EnumElement]/CurrNominal/Flair[ExprSpecific]/TypeRelation[Convertible]:     case4[#D2#]; name=case4
// ASSIGN_6-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]:     hash({#(self): D2#})[#(into: inout Hasher) -> Void#]; name=hash(:)

  func f7 (C : C2) {
    var i : Int
    i = C.#^ASSIGN_7^#
  }

// ASSIGN_7-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: IntGen()[#Int#]
// ASSIGN_7-DAG: Decl[InstanceMethod]/CurrNominal:   IntOpGen()[#Int?#]
// ASSIGN_7-DAG: Decl[InstanceMethod]/CurrNominal:   D1Gen()[#D1#]
// ASSIGN_7-DAG: Decl[InstanceMethod]/CurrNominal:   D2Gen()[#D2#]
// ASSIGN_7-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: VoidGen()[#Void#]
// ASSIGN_7-DAG: Decl[InstanceVar]/CurrNominal:      InternalC2[#C2#]

  func f8 (C : C2) {
    var i : Int?
    i = C.#^ASSIGN_8^#
  }

// ASSIGN_8-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: IntGen()[#Int#]
// ASSIGN_8-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: IntOpGen()[#Int?#]
// ASSIGN_8-DAG: Decl[InstanceMethod]/CurrNominal:   D1Gen()[#D1#]
// ASSIGN_8-DAG: Decl[InstanceMethod]/CurrNominal:   D2Gen()[#D2#]
// ASSIGN_8-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: VoidGen()[#Void#]
// ASSIGN_8-DAG: Decl[InstanceVar]/CurrNominal:      InternalC2[#C2#]

  func f9 (C : C2) {
    var d : D1
    d = C.#^ASSIGN_9^#
  }

// ASSIGN_9-DAG: Decl[InstanceMethod]/CurrNominal:   IntGen()[#Int#]
// ASSIGN_9-DAG: Decl[InstanceMethod]/CurrNominal:   IntOpGen()[#Int?#]
// ASSIGN_9-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: D1Gen()[#D1#]
// ASSIGN_9-DAG: Decl[InstanceMethod]/CurrNominal:   D2Gen()[#D2#]
// ASSIGN_9-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: VoidGen()[#Void#]
// ASSIGN_9-DAG: Decl[InstanceVar]/CurrNominal:      InternalC2[#C2#]

  func f10 (C : C2) {
    var d : D1
    d = C.InternalC2.#^ASSIGN_10^#
  }

// ASSIGN_10-DAG: Decl[InstanceMethod]/CurrNominal:   IntGen()[#Int#]
// ASSIGN_10-DAG: Decl[InstanceMethod]/CurrNominal:   IntOpGen()[#Int?#]
// ASSIGN_10-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: D1Gen()[#D1#]
// ASSIGN_10-DAG: Decl[InstanceMethod]/CurrNominal:   D2Gen()[#D2#]
// ASSIGN_10-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: VoidGen()[#Void#]
// ASSIGN_10-DAG: Decl[InstanceVar]/CurrNominal:      InternalC2[#C2#]

  func f11(C: C2) {
    d = C.#^ASSIGN_11^#
  }

// ASSIGN_11-DAG: Decl[InstanceMethod]/CurrNominal:   IntGen()[#Int#]
// ASSIGN_11-DAG: Decl[InstanceMethod]/CurrNominal:   IntOpGen()[#Int?#]
// ASSIGN_11-DAG: Decl[InstanceMethod]/CurrNominal:   D1Gen()[#D1#]
// ASSIGN_11-DAG: Decl[InstanceMethod]/CurrNominal:   D2Gen()[#D2#]
// ASSIGN_11-DAG: Decl[InstanceMethod]/CurrNominal:   VoidGen()[#Void#]
// ASSIGN_11-DAG: Decl[InstanceVar]/CurrNominal:      InternalC2[#C2#]

  func f12() {
    var i : Int
    i = C2Gen().#^ASSIGN_12^#
  }

// ASSIGN_12-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: IntGen()[#Int#]
// ASSIGN_12-DAG: Decl[InstanceMethod]/CurrNominal:   IntOpGen()[#Int?#]
// ASSIGN_12-DAG: Decl[InstanceMethod]/CurrNominal:   D1Gen()[#D1#]
// ASSIGN_12-DAG: Decl[InstanceMethod]/CurrNominal:   D2Gen()[#D2#]
// ASSIGN_12-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: VoidGen()[#Void#]
// ASSIGN_12-DAG: Decl[InstanceVar]/CurrNominal:      InternalC2[#C2#]

  func f13() {
    var i : Int = #^ASSIGN_13^#
  }
// ASSIGN_13-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:       I1[#Int#]; name=I1
// ASSIGN_13-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:       I2[#Int#]; name=I2
// ASSIGN_13-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]:    IntGenerator()[#Int#]; name=IntGenerator()
// ASSIGN_13-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]:      VoidGen()[#Void#]; name=VoidGen()
// ASSIGN_13-DAG: Decl[InstanceVar]/CurrNominal:                               S1[#String#]; name=S1

  func f14() {
    let i : Int? = #^ASSIGN_14^#
  }

// ASSIGN_14-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:       I1[#Int#]; name=I1
// ASSIGN_14-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:       I2[#Int#]; name=I2
// ASSIGN_14-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Convertible]:         IO1[#Int?#]; name=IO1
// ASSIGN_14-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]:    IntGenerator()[#Int#]; name=IntGenerator()
// ASSIGN_14-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]:      IntOpGenerator()[#Int?#]; name=IntOpGenerator()
// ASSIGN_14-DAG: Decl[InstanceVar]/CurrNominal:                                 S1[#String#]; name=S1

  func f15() {
    let i = #^ASSIGN_15^#
  }
// ASSIGN_15-NOT: TypeRelation

  func f16 (C : C2) {
    var d : D1 = C.InternalC2.#^ASSIGN_16^#
  }

// ASSIGN_16-DAG: Decl[InstanceMethod]/CurrNominal:   IntGen()[#Int#]
// ASSIGN_16-DAG: Decl[InstanceMethod]/CurrNominal:   IntOpGen()[#Int?#]
// ASSIGN_16-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: D1Gen()[#D1#]
// ASSIGN_16-DAG: Decl[InstanceMethod]/CurrNominal:   D2Gen()[#D2#]
// ASSIGN_16-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: VoidGen()[#Void#]
// ASSIGN_16-DAG: Decl[InstanceVar]/CurrNominal:      InternalC2[#C2#]

  func f17() {
    var i : Int = C2Gen().#^ASSIGN_17^#
  }

// ASSIGN_17-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: IntGen()[#Int#]
// ASSIGN_17-DAG: Decl[InstanceMethod]/CurrNominal:   IntOpGen()[#Int?#]
// ASSIGN_17-DAG: Decl[InstanceMethod]/CurrNominal:   D1Gen()[#D1#]
// ASSIGN_17-DAG: Decl[InstanceMethod]/CurrNominal:   D2Gen()[#D2#]
// ASSIGN_17-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: VoidGen()[#Void#]
// ASSIGN_17-DAG: Decl[InstanceVar]/CurrNominal:      InternalC2[#C2#]

  func f18 (C : C2) {
    var d : D1 = C.#^ASSIGN_18^#
  }

// ASSIGN_18-DAG: Decl[InstanceMethod]/CurrNominal:   IntGen()[#Int#]
// ASSIGN_18-DAG: Decl[InstanceMethod]/CurrNominal:   IntOpGen()[#Int?#]
// ASSIGN_18-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Convertible]: D1Gen()[#D1#]
// ASSIGN_18-DAG: Decl[InstanceMethod]/CurrNominal:   D2Gen()[#D2#]
// ASSIGN_18-DAG: Decl[InstanceMethod]/CurrNominal/TypeRelation[Invalid]: VoidGen()[#Void#]
// ASSIGN_18-DAG: Decl[InstanceVar]/CurrNominal:      InternalC2[#C2#]
}


class Test19 {
  func test() {
    let t = true
    prop = #^ASSIGN_19^#
  }
  var prop: Bool
}
// rdar://23111219
// ASSIGN_19: Decl[LocalVar]/Local/TypeRelation[Convertible]: t[#Bool#]
