Source file test/interface/explicit.go

     1  // errorcheck
     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  
     7  // Verify compiler messages about erroneous static interface conversions.
     8  // Does not compile.
     9  
    10  package main
    11  
    12  type T struct {
    13  	a int
    14  }
    15  
    16  var t *T
    17  
    18  type X int
    19  
    20  func (x *X) M() {}
    21  
    22  type I interface {
    23  	M()
    24  }
    25  
    26  var i I
    27  
    28  type I2 interface {
    29  	M()
    30  	N()
    31  }
    32  
    33  var i2 I2
    34  
    35  type E interface{}
    36  
    37  var e E
    38  
    39  func main() {
    40  	e = t // ok
    41  	t = e // ERROR "need explicit|need type assertion"
    42  
    43  	// neither of these can work,
    44  	// because i has an extra method
    45  	// that t does not, so i cannot contain a t.
    46  	i = t // ERROR "incompatible|missing method M"
    47  	t = i // ERROR "incompatible|assignment$"
    48  
    49  	i = i2 // ok
    50  	i2 = i // ERROR "incompatible|missing method N"
    51  
    52  	i = I(i2)  // ok
    53  	i2 = I2(i) // ERROR "invalid|missing N method|cannot convert"
    54  
    55  	e = E(t) // ok
    56  	t = T(e) // ERROR "need explicit|need type assertion|incompatible|cannot convert"
    57  
    58  	// cannot type-assert non-interfaces
    59  	f := 2.0
    60  	_ = f.(int) // ERROR "non-interface type|only valid for interface types|not an interface"
    61  
    62  }
    63  
    64  type M interface {
    65  	M()
    66  }
    67  
    68  var m M
    69  
    70  var _ = m.(int) // ERROR "impossible type assertion"
    71  
    72  type Int int
    73  
    74  func (Int) M(float64) {}
    75  
    76  var _ = m.(Int) // ERROR "impossible type assertion"
    77  
    78  var _ = m.(X) // ERROR "pointer receiver"
    79  
    80  var ii int
    81  var jj Int
    82  
    83  var m1 M = ii // ERROR "incompatible|missing"
    84  var m2 M = jj // ERROR "incompatible|wrong type for method M"
    85  
    86  var m3 = M(ii) // ERROR "invalid|missing|cannot convert"
    87  var m4 = M(jj) // ERROR "invalid|wrong type for M method|cannot convert"
    88  
    89  type B1 interface {
    90  	_() // ERROR "methods must have a unique non-blank name"
    91  }
    92  
    93  type B2 interface {
    94  	M()
    95  	_() // ERROR "methods must have a unique non-blank name"
    96  }
    97  
    98  type T2 struct{}
    99  
   100  func (t *T2) M() {}
   101  func (t *T2) _() {}
   102  
   103  // Already reported about the invalid blank interface method above;
   104  // no need to report about not implementing it.
   105  var b1 B1 = &T2{}
   106  var b2 B2 = &T2{}
   107  

View as plain text