// 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 operator .* not defined */ < f
	_ = 0 == t /* ERROR mismatched types untyped int and untyped bool */
	var b bool
	var x, y float32
	b = x < y
	_ = b
	_ = struct{b bool}{x < y}
}

// corner cases
var (
	v0 = nil == nil // ERROR operator == not defined on untyped nil
)

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

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

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

	var e [10]func() int
	_ = e /* ERROR \[10\]func\(\) int cannot be compared */ == 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 mismatched types */

	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 == tt /* ERROR mismatched types */

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

func pointers() {
	// nil
	_ = nil == nil // ERROR operator == not defined on untyped nil
	_ = nil != nil // ERROR operator != not defined on untyped 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 == ps2 /* ERROR mismatched types */
	_ = ps2 == ps1 /* ERROR mismatched types */

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

	_ = 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 == c1r /* ERROR mismatched types */
	_ = c1 == c1s /* ERROR mismatched types */
	_ = c1r == c1s /* ERROR mismatched types */
	_ = c1 == c1a
	_ = c1a == c1
	_ = c1 == c2 /* ERROR mismatched types */
	_ = c1a == c2 /* ERROR mismatched types */

	// 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 == d1s /* ERROR mismatched types */
	_ = d1 == d1a
	_ = d1a == d1
	_ = d1 == d2 /* ERROR mismatched types */
	_ = d1a == d2 /* ERROR mismatched types */
}

// 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 == k /* ERROR mismatched types */

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

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

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

	// issue #28164
	// testcase from issue
	_ = interface{}(nil) == [ /* ERROR slice can only be compared to nil */ ]int(nil)

	// related cases
	var e interface{}
	var s []int
	var x int
	_ = e == s // ERROR slice can only be compared to nil
	_ = s /* ERROR slice can only be compared to nil */ == e
	_ = e /* ERROR operator < not defined on interface */ < x
	_ = x < e // ERROR operator < not defined on interface
}

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

	// slices are not otherwise comparable
	_ = s /* ERROR slice can only be compared to nil */ == 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 map can only be compared to nil */ == 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 func can only be compared to nil */ == f
	_ = f /* ERROR < not defined */ < f
}
