Russ Cox | a2a7d47 | 2010-06-09 11:00:55 -0700 | [diff] [blame] | 1 | // errchk $G -e $D/$F.go |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 2 | |
| 3 | // Copyright 2009 The Go Authors. All rights reserved. |
| 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file. |
| 6 | |
Russ Cox | c7d30bc | 2009-05-12 16:09:47 -0700 | [diff] [blame] | 7 | // Static error messages about interface conversions. |
| 8 | |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 9 | package main |
| 10 | |
Russ Cox | 565b5dc | 2010-06-08 18:50:02 -0700 | [diff] [blame] | 11 | type T struct { |
| 12 | a int |
| 13 | } |
| 14 | |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 15 | var t *T |
| 16 | |
Russ Cox | 565b5dc | 2010-06-08 18:50:02 -0700 | [diff] [blame] | 17 | type I interface { |
| 18 | M() |
| 19 | } |
| 20 | |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 21 | var i I |
| 22 | |
Russ Cox | 565b5dc | 2010-06-08 18:50:02 -0700 | [diff] [blame] | 23 | type I2 interface { |
| 24 | M() |
| 25 | N() |
| 26 | } |
| 27 | |
Russ Cox | d436a70 | 2009-07-06 17:20:48 -0700 | [diff] [blame] | 28 | var i2 I2 |
Russ Cox | 49e2087 | 2009-02-11 17:55:16 -0800 | [diff] [blame] | 29 | |
Russ Cox | 565b5dc | 2010-06-08 18:50:02 -0700 | [diff] [blame] | 30 | type E interface{} |
| 31 | |
Russ Cox | d436a70 | 2009-07-06 17:20:48 -0700 | [diff] [blame] | 32 | var e E |
Russ Cox | 49e2087 | 2009-02-11 17:55:16 -0800 | [diff] [blame] | 33 | |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 34 | func main() { |
Russ Cox | 565b5dc | 2010-06-08 18:50:02 -0700 | [diff] [blame] | 35 | e = t // ok |
| 36 | t = e // ERROR "need explicit|need type assertion" |
Russ Cox | 49e2087 | 2009-02-11 17:55:16 -0800 | [diff] [blame] | 37 | |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 38 | // neither of these can work, |
| 39 | // because i has an extra method |
| 40 | // that t does not, so i cannot contain a t. |
Russ Cox | 565b5dc | 2010-06-08 18:50:02 -0700 | [diff] [blame] | 41 | i = t // ERROR "incompatible|missing M method" |
| 42 | t = i // ERROR "incompatible|need type assertion" |
Russ Cox | 49e2087 | 2009-02-11 17:55:16 -0800 | [diff] [blame] | 43 | |
Russ Cox | 565b5dc | 2010-06-08 18:50:02 -0700 | [diff] [blame] | 44 | i = i2 // ok |
Ian Lance Taylor | 2d8433a | 2010-09-08 21:03:24 -0700 | [diff] [blame] | 45 | i2 = i // ERROR "incompatible|missing N method" |
Russ Cox | d436a70 | 2009-07-06 17:20:48 -0700 | [diff] [blame] | 46 | |
Russ Cox | 565b5dc | 2010-06-08 18:50:02 -0700 | [diff] [blame] | 47 | i = I(i2) // ok |
Ian Lance Taylor | 2d8433a | 2010-09-08 21:03:24 -0700 | [diff] [blame] | 48 | i2 = I2(i) // ERROR "invalid|missing N method" |
Russ Cox | 565b5dc | 2010-06-08 18:50:02 -0700 | [diff] [blame] | 49 | |
| 50 | e = E(t) // ok |
| 51 | t = T(e) // ERROR "need explicit|need type assertion|incompatible" |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 52 | } |
Russ Cox | a2a7d47 | 2010-06-09 11:00:55 -0700 | [diff] [blame] | 53 | |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 54 | type M interface { |
| 55 | M() |
| 56 | } |
| 57 | |
Russ Cox | a2a7d47 | 2010-06-09 11:00:55 -0700 | [diff] [blame] | 58 | var m M |
| 59 | |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 60 | var _ = m.(int) // ERROR "impossible type assertion" |
Russ Cox | a2a7d47 | 2010-06-09 11:00:55 -0700 | [diff] [blame] | 61 | |
| 62 | type Int int |
Russ Cox | a2a7d47 | 2010-06-09 11:00:55 -0700 | [diff] [blame] | 63 | |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 64 | func (Int) M(float64) {} |
| 65 | |
| 66 | var _ = m.(Int) // ERROR "impossible type assertion" |
Russ Cox | a2a7d47 | 2010-06-09 11:00:55 -0700 | [diff] [blame] | 67 | |
| 68 | var ii int |
| 69 | var jj Int |
| 70 | |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 71 | var m1 M = ii // ERROR "incompatible|missing" |
| 72 | var m2 M = jj // ERROR "incompatible|wrong type for M method" |
Russ Cox | a2a7d47 | 2010-06-09 11:00:55 -0700 | [diff] [blame] | 73 | |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 74 | var m3 = M(ii) // ERROR "invalid|missing" |
| 75 | var m4 = M(jj) // ERROR "invalid|wrong type for M method" |