mirror of
https://github.com/golang/go
synced 2024-11-21 21:04:41 -07:00
gc: static implements check on typeswitches only applies to concrete case types.
Fixes #2700. R=rsc CC=golang-dev https://golang.org/cl/5574046
This commit is contained in:
parent
0442087f93
commit
0e919ff2c9
@ -889,7 +889,7 @@ typecheckswitch(Node *n)
|
||||
yyerror("%lN is not a type", ll->n);
|
||||
// reset to original type
|
||||
ll->n = n->ntest->right;
|
||||
} else if(!implements(ll->n->type, t, &missing, &have, &ptr)) {
|
||||
} else if(ll->n->type->etype != TINTER && !implements(ll->n->type, t, &missing, &have, &ptr)) {
|
||||
if(have && !missing->broke && !have->broke)
|
||||
yyerror("impossible type switch case: %lN cannot have dynamic type %T"
|
||||
" (wrong type for %S method)\n\thave %S%hT\n\twant %S%hT",
|
||||
|
@ -6,15 +6,30 @@
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"io"
|
||||
)
|
||||
|
||||
type I interface {
|
||||
M()
|
||||
M()
|
||||
}
|
||||
|
||||
func main(){
|
||||
var x I
|
||||
switch x.(type) {
|
||||
case string: // ERROR "impossible"
|
||||
println("FAIL")
|
||||
}
|
||||
var x I
|
||||
switch x.(type) {
|
||||
case string: // ERROR "impossible"
|
||||
println("FAIL")
|
||||
}
|
||||
|
||||
// Issue 2700: if the case type is an interface, nothing is impossible
|
||||
|
||||
var r io.Reader
|
||||
|
||||
_, _ = r.(io.Writer)
|
||||
|
||||
switch r.(type) {
|
||||
case io.Writer:
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user