// errchk $G -e $D/$F.go

// Copyright 2010 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.

// Test cases for revised conversion rules.

package main

func main() {
	type NewInt int
	i0 := 0
	var i1 int = 1
	var i2 NewInt = 1
	i0 = i0
	i0 = i1
	i0 = int(i2)
	i1 = i0
	i1 = i1
	i1 = int(i2)
	i2 = NewInt(i0)
	i2 = NewInt(i1)
	i2 = i2

	type A1 [3]int
	type A2 [3]NewInt
	var a0 [3]int
	var a1 A1
	var a2 A2
	a0 = a0
	a0 = a1
	a0 = [3]int(a2) // ERROR "cannot"
	a1 = a0
	a1 = a1
	a1 = A1(a2) // ERROR "cannot"
	a2 = A2(a0) // ERROR "cannot"
	a2 = A2(a1) // ERROR "cannot"
	a2 = a2

	type S1 struct {
		x int
	}
	type S2 struct {
		x NewInt
	}
	var s0 struct {
		x int
	}
	var s1 S1
	var s2 S2
	s0 = s0
	s0 = s1
	s0 = struct {
		x int
	}(s2) // ERROR "cannot"
	s1 = s0
	s1 = s1
	s1 = S1(s2) // ERROR "cannot"
	s2 = S2(s0) // ERROR "cannot"
	s2 = S2(s1) // ERROR "cannot"
	s2 = s2

	type P1 *int
	type P2 *NewInt
	var p0 *int
	var p1 P1
	var p2 P2
	p0 = p0
	p0 = p1
	p0 = (*int)(p2) // ERROR "cannot"
	p1 = p0
	p1 = p1
	p1 = P1(p2) // ERROR "cannot"
	p2 = P2(p0) // ERROR "cannot"
	p2 = P2(p1) // ERROR "cannot"
	p2 = p2

	type Q1 *struct {
		x int
	}
	type Q2 *S1
	var q0 *struct {
		x int
	}
	var q1 Q1
	var q2 Q2
	var ps1 *S1
	q0 = q0
	q0 = q1
	q0 = (*struct {
		x int
	})(ps1) // legal because of special conversion exception for pointers
	q0 = (*struct {
		x int
	})(q2) // ERROR "cannot"
	q1 = q0
	q1 = q1
	q1 = Q1(q2)    // ERROR "cannot"
	q2 = (*S1)(q0) // legal because of special conversion exception for pointers
	q2 = Q2(q1)    // ERROR "cannot"
	q2 = q2

	type F1 func(x NewInt) int
	type F2 func(x int) NewInt
	var f0 func(x NewInt) int
	var f1 F1
	var f2 F2
	f0 = f0
	f0 = f1
	f0 = func(x NewInt) int(f2) // ERROR "cannot"
	f1 = f0
	f1 = f1
	f1 = F1(f2) // ERROR "cannot"
	f2 = F2(f0) // ERROR "cannot"
	f2 = F2(f1) // ERROR "cannot"
	f2 = f2

	type X1 interface {
		f() int
	}
	type X2 interface {
		f() NewInt
	}
	var x0 interface {
		f() int
	}
	var x1 X1
	var x2 X2
	x0 = x0
	x0 = x1
	x0 = interface {
		f() int
	}(x2) // ERROR "cannot|need type assertion"
	x1 = x0
	x1 = x1
	x1 = X1(x2) // ERROR "cannot|need type assertion"
	x2 = X2(x0) // ERROR "cannot|need type assertion"
	x2 = X2(x1) // ERROR "cannot|need type assertion"
	x2 = x2

	type L1 []int
	type L2 []NewInt
	var l0 []int
	var l1 L1
	var l2 L2
	l0 = l0
	l0 = l1
	l0 = []int(l2) // ERROR "cannot"
	l1 = l0
	l1 = l1
	l1 = L1(l2) // ERROR "cannot"
	l2 = L2(l0) // ERROR "cannot"
	l2 = L2(l1) // ERROR "cannot"
	l2 = l2

	type M1 map[string]int
	type M2 map[string]NewInt
	var m0 []int
	var m1 L1
	var m2 L2
	m0 = m0
	m0 = m1
	m0 = []int(m2) // ERROR "cannot"
	m1 = m0
	m1 = m1
	m1 = L1(m2) // ERROR "cannot"
	m2 = L2(m0) // ERROR "cannot"
	m2 = L2(m1) // ERROR "cannot"
	m2 = m2

	type C1 chan int
	type C2 chan NewInt
	var c0 chan int
	var c1 C1
	var c2 C2
	c0 = c0
	c0 = c1
	c0 = chan int(c2) // ERROR "cannot"
	c1 = c0
	c1 = c1
	c1 = C1(c2) // ERROR "cannot"
	c2 = C2(c0) // ERROR "cannot"
	c2 = C2(c1) // ERROR "cannot"
	c2 = c2

	// internal compiler error (6g and gccgo)
	type T interface{}
	var _ T = 17 // assignment compatible
	_ = T(17)    // internal compiler error even though assignment compatible
}
