summaryrefslogtreecommitdiff
path: root/test/fixedbugs/issue21979.go
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2019-09-06 16:05:36 -0700
committerMatthew Dempsky <mdempsky@google.com>2019-09-09 22:12:15 +0000
commite710a1fb2e36b645b103d9f72d47837171336279 (patch)
tree38f1dd43eb1a8e561e3ae5516c6befbdd54887c3 /test/fixedbugs/issue21979.go
parent51c8d969bd8a9992002a11373f91564c326e6d77 (diff)
downloadgo-git-e710a1fb2e36b645b103d9f72d47837171336279.tar.gz
cmd/compile: report more precise errors about untyped constants
Previously, we used a single "untyped number" type for all untyped numeric constants. This led to vague error messages like "string(1.0)" reporting that "1 (type untyped number)" can't be converted to string, even though "string(1)" is valid. This CL makes cmd/compile more like go/types by utilizing types.Ideal{int,rune,float,complex} instead of types.Types[TIDEAL], and keeping n.Type in sync with n.Val().Ctype() during constant folding. Thanks to K Heller for looking into this issue, and for the included test case. Fixes #21979. Change-Id: Ibfea88c05704bc3c0a502a455d018a375589754d Reviewed-on: https://go-review.googlesource.com/c/go/+/194019 Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'test/fixedbugs/issue21979.go')
-rw-r--r--test/fixedbugs/issue21979.go46
1 files changed, 46 insertions, 0 deletions
diff --git a/test/fixedbugs/issue21979.go b/test/fixedbugs/issue21979.go
new file mode 100644
index 0000000000..1c02f574c3
--- /dev/null
+++ b/test/fixedbugs/issue21979.go
@@ -0,0 +1,46 @@
+// 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.
+
+package p
+
+func f() {
+ _ = bool("") // ERROR "cannot convert .. \(type untyped string\) to type bool"
+ _ = bool(1) // ERROR "cannot convert 1 \(type untyped int\) to type bool"
+ _ = bool(1.0) // ERROR "cannot convert 1 \(type untyped float\) to type bool"
+ _ = bool(-4 + 2i) // ERROR "cannot convert -4 \+ 2i \(type untyped complex\) to type bool"
+
+ _ = string(true) // ERROR "cannot convert true \(type untyped bool\) to type string"
+ _ = string(-1)
+ _ = string(1.0) // ERROR "cannot convert 1 \(type untyped float\) to type string"
+ _ = string(-4 + 2i) // ERROR "cannot convert -4 \+ 2i \(type untyped complex\) to type string"
+
+ _ = int("") // ERROR "cannot convert .. \(type untyped string\) to type int"
+ _ = int(true) // ERROR "cannot convert true \(type untyped bool\) to type int"
+ _ = int(-1)
+ _ = int(1)
+ _ = int(1.0)
+ _ = int(-4 + 2i) // ERROR "truncated to integer"
+
+ _ = uint("") // ERROR "cannot convert .. \(type untyped string\) to type uint"
+ _ = uint(true) // ERROR "cannot convert true \(type untyped bool\) to type uint"
+ _ = uint(-1) // ERROR "constant -1 overflows uint"
+ _ = uint(1)
+ _ = uint(1.0)
+ _ = uint(-4 + 2i) // ERROR "constant -4 overflows uint" "truncated to integer"
+
+ _ = float64("") // ERROR "cannot convert .. \(type untyped string\) to type float64"
+ _ = float64(true) // ERROR "cannot convert true \(type untyped bool\) to type float64"
+ _ = float64(-1)
+ _ = float64(1)
+ _ = float64(1.0)
+ _ = float64(-4 + 2i) // ERROR "truncated to real"
+
+ _ = complex128("") // ERROR "cannot convert .. \(type untyped string\) to type complex128"
+ _ = complex128(true) // ERROR "cannot convert true \(type untyped bool\) to type complex128"
+ _ = complex128(-1)
+ _ = complex128(1)
+ _ = complex128(1.0)
+}