From efd395f9fb429ea3e677d9e378b858cd083eec11 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Fri, 1 Nov 2019 04:07:23 +0700 Subject: cmd/compile: make duplicate index error distinguish arrays and slices Fixes #35291 Change-Id: I11ae367b6e972cd9e7a22bbc2cb23d32f4d72b98 Reviewed-on: https://go-review.googlesource.com/c/go/+/204617 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/typecheck.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 140acb9062..7fb4a51817 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -2782,7 +2782,7 @@ func typecheckcomplit(n *Node) (res *Node) { } elemType := n.Right.Right.Type - length := typecheckarraylit(elemType, -1, n.List.Slice()) + length := typecheckarraylit(elemType, -1, n.List.Slice(), "array literal") n.Op = OARRAYLIT n.Type = types.NewArray(elemType, length) @@ -2804,12 +2804,12 @@ func typecheckcomplit(n *Node) (res *Node) { n.Type = nil case TARRAY: - typecheckarraylit(t.Elem(), t.NumElem(), n.List.Slice()) + typecheckarraylit(t.Elem(), t.NumElem(), n.List.Slice(), "array literal") n.Op = OARRAYLIT n.Right = nil case TSLICE: - length := typecheckarraylit(t.Elem(), -1, n.List.Slice()) + length := typecheckarraylit(t.Elem(), -2, n.List.Slice(), "slice literal") n.Op = OSLICELIT n.Right = nodintconst(length) @@ -2960,7 +2960,8 @@ func typecheckcomplit(n *Node) (res *Node) { return n } -func typecheckarraylit(elemType *types.Type, bound int64, elts []*Node) int64 { +// typecheckarraylit type-checks a sequence of slice/array literal elements. +func typecheckarraylit(elemType *types.Type, bound int64, elts []*Node, ctx string) int64 { // If there are key/value pairs, create a map to keep seen // keys so we can check for duplicate indices. var indices map[int64]bool @@ -2995,12 +2996,12 @@ func typecheckarraylit(elemType *types.Type, bound int64, elts []*Node) int64 { r := *vp r = pushtype(r, elemType) r = typecheck(r, ctxExpr) - *vp = assignconv(r, elemType, "array or slice literal") + *vp = assignconv(r, elemType, ctx) if key >= 0 { if indices != nil { if indices[key] { - yyerror("duplicate index in array literal: %d", key) + yyerror("duplicate index in %s: %d", ctx, key) } else { indices[key] = true } -- cgit v1.3-5-g9baa