| // 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" | |
| } |