From 2da9c3e0f99b72cf8f3bdca01b57e7a68a546c5b Mon Sep 17 00:00:00 2001 From: "K. \"pestophagous\" Heller" Date: Tue, 20 Aug 2019 23:13:25 -0700 Subject: [PATCH] cmd/compile: improve errors for invalid conversions of consts Follow-up to Change-Id: If6e52c59eab438599d641ecf6f110ebafca740a9 This addresses the remaining tech debt on issue 21979. The aforementioned previous CL silenced one of two mostly redundant compiler errors. However, the silenced error was the more expressive error. This CL now imbues the surviving error with the same level of expressiveness as the old semi-redundant error. Fixes #21979 Change-Id: I3273d48c88bbab073fabe53421d801df621ce321 Reviewed-on: https://go-review.googlesource.com/c/go/+/191079 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/const.go | 10 ++-- test/fixedbugs/issue21979.go | 75 ++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 test/fixedbugs/issue21979.go diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index c5b8d816c6..569cab4390 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -413,16 +413,20 @@ func convlit1(n *Node, t *types.Type, explicit bool, reuse canReuseNode) *Node { return n bad: + reportErr := false if !n.Diag() { - if !t.Broke() { - yyerror("cannot convert %L to type %v", n, t) - } + reportErr = !t.Broke() n.SetDiag(true) } if n.Type.IsUntyped() { n = defaultlitreuse(n, nil, reuse) } + + if reportErr { + yyerror("cannot convert %L to type %v", n, t) + } + return n } diff --git a/test/fixedbugs/issue21979.go b/test/fixedbugs/issue21979.go new file mode 100644 index 0000000000..ac7c88f195 --- /dev/null +++ b/test/fixedbugs/issue21979.go @@ -0,0 +1,75 @@ +// 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() { + // old error: "(type untyped string)" + _ = bool("") // ERROR "cannot convert .. \(type string\) to type bool" + + // old error: "(type untyped number)" + _ = bool(1) // ERROR "cannot convert 1 \(type int\) to type bool" + + // old error: "(type untyped number)" + _ = bool(1.0) // ERROR "cannot convert 1 \(type float64\) to type bool" + + // old error: "(type untyped number)" + _ = bool(-4 + 2i) // ERROR "cannot convert -4 \+ 2i \(type complex128\) to type bool" + + // old error: "(type untyped bool)" + _ = string(true) // ERROR "cannot convert true \(type bool\) to type string" + + _ = string(-1) + + // old error: "(type untyped number)" + _ = string(1.0) // ERROR "cannot convert 1 \(type float64\) to type string" + + // old error: "(type untyped number)" + _ = string(-4 + 2i) // ERROR "cannot convert -4 \+ 2i \(type complex128\) to type string" + + // old error: "(type untyped string)" + _ = int("") // ERROR "cannot convert .. \(type string\) to type int" + + // old error: "(type untyped bool)" + _ = int(true) // ERROR "cannot convert true \(type bool\) to type int" + + _ = int(-1) + _ = int(1) + _ = int(1.0) + _ = int(-4 + 2i) // ERROR "truncated to integer" + + // old error: "(type untyped string)" + _ = uint("") // ERROR "cannot convert .. \(type string\) to type uint" + + // old error: "(type untyped bool)" + _ = uint(true) // ERROR "cannot convert true \(type 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" + + // old error: "(type untyped string)" + _ = float64("") // ERROR "cannot convert .. \(type string\) to type float64" + + // old error: "(type untyped bool)" + _ = float64(true) // ERROR "cannot convert true \(type bool\) to type float64" + + _ = float64(-1) + _ = float64(1) + _ = float64(1.0) + _ = float64(-4 + 2i) // ERROR "truncated to real" + + // old error: "(type untyped string)" + _ = complex128("") // ERROR "cannot convert .. \(type string\) to type complex128" + + // old error: "(type untyped bool)" + _ = complex128(true) // ERROR "cannot convert true \(type bool\) to type complex128" + + _ = complex128(-1) + _ = complex128(1) + _ = complex128(1.0) +} -- 2.50.0