mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: adjust types2 shift check to match go/types (cleanup)
With this change, the shift checking code matches the corresponding go/types code, but for the differences in the internal error reporting, and call of check.overflow. The change leads to the recording of an untyped int value if the RHS of a non-constant shift is an untyped integer value. Adjust the type in the compiler's irgen accordingly. Add test/shift3.go to verify behavior. Change-Id: I20386fcb1d5c48becffdc2203081fb70c08b282d Reviewed-on: https://go-review.googlesource.com/c/go/+/398236 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> Trust: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
parent
063f4032f5
commit
c0bbeb0982
5 changed files with 126 additions and 15 deletions
|
|
@ -6,6 +6,7 @@ package noder
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"go/constant"
|
||||
|
||||
"cmd/compile/internal/base"
|
||||
"cmd/compile/internal/ir"
|
||||
|
|
@ -62,6 +63,14 @@ func (g *irgen) expr(expr syntax.Expr) ir.Node {
|
|||
case types2.UntypedNil:
|
||||
// ok; can appear in type switch case clauses
|
||||
// TODO(mdempsky): Handle as part of type switches instead?
|
||||
case types2.UntypedInt, types2.UntypedFloat, types2.UntypedComplex:
|
||||
// Untyped rhs of non-constant shift, e.g. x << 1.0.
|
||||
// If we have a constant value, it must be an int >= 0.
|
||||
if tv.Value != nil {
|
||||
s := constant.ToInt(tv.Value)
|
||||
assert(s.Kind() == constant.Int && constant.Sign(s) >= 0)
|
||||
}
|
||||
typ = types2.Typ[types2.Uint]
|
||||
case types2.UntypedBool:
|
||||
typ = types2.Typ[types2.Bool] // expression in "if" or "for" condition
|
||||
case types2.UntypedString:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue