mirror of
https://github.com/golang/go
synced 2024-11-11 20:50:23 -07:00
cmd/gc: Suggest *T in error for x.(T) if it would work.
Accomplished by synchronizing the formatting of conversion errors between typecheck.c and subr.c Fixes #3984. R=golang-dev, remyoudompheng, rsc CC=golang-dev https://golang.org/cl/6500064
This commit is contained in:
parent
8f3c2055bd
commit
1c2021ca14
@ -735,14 +735,20 @@ reswitch:
|
||||
}
|
||||
if(n->type != T && n->type->etype != TINTER)
|
||||
if(!implements(n->type, t, &missing, &have, &ptr)) {
|
||||
if(have)
|
||||
yyerror("impossible type assertion: %lN cannot have dynamic type %T"
|
||||
" (wrong type for %S method)\n\thave %S%hT\n\twant %S%hT",
|
||||
l, n->type, missing->sym, have->sym, have->type,
|
||||
missing->sym, missing->type);
|
||||
if(have && have->sym == missing->sym)
|
||||
yyerror("impossible type assertion:\n\t%T does not implement %T (wrong type for %S method)\n"
|
||||
"\t\thave %S%hhT\n\t\twant %S%hhT", n->type, t, missing->sym,
|
||||
have->sym, have->type, missing->sym, missing->type);
|
||||
else if(ptr)
|
||||
yyerror("impossible type assertion:\n\t%T does not implement %T (%S method requires pointer receiver)",
|
||||
n->type, t, missing->sym);
|
||||
else if(have)
|
||||
yyerror("impossible type assertion:\n\t%T does not implement %T (missing %S method)\n"
|
||||
"\t\thave %S%hhT\n\t\twant %S%hhT", n->type, t, missing->sym,
|
||||
have->sym, have->type, missing->sym, missing->type);
|
||||
else
|
||||
yyerror("impossible type assertion: %lN cannot have dynamic type %T"
|
||||
" (missing %S method)", l, n->type, missing->sym);
|
||||
yyerror("impossible type assertion:\n\t%T does not implement %T (missing %S method)",
|
||||
n->type, t, missing->sym);
|
||||
goto error;
|
||||
}
|
||||
goto ret;
|
||||
|
@ -15,6 +15,10 @@ type T struct {
|
||||
|
||||
var t *T
|
||||
|
||||
type X int
|
||||
|
||||
func (x *X) M() {}
|
||||
|
||||
type I interface {
|
||||
M()
|
||||
}
|
||||
@ -66,6 +70,8 @@ func (Int) M(float64) {}
|
||||
|
||||
var _ = m.(Int) // ERROR "impossible type assertion"
|
||||
|
||||
var _ = m.(X) // ERROR "pointer receiver"
|
||||
|
||||
var ii int
|
||||
var jj Int
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user