|  | // errorcheck | 
|  |  | 
|  | // Copyright 2016 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 various valid and invalid struct assignments and conversions. | 
|  | // Does not compile. | 
|  |  | 
|  | package main | 
|  |  | 
|  | type I interface { | 
|  | m() | 
|  | } | 
|  |  | 
|  | // conversions between structs | 
|  |  | 
|  | func _() { | 
|  | type S struct{} | 
|  | type T struct{} | 
|  | var s S | 
|  | var t T | 
|  | var u struct{} | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u | 
|  | s = S(s) | 
|  | s = S(t) | 
|  | s = S(u) | 
|  | t = u | 
|  | t = T(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type S struct{ x int } | 
|  | type T struct { | 
|  | x int "foo" | 
|  | } | 
|  | var s S | 
|  | var t T | 
|  | var u struct { | 
|  | x int "bar" | 
|  | } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = S(s) | 
|  | s = S(t) | 
|  | s = S(u) | 
|  | t = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = T(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type E struct{ x int } | 
|  | type S struct{ x E } | 
|  | type T struct { | 
|  | x E "foo" | 
|  | } | 
|  | var s S | 
|  | var t T | 
|  | var u struct { | 
|  | x E "bar" | 
|  | } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = S(s) | 
|  | s = S(t) | 
|  | s = S(u) | 
|  | t = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = T(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type S struct { | 
|  | x struct { | 
|  | x int "foo" | 
|  | } | 
|  | } | 
|  | type T struct { | 
|  | x struct { | 
|  | x int "bar" | 
|  | } "foo" | 
|  | } | 
|  | var s S | 
|  | var t T | 
|  | var u struct { | 
|  | x struct { | 
|  | x int "bar" | 
|  | } "bar" | 
|  | } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = S(s) | 
|  | s = S(t) | 
|  | s = S(u) | 
|  | t = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = T(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type E1 struct { | 
|  | x int "foo" | 
|  | } | 
|  | type E2 struct { | 
|  | x int "bar" | 
|  | } | 
|  | type S struct{ x E1 } | 
|  | type T struct { | 
|  | x E2 "foo" | 
|  | } | 
|  | var s S | 
|  | var t T | 
|  | var u struct { | 
|  | x E2 "bar" | 
|  | } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = S(s) | 
|  | s = S(t) // ERROR "cannot convert" | 
|  | s = S(u) // ERROR "cannot convert" | 
|  | t = u    // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = T(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type E struct{ x int } | 
|  | type S struct { | 
|  | f func(struct { | 
|  | x int "foo" | 
|  | }) | 
|  | } | 
|  | type T struct { | 
|  | f func(struct { | 
|  | x int "bar" | 
|  | }) | 
|  | } | 
|  | var s S | 
|  | var t T | 
|  | var u struct{ f func(E) } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = S(s) | 
|  | s = S(t) | 
|  | s = S(u) // ERROR "cannot convert" | 
|  | t = u    // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = T(u) // ERROR "cannot convert" | 
|  | } | 
|  |  | 
|  | // conversions between pointers to structs | 
|  |  | 
|  | func _() { | 
|  | type S struct{} | 
|  | type T struct{} | 
|  | var s *S | 
|  | var t *T | 
|  | var u *struct{} | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = (*S)(s) | 
|  | s = (*S)(t) | 
|  | s = (*S)(u) | 
|  | t = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = (*T)(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type S struct{ x int } | 
|  | type T struct { | 
|  | x int "foo" | 
|  | } | 
|  | var s *S | 
|  | var t *T | 
|  | var u *struct { | 
|  | x int "bar" | 
|  | } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = (*S)(s) | 
|  | s = (*S)(t) | 
|  | s = (*S)(u) | 
|  | t = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = (*T)(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type E struct{ x int } | 
|  | type S struct{ x E } | 
|  | type T struct { | 
|  | x E "foo" | 
|  | } | 
|  | var s *S | 
|  | var t *T | 
|  | var u *struct { | 
|  | x E "bar" | 
|  | } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = (*S)(s) | 
|  | s = (*S)(t) | 
|  | s = (*S)(u) | 
|  | t = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = (*T)(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type S struct { | 
|  | x struct { | 
|  | x int "foo" | 
|  | } | 
|  | } | 
|  | type T struct { | 
|  | x struct { | 
|  | x int "bar" | 
|  | } "foo" | 
|  | } | 
|  | var s *S | 
|  | var t *T | 
|  | var u *struct { | 
|  | x struct { | 
|  | x int "bar" | 
|  | } "bar" | 
|  | } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = (*S)(s) | 
|  | s = (*S)(t) | 
|  | s = (*S)(u) | 
|  | t = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = (*T)(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type E1 struct { | 
|  | x int "foo" | 
|  | } | 
|  | type E2 struct { | 
|  | x int "bar" | 
|  | } | 
|  | type S struct{ x E1 } | 
|  | type T struct { | 
|  | x E2 "foo" | 
|  | } | 
|  | var s *S | 
|  | var t *T | 
|  | var u *struct { | 
|  | x E2 "bar" | 
|  | } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = (*S)(s) | 
|  | s = (*S)(t) // ERROR "cannot convert" | 
|  | s = (*S)(u) // ERROR "cannot convert" | 
|  | t = u       // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = (*T)(u) | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type E struct{ x int } | 
|  | type S struct { | 
|  | f func(struct { | 
|  | x int "foo" | 
|  | }) | 
|  | } | 
|  | type T struct { | 
|  | f func(struct { | 
|  | x int "bar" | 
|  | }) | 
|  | } | 
|  | var s *S | 
|  | var t *T | 
|  | var u *struct{ f func(E) } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = (*S)(s) | 
|  | s = (*S)(t) | 
|  | s = (*S)(u) // ERROR "cannot convert" | 
|  | t = u       // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = (*T)(u) // ERROR "cannot convert" | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | type E struct{ x int } | 
|  | type S struct { | 
|  | f func(*struct { | 
|  | x int "foo" | 
|  | }) | 
|  | } | 
|  | type T struct { | 
|  | f func(*struct { | 
|  | x int "bar" | 
|  | }) | 
|  | } | 
|  | var s *S | 
|  | var t *T | 
|  | var u *struct{ f func(E) } | 
|  | s = s | 
|  | s = t // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = u // ERROR "cannot use .* in assignment|incompatible type" | 
|  | s = (*S)(s) | 
|  | s = (*S)(t) | 
|  | s = (*S)(u) // ERROR "cannot convert" | 
|  | t = u       // ERROR "cannot use .* in assignment|incompatible type" | 
|  | t = (*T)(u) // ERROR "cannot convert" | 
|  | } | 
|  |  | 
|  | func _() { | 
|  | var s []byte | 
|  | _ = ([4]byte)(s) | 
|  | _ = (*[4]byte)(s) | 
|  |  | 
|  | type A [4]byte | 
|  | _ = (A)(s) | 
|  | _ = (*A)(s) | 
|  |  | 
|  | type P *[4]byte | 
|  | _ = (P)(s) | 
|  | _ = (*P)(s) // ERROR "cannot convert" | 
|  | } |