aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2023-02-04 12:00:20 +0700
committerCuong Manh Le <cuong.manhle.vn@gmail.com>2023-02-09 09:33:47 +0000
commitfd208c8850cdfe84469d3e4ef9bd55e2e0cece70 (patch)
tree08c3d031dc57844e84a8db6b09aaf223878fd458 /src
parent8fb9565832e6dbacaaa057ffabc251a9341f8d23 (diff)
downloadgo-fd208c8850cdfe84469d3e4ef9bd55e2e0cece70.tar.xz
cmd/compile: remove constant arithmetic overflows during typecheck
Since go1.19, these errors are already reported by types2 for any user's Go code. Compiler generated code, which looks like constant expression should be evaluated as non-constant semantic, which allows overflows. Fixes #58293 Change-Id: I6f0049a69bdb0a8d0d7a0db49c7badaa92598ea2 Reviewed-on: https://go-review.googlesource.com/c/go/+/465096 Reviewed-by: Matthew Dempsky <mdempsky@google.com> Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: David Chase <drchase@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/typecheck/const.go36
1 files changed, 2 insertions, 34 deletions
diff --git a/src/cmd/compile/internal/typecheck/const.go b/src/cmd/compile/internal/typecheck/const.go
index 26a3753c5f..d43fa31782 100644
--- a/src/cmd/compile/internal/typecheck/const.go
+++ b/src/cmd/compile/internal/typecheck/const.go
@@ -34,10 +34,7 @@ func roundFloat(v constant.Value, sz int64) constant.Value {
// truncate float literal fv to 32-bit or 64-bit precision
// according to type; return truncated value.
func truncfltlit(v constant.Value, t *types.Type) constant.Value {
- if t.IsUntyped() || overflow(v, t) {
- // If there was overflow, simply continuing would set the
- // value to Inf which in turn would lead to spurious follow-on
- // errors. Avoid this by returning the existing value.
+ if t.IsUntyped() {
return v
}
@@ -48,10 +45,7 @@ func truncfltlit(v constant.Value, t *types.Type) constant.Value {
// precision, according to type; return truncated value. In case of
// overflow, calls Errorf but does not truncate the input value.
func trunccmplxlit(v constant.Value, t *types.Type) constant.Value {
- if t.IsUntyped() || overflow(v, t) {
- // If there was overflow, simply continuing would set the
- // value to Inf which in turn would lead to spurious follow-on
- // errors. Avoid this by returning the existing value.
+ if t.IsUntyped() {
return v
}
@@ -251,7 +245,6 @@ func convertVal(v constant.Value, t *types.Type, explicit bool) constant.Value {
switch {
case t.IsInteger():
v = toint(v)
- overflow(v, t)
return v
case t.IsFloat():
v = toflt(v)
@@ -273,9 +266,6 @@ func tocplx(v constant.Value) constant.Value {
func toflt(v constant.Value) constant.Value {
if v.Kind() == constant.Complex {
- if constant.Sign(constant.Imag(v)) != 0 {
- base.Errorf("constant %v truncated to real", v)
- }
v = constant.Real(v)
}
@@ -284,9 +274,6 @@ func toflt(v constant.Value) constant.Value {
func toint(v constant.Value) constant.Value {
if v.Kind() == constant.Complex {
- if constant.Sign(constant.Imag(v)) != 0 {
- base.Errorf("constant %v truncated to integer", v)
- }
v = constant.Real(v)
}
@@ -321,25 +308,6 @@ func toint(v constant.Value) constant.Value {
return constant.MakeInt64(1)
}
-// overflow reports whether constant value v is too large
-// to represent with type t, and emits an error message if so.
-func overflow(v constant.Value, t *types.Type) bool {
- // v has already been converted
- // to appropriate form for t.
- if t.IsUntyped() {
- return false
- }
- if v.Kind() == constant.Int && constant.BitLen(v) > ir.ConstPrec {
- base.Errorf("integer too large")
- return true
- }
- if ir.ConstOverflow(v, t) {
- base.Errorf("constant %v overflows %v", types.FmtConst(v, false), t)
- return true
- }
- return false
-}
-
func tostr(v constant.Value) constant.Value {
if v.Kind() == constant.Int {
r := unicode.ReplacementChar