// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// comparisons

package expr2

func _bool() {
	const t = true == true
	const f = true == false
	_ = t /* ERROR "cannot compare" */ < f
	_ = 0 /* ERROR "cannot convert" */ == t
	var b bool
	var x, y float32
	b = x < y
	_ = b
	_ = struct{b bool}{x < y}
}

// corner cases
var (
	v0 = nil /* ERROR "cannot compare" */ == nil
)

func arrays() {
	// basics
	var a, b [10]int
	_ = a == b
	_ = a != b
	_ = a /* ERROR < not defined */ < b
	_ = a == nil /* ERROR cannot convert */

	type C [10]int
	var c C
	_ = a == c

	type D [10]int
	var d D
	_ = c /* ERROR mismatched types */ == d

	var e [10]func() int
	_ = e /* ERROR == not defined */ == e
}

func structs() {
	// basics
	var s, t struct {
		x int
		a [10]float32
		_ bool
	}
	_ = s == t
	_ = s != t
	_ = s /* ERROR < not defined */ < t
	_ = s == nil /* ERROR cannot convert */

	type S struct {
		x int
		a [10]float32
		_ bool
	}
	type T struct {
		x int
		a [10]float32
		_ bool
	}
	var ss S
	var tt T
	_ = s == ss
	_ = ss /* ERROR mismatched types */ == tt

	var u struct {
		x int
		a [10]map[string]int
	}
	_ = u /* ERROR cannot compare */ == u
}

func pointers() {
	// nil
	_ = nil /* ERROR == not defined */ == nil
	_ = nil /* ERROR != not defined */ != nil
	_ = nil /* ERROR < not defined */ < nil
	_ = nil /* ERROR <= not defined */ <= nil
	_ = nil /* ERROR > not defined */ > nil
	_ = nil /* ERROR >= not defined */ >= nil

	// basics
	var p, q *int
	_ = p == q
	_ = p != q

	_ = p == nil
	_ = p != nil
	_ = nil == q
	_ = nil != q

	_ = p /* ERROR < not defined */ < q
	_ = p /* ERROR <= not defined */ <= q
	_ = p /* ERROR > not defined */ > q
	_ = p /* ERROR >= not defined */ >= q

	// various element types
	type (
		S1 struct{}
		S2 struct{}
		P1 *S1
		P2 *S2
	)
	var (
		ps1 *S1
		ps2 *S2
		p1 P1
		p2 P2
	)
	_ = ps1 == ps1
	_ = ps1 /* ERROR mismatched types */ == ps2
	_ = ps2 /* ERROR mismatched types */ == ps1

	_ = p1 == p1
	_ = p1 /* ERROR mismatched types */ == p2

	_ = p1 == ps1
}

func channels() {
	// basics
	var c, d chan int
	_ = c == d
	_ = c != d
	_ = c == nil
	_ = c /* ERROR < not defined */ < d

	// various element types (named types)
	type (
		C1 chan int
		C1r <-chan int
		C1s chan<- int
		C2 chan float32
	)
	var (
		c1 C1
		c1r C1r
		c1s C1s
		c1a chan int
		c2 C2
	)
	_ = c1 == c1
	_ = c1 /* ERROR mismatched types */ == c1r
	_ = c1 /* ERROR mismatched types */ == c1s
	_ = c1r /* ERROR mismatched types */ == c1s
	_ = c1 == c1a
	_ = c1a == c1
	_ = c1 /* ERROR mismatched types */ == c2
	_ = c1a /* ERROR mismatched types */ == c2

	// various element types (unnamed types)
	var (
		d1 chan int
		d1r <-chan int
		d1s chan<- int
		d1a chan<- int
		d2 chan float32
	)
	_ = d1 == d1
	_ = d1 == d1r
	_ = d1 == d1s
	_ = d1r /* ERROR mismatched types */ == d1s
	_ = d1 == d1a
	_ = d1a == d1
	_ = d1 /* ERROR mismatched types */ == d2
	_ = d1a /* ERROR mismatched types */ == d2
}

// for interfaces test
type S1 struct{}
type S11 struct{}
type S2 struct{}
func (*S1) m() int
func (*S11) m() int
func (*S11) n()
func (*S2) m() float32

func interfaces() {
	// basics
	var i, j interface{ m() int }
	_ = i == j
	_ = i != j
	_ = i == nil
	_ = i /* ERROR < not defined */ < j

	// various interfaces
	var ii interface { m() int; n() }
	var k interface { m() float32 }
	_ = i == ii
	_ = i /* ERROR mismatched types */ == k

	// interfaces vs values
	var s1 S1
	var s11 S11
	var s2 S2

	_ = i == 0 /* ERROR cannot convert */
	_ = i /* ERROR mismatched types */ == s1
	_ = i == &s1
	_ = i == &s11

	_ = i /* ERROR mismatched types */ == s2
	_ = i /* ERROR mismatched types */ == &s2
}

func slices() {
	// basics
	var s []int
	_ = s == nil
	_ = s != nil
	_ = s /* ERROR < not defined */ < nil

	// slices are not otherwise comparable
	_ = s /* ERROR == not defined */ == s
	_ = s /* ERROR < not defined */ < s
}

func maps() {
	// basics
	var m map[string]int
	_ = m == nil
	_ = m != nil
	_ = m /* ERROR < not defined */ < nil

	// maps are not otherwise comparable
	_ = m /* ERROR == not defined */ == m
	_ = m /* ERROR < not defined */ < m
}

func funcs() {
	// basics
	var f func(int) float32
	_ = f == nil
	_ = f != nil
	_ = f /* ERROR < not defined */ < nil

	// funcs are not otherwise comparable
	_ = f /* ERROR == not defined */ == f
	_ = f /* ERROR < not defined */ < f
}
