]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: do not add invalid key to constSet
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Fri, 19 Feb 2021 19:40:35 +0000 (02:40 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Thu, 4 Mar 2021 06:36:26 +0000 (06:36 +0000)
After CL 272654, the compiler now use go/constant.Value to represent
constant nodes. That makes ir.ConstantValue requires node type to
correctly return value for untyped int node. But untyped int node can
have nil type after typechecked, e.g: using int value as key for
map[string]int, that makes the compiler crashes.

To fix it, just don't add the invalid key to constSet, since when
it's not important to report duplicated keys when they aren't valid.

For #43311
Fixes #44432

Change-Id: I44d8f2b95f5cb339e77e8a705a94bcb16e62beb9
Reviewed-on: https://go-review.googlesource.com/c/go/+/294034
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/typecheck/const.go
test/fixedbugs/issue44432.go [new file with mode: 0644]

index c60d36ba62f5812f0accb5987930ee55dedd522f..9b3a27b2d80378fbde90cca8d57a832cc47a2a54 100644 (file)
@@ -794,7 +794,7 @@ func (s *constSet) add(pos src.XPos, n ir.Node, what, where string) {
                }
        }
 
-       if !ir.IsConstNode(n) {
+       if !ir.IsConstNode(n) || n.Type() == nil {
                return
        }
        if n.Type().IsUntyped() {
diff --git a/test/fixedbugs/issue44432.go b/test/fixedbugs/issue44432.go
new file mode 100644 (file)
index 0000000..c5fb67e
--- /dev/null
@@ -0,0 +1,13 @@
+// errorcheck -G=0 -d=panic
+
+// Copyright 2021 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.
+
+package p
+
+var m = map[string]int{
+       "a": 1,
+       1:   1, // ERROR "cannot use 1.*as type string in map key"
+       2:   2, // ERROR "cannot use 2.*as type string in map key"
+}