Commit 79bf7955 authored by Rebecca Stambler's avatar Rebecca Stambler Committed by Alan Donovan

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: default avatarRobert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 28cee707
...@@ -42,7 +42,7 @@ func mustTypecheck(t *testing.T, path, source string, info *Info) string { ...@@ -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) { ...@@ -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) { ...@@ -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 { ...@@ -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 { ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment