Commit efd395f9 authored by Cuong Manh Le's avatar Cuong Manh Le Committed by Matthew Dempsky

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 <cuong.manhle.vn@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
parent 4a09a9b0
...@@ -2782,7 +2782,7 @@ func typecheckcomplit(n *Node) (res *Node) { ...@@ -2782,7 +2782,7 @@ func typecheckcomplit(n *Node) (res *Node) {
} }
elemType := n.Right.Right.Type 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.Op = OARRAYLIT
n.Type = types.NewArray(elemType, length) n.Type = types.NewArray(elemType, length)
...@@ -2804,12 +2804,12 @@ func typecheckcomplit(n *Node) (res *Node) { ...@@ -2804,12 +2804,12 @@ func typecheckcomplit(n *Node) (res *Node) {
n.Type = nil n.Type = nil
case TARRAY: case TARRAY:
typecheckarraylit(t.Elem(), t.NumElem(), n.List.Slice()) typecheckarraylit(t.Elem(), t.NumElem(), n.List.Slice(), "array literal")
n.Op = OARRAYLIT n.Op = OARRAYLIT
n.Right = nil n.Right = nil
case TSLICE: case TSLICE:
length := typecheckarraylit(t.Elem(), -1, n.List.Slice()) length := typecheckarraylit(t.Elem(), -2, n.List.Slice(), "slice literal")
n.Op = OSLICELIT n.Op = OSLICELIT
n.Right = nodintconst(length) n.Right = nodintconst(length)
...@@ -2960,7 +2960,8 @@ func typecheckcomplit(n *Node) (res *Node) { ...@@ -2960,7 +2960,8 @@ func typecheckcomplit(n *Node) (res *Node) {
return n 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 // If there are key/value pairs, create a map to keep seen
// keys so we can check for duplicate indices. // keys so we can check for duplicate indices.
var indices map[int64]bool var indices map[int64]bool
...@@ -2995,12 +2996,12 @@ func typecheckarraylit(elemType *types.Type, bound int64, elts []*Node) int64 { ...@@ -2995,12 +2996,12 @@ func typecheckarraylit(elemType *types.Type, bound int64, elts []*Node) int64 {
r := *vp r := *vp
r = pushtype(r, elemType) r = pushtype(r, elemType)
r = typecheck(r, ctxExpr) r = typecheck(r, ctxExpr)
*vp = assignconv(r, elemType, "array or slice literal") *vp = assignconv(r, elemType, ctx)
if key >= 0 { if key >= 0 {
if indices != nil { if indices != nil {
if indices[key] { if indices[key] {
yyerror("duplicate index in array literal: %d", key) yyerror("duplicate index in %s: %d", ctx, key)
} else { } else {
indices[key] = true indices[key] = true
} }
......
...@@ -19,7 +19,7 @@ func main() { ...@@ -19,7 +19,7 @@ func main() {
_ = [10]int{100: 0} // ERROR "array index 100 out of bounds" _ = [10]int{100: 0} // ERROR "array index 100 out of bounds"
_ = [...]int{100: 0} _ = [...]int{100: 0}
_ = []int{t} // ERROR "cannot use .* as type int in array or slice literal" _ = []int{t} // ERROR "cannot use .* as type int in slice literal"
_ = [10]int{t} // ERROR "cannot use .* as type int in array or slice literal" _ = [10]int{t} // ERROR "cannot use .* as type int in array literal"
_ = [...]int{t} // ERROR "cannot use .* as type int in array or slice literal" _ = [...]int{t} // ERROR "cannot use .* as type int in array literal"
} }
// errorcheck
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Check error message for duplicated index in slice literal
package p
var s = []string{
1: "dup",
1: "dup", // ERROR "duplicate index in slice literal: 1"
}
...@@ -8,4 +8,4 @@ ...@@ -8,4 +8,4 @@
package p package p
var _ = []int{a: true, true} // ERROR "undefined: a" "cannot use true \(type untyped bool\) as type int in array or slice literal" var _ = []int{a: true, true} // ERROR "undefined: a" "cannot use true \(type untyped bool\) as type int in slice literal"
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