mirror of
https://github.com/golang/go
synced 2024-11-23 21:20:03 -07:00
go/types: fix errors in recording type information
In my previous change, I didn't use the correct functions for continuing to record type informations after errors. Change to using the correct functions, and add a comment to clarify in expr.go. Updates #22467 Change-Id: I66ebb636ceb2b994db652343430f0551db0050c3 Reviewed-on: https://go-review.googlesource.com/128835 Run-TryBot: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
28cee7075e
commit
79bf7955dc
@ -42,7 +42,7 @@ func mustTypecheck(t *testing.T, path, source string, info *Info) string {
|
|||||||
return pkg.Name()
|
return pkg.Name()
|
||||||
}
|
}
|
||||||
|
|
||||||
func maybeTypecheck(t *testing.T, path, source string, info *Info) string {
|
func mayTypecheck(t *testing.T, path, source string, info *Info) string {
|
||||||
fset := token.NewFileSet()
|
fset := token.NewFileSet()
|
||||||
f, err := parser.ParseFile(fset, path, source, 0)
|
f, err := parser.ParseFile(fset, path, source, 0)
|
||||||
if f == nil { // ignore errors unless f is nil
|
if f == nil { // ignore errors unless f is nil
|
||||||
@ -265,7 +265,7 @@ func TestTypesInfo(t *testing.T) {
|
|||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
info := Info{Types: make(map[ast.Expr]TypeAndValue)}
|
info := Info{Types: make(map[ast.Expr]TypeAndValue)}
|
||||||
name := maybeTypecheck(t, "TypesInfo", test.src, &info)
|
name := mayTypecheck(t, "TypesInfo", test.src, &info)
|
||||||
|
|
||||||
// look for expression type
|
// look for expression type
|
||||||
var typ Type
|
var typ Type
|
||||||
|
@ -310,7 +310,7 @@ func (check *Checker) shortVarDecl(pos token.Pos, lhs, rhs []ast.Expr) {
|
|||||||
check.recordDef(ident, obj)
|
check.recordDef(ident, obj)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
check.expr(&operand{}, lhs)
|
check.useLHS(lhs)
|
||||||
check.errorf(lhs.Pos(), "cannot declare %s", lhs)
|
check.errorf(lhs.Pos(), "cannot declare %s", lhs)
|
||||||
}
|
}
|
||||||
if obj == nil {
|
if obj == nil {
|
||||||
|
@ -34,9 +34,7 @@ func (check *Checker) call(x *operand, e *ast.CallExpr) exprKind {
|
|||||||
check.conversion(x, T)
|
check.conversion(x, T)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
for _, arg := range e.Args {
|
check.use(e.Args...)
|
||||||
check.expr(&operand{}, arg)
|
|
||||||
}
|
|
||||||
check.errorf(e.Args[n-1].Pos(), "too many arguments in conversion to %s", T)
|
check.errorf(e.Args[n-1].Pos(), "too many arguments in conversion to %s", T)
|
||||||
}
|
}
|
||||||
x.expr = e
|
x.expr = e
|
||||||
|
@ -1094,6 +1094,8 @@ func (check *Checker) exprInternal(x *operand, e ast.Expr, hint Type) exprKind {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
key, _ := kv.Key.(*ast.Ident)
|
key, _ := kv.Key.(*ast.Ident)
|
||||||
|
// do all possible checks early (before exiting due to errors)
|
||||||
|
// so we don't drop information on the floor
|
||||||
check.expr(x, kv.Value)
|
check.expr(x, kv.Value)
|
||||||
if key == nil {
|
if key == nil {
|
||||||
check.errorf(kv.Pos(), "invalid field name %s in struct literal", kv.Key)
|
check.errorf(kv.Pos(), "invalid field name %s in struct literal", kv.Key)
|
||||||
|
Loading…
Reference in New Issue
Block a user