diff options
author | Matthew Dempsky <mdempsky@google.com> | 2019-09-06 16:05:36 -0700 |
---|---|---|
committer | Matthew Dempsky <mdempsky@google.com> | 2019-09-09 22:12:15 +0000 |
commit | e710a1fb2e36b645b103d9f72d47837171336279 (patch) | |
tree | 38f1dd43eb1a8e561e3ae5516c6befbdd54887c3 /src/cmd/compile/internal/types/identity.go | |
parent | 51c8d969bd8a9992002a11373f91564c326e6d77 (diff) | |
download | go-e710a1fb2e36b645b103d9f72d47837171336279.tar.gz go-e710a1fb2e36b645b103d9f72d47837171336279.zip |
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 'src/cmd/compile/internal/types/identity.go')
-rw-r--r-- | src/cmd/compile/internal/types/identity.go | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/types/identity.go b/src/cmd/compile/internal/types/identity.go index 7c14a03ba1..a77f514df9 100644 --- a/src/cmd/compile/internal/types/identity.go +++ b/src/cmd/compile/internal/types/identity.go @@ -53,6 +53,13 @@ func identical(t1, t2 *Type, cmpTags bool, assumedEqual map[typePair]struct{}) b assumedEqual[typePair{t1, t2}] = struct{}{} switch t1.Etype { + case TIDEAL: + // Historically, cmd/compile used a single "untyped + // number" type, so all untyped number types were + // identical. Match this behavior. + // TODO(mdempsky): Revisit this. + return true + case TINTER: if t1.NumFields() != t2.NumFields() { return false |