Files
Robert Griesemer c8abe73eb7 go/types, types2: report error for oversized non-constant shift counts
If the shift count (RHS) of a shift is itself a non-constant shift
of a constant, for instance as in:

        x << (c << s)  // c is constant, s is not constant

we must ensure that the RHS shift (c << s) can be executed at run-time.
If c is an untyped constant, we must ensure that it is not oversized
(it must fit into a register so that the compiler can generate suitable
code).

Per the type rules on shifts:

"If the left operand of a non-constant shift expression is an untyped
constant, it is first implicitly converted to the type it would assume
if the shift expression were replaced by its left operand alone."

In the example above, c is the left operand of a non-constant shift.
Per the type rule, we must consider c without the shift, as in:

        x << (c)

With the type rule for RHS operands of shifts:

"The right operand in a shift expression must have integer type
or be an untyped constant representable by a value of type uint."

This implies that c must be representable by a value of type uint.

In the type checker, the code for type checking shifts intended this
behavior, but due to an incorrect ordering of case statements, the
untyped constant case was shadowed by the previous case and never
executed.

Swap the cases and add and adjust test cases.

Also, add a test for #47410 which reported on an issue previously
affected by this part of the shift code. The test ensures we that
recorded types have not changed as part of this fix.

For #47410.
For #77117.
Fixes #79252.
Fixes #80983.

Change-Id: I0fc9dc882b6c3d158366a134ca151d4c1a208a60
Reviewed-on: https://go-review.googlesource.com/c/go/+/847765
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Mark Freeman <mark@golang.org>
Auto-Submit: Robert Griesemer <gri@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
2026-10-19 09:29:21 -07:00
..
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2023-03-28 18:13:13 +00:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:48:57 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2023-03-28 18:13:13 +00:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-12-13 15:11:31 -08:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2023-03-28 18:13:13 +00:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2023-03-28 18:13:13 +00:00
2012-02-16 23:49:30 -05:00
2023-03-28 18:13:13 +00:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2023-03-28 18:13:13 +00:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2022-05-18 00:47:29 +00:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2014-07-16 19:27:10 -04:00
2012-02-18 22:15:42 +01:00
2023-03-28 18:13:13 +00:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:30 -05:00
2012-08-25 10:16:02 +02:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:30 -05:00
2015-07-11 14:36:33 +00:00
2015-07-11 14:36:33 +00:00
2015-07-11 14:36:33 +00:00
2012-02-18 22:15:42 +01:00
2012-08-25 10:16:02 +02:00
2012-02-16 23:49:30 -05:00
2012-02-16 23:49:59 -05:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:59 -05:00
2012-02-16 23:49:59 -05:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:59 -05:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:59 -05:00
2012-02-16 23:49:59 -05:00
2015-07-11 14:36:33 +00:00
2015-07-11 14:36:33 +00:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:59 -05:00
2012-02-16 23:49:59 -05:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-18 22:15:42 +01:00
2012-02-16 23:49:59 -05:00
2012-02-16 23:49:59 -05:00
2012-08-25 10:16:02 +02:00
2012-02-16 23:50:37 -05:00
2025-10-29 11:00:23 -07:00
2012-02-18 22:15:42 +01:00
2015-07-11 14:36:33 +00:00
2015-07-11 14:36:33 +00:00
2012-09-28 08:30:30 -07:00
2018-10-18 04:57:41 +00:00
2013-12-12 17:18:12 -08:00
2013-03-15 09:03:45 +01:00
2025-10-29 11:00:23 -07:00
2017-09-19 18:08:50 +00:00
2016-04-25 19:20:40 +00:00
2016-05-08 22:59:43 +00:00
2017-09-15 02:39:16 +00:00
2016-09-04 00:15:41 +00:00
2016-12-08 23:22:37 +00:00
2021-02-22 22:53:51 +00:00
2016-10-12 14:57:26 +00:00
2017-05-18 21:33:05 +00:00
2021-04-21 20:24:34 +00:00
2024-09-13 21:21:33 +00:00
2017-09-08 20:10:48 +00:00
2017-09-08 20:10:48 +00:00
2024-09-13 21:24:10 +00:00
2019-04-24 19:55:13 +00:00
2019-07-18 11:34:23 +00:00
2019-07-18 17:24:59 +00:00
2025-10-29 11:00:23 -07:00
2021-02-22 20:00:00 +00:00
2020-11-21 16:46:05 +00:00
2021-05-22 00:51:17 +00:00
2023-02-07 20:59:40 +00:00
2026-07-07 11:32:26 -07:00
2026-09-01 08:21:50 -07:00