From 436a79e5dd4cbda2129930db3a660c99276d7357 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 20 Jul 2015 16:23:50 -0700 Subject: [PATCH] go/types: fix internal inInteger operand predicate Backport of https://go-review.googlesource.com/#/c/12045/ Fixes golang/go#11594. Change-Id: I3c81e2b1bbdc084d4a323fd963c1c780054ce223 Reviewed-on: https://go-review.googlesource.com/12046 Reviewed-by: Alan Donovan --- go/types/operand.go | 5 +++-- go/types/testdata/decls0.src | 1 + go/types/testdata/shifts.src | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/go/types/operand.go b/go/types/operand.go index 0ac67672..d52b30e1 100644 --- a/go/types/operand.go +++ b/go/types/operand.go @@ -279,9 +279,10 @@ func (x *operand) assignableTo(conf *Config, T Type) bool { return false } -// isInteger reports whether x is a (typed or untyped) integer value. +// isInteger reports whether x is a value of integer type +// or an untyped constant representable as an integer. func (x *operand) isInteger() bool { return x.mode == invalid || isInteger(x.typ) || - x.mode == constant && representableConst(x.val, nil, UntypedInt, nil) // no *Config required for UntypedInt + isUntyped(x.typ) && x.mode == constant && representableConst(x.val, nil, UntypedInt, nil) // no *Config required for UntypedInt } diff --git a/go/types/testdata/decls0.src b/go/types/testdata/decls0.src index f1df3ea7..21baafe2 100644 --- a/go/types/testdata/decls0.src +++ b/go/types/testdata/decls0.src @@ -53,6 +53,7 @@ type ( iA1 [1 /* ERROR "invalid array length" */ <<100]int iA2 [- /* ERROR "invalid array length" */ 1]complex128 iA3 ["foo" /* ERROR "must be integer" */ ]string + iA4 [float64 /* ERROR "must be integer" */ (0)]int ) diff --git a/go/types/testdata/shifts.src b/go/types/testdata/shifts.src index 2df2ccde..fa4de9e8 100644 --- a/go/types/testdata/shifts.src +++ b/go/types/testdata/shifts.src @@ -331,3 +331,11 @@ func issue11325() { _ = 1. >> 1. _ = 1.1 /* ERROR "must be integer" */ >> 1 } + +func issue11594() { + var _ = complex64 /* ERROR "must be integer" */ (1) << 2 // example from issue 11594 + _ = float32 /* ERROR "must be integer" */ (0) << 1 + _ = float64 /* ERROR "must be integer" */ (0) >> 2 + _ = complex64 /* ERROR "must be integer" */ (0) << 3 + _ = complex64 /* ERROR "must be integer" */ (0) >> 4 +}