1// errorcheck
2
3// Copyright 2011 The Go Authors.  All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Test illegal shifts.
8// Issue 1708, illegal cases.
9// Does not compile.
10
11package p
12
13func f(x int) int         { return 0 }
14func g(x interface{}) int { return 0 }
15func h(x float64) int     { return 0 }
16
17// from the spec
18var (
19	s uint    = 33
20	u         = 1.0 << s // ERROR "invalid operation|shift of non-integer operand"
21	v float32 = 1 << s   // ERROR "invalid" "as type float32"
22)
23
24// non-constant shift expressions
25var (
26	e1       = g(2.0 << s) // ERROR "invalid|shift of non-integer operand" "as type interface"
27	f1       = h(2 << s)   // ERROR "invalid" "as type float64"
28	g1 int64 = 1.1 << s    // ERROR "truncated"
29)
30
31// constant shift expressions
32const c uint = 65
33
34var (
35	a2 int = 1.0 << c    // ERROR "overflow"
36	b2     = 1.0 << c    // ERROR "overflow"
37	d2     = f(1.0 << c) // ERROR "overflow"
38)
39
40var (
41	// issues 4882, 4936.
42	a3 = 1.0<<s + 0 // ERROR "invalid|shift of non-integer operand"
43	// issue 4937
44	b3 = 1<<s + 1 + 1.0 // ERROR "invalid|shift of non-integer operand"
45	// issue 5014
46	c3     = complex(1<<s, 0) // ERROR "invalid|shift of type float64"
47	d3 int = complex(1<<s, 3) // ERROR "non-integer|cannot use.*as type int" "shift of type float64"
48	e3     = real(1 << s)     // ERROR "invalid"
49	f3     = imag(1 << s)     // ERROR "invalid"
50)
51
52// from the spec
53func _() {
54	var (
55		s uint  = 33
56		i       = 1 << s         // 1 has type int
57		j int32 = 1 << s         // 1 has type int32; j == 0
58		k       = uint64(1 << s) // 1 has type uint64; k == 1<<33
59		m int   = 1.0 << s       // 1.0 has type int
60		n       = 1.0<<s != i    // 1.0 has type int; n == false if ints are 32bits in size
61		o       = 1<<s == 2<<s   // 1 and 2 have type int; o == true if ints are 32bits in size
62		// next test only fails on 32bit systems
63		// p = 1<<s == 1<<33  // illegal if ints are 32bits in size: 1 has type int, but 1<<33 overflows int
64		u          = 1.0 << s    // ERROR "non-integer|float64"
65		u1         = 1.0<<s != 0 // ERROR "non-integer|float64"
66		u2         = 1<<s != 1.0 // ERROR "non-integer|float64"
67		v  float32 = 1 << s      // ERROR "non-integer|float32"
68		w  int64   = 1.0 << 33   // 1.0<<33 is a constant shift expression
69		_, _, _, _, _, _, _, _, _, _ = j, k, m, n, o, u, u1, u2, v, w
70	)
71}
72
73// shifts in comparisons w/ untyped operands
74var (
75	_ = 1<<s == 1
76	_ = 1<<s == 1.  // ERROR "invalid|shift of type float64"
77	_ = 1.<<s == 1  // ERROR "invalid|shift of type float64"
78	_ = 1.<<s == 1. // ERROR "invalid|non-integer|shift of type float64"
79
80	_ = 1<<s+1 == 1
81	_ = 1<<s+1 == 1.   // ERROR "invalid|shift of type float64"
82	_ = 1<<s+1. == 1   // ERROR "invalid|shift of type float64"
83	_ = 1<<s+1. == 1.  // ERROR "invalid|shift of type float64"
84	_ = 1.<<s+1 == 1   // ERROR "invalid|shift of type float64"
85	_ = 1.<<s+1 == 1.  // ERROR "invalid|shift of type float64"
86	_ = 1.<<s+1. == 1  // ERROR "invalid|shift of type float64"
87	_ = 1.<<s+1. == 1. // ERROR "invalid|non-integer|shift of type float64"
88
89	_ = 1<<s == 1<<s
90	_ = 1<<s == 1.<<s  // ERROR "invalid|shift of type float64"
91	_ = 1.<<s == 1<<s  // ERROR "invalid|shift of type float64"
92	_ = 1.<<s == 1.<<s // ERROR "invalid|non-integer|shift of type float64"
93
94	_ = 1<<s+1<<s == 1
95	_ = 1<<s+1<<s == 1.   // ERROR "invalid|shift of type float64"
96	_ = 1<<s+1.<<s == 1   // ERROR "invalid|shift of type float64"
97	_ = 1<<s+1.<<s == 1.  // ERROR "invalid|shift of type float64"
98	_ = 1.<<s+1<<s == 1   // ERROR "invalid|shift of type float64"
99	_ = 1.<<s+1<<s == 1.  // ERROR "invalid|shift of type float64"
100	_ = 1.<<s+1.<<s == 1  // ERROR "invalid|shift of type float64"
101	_ = 1.<<s+1.<<s == 1. // ERROR "invalid|non-integer|shift of type float64"
102
103	_ = 1<<s+1<<s == 1<<s+1<<s
104	_ = 1<<s+1<<s == 1<<s+1.<<s    // ERROR "invalid|shift of type float64"
105	_ = 1<<s+1<<s == 1.<<s+1<<s    // ERROR "invalid|shift of type float64"
106	_ = 1<<s+1<<s == 1.<<s+1.<<s   // ERROR "invalid|shift of type float64"
107	_ = 1<<s+1.<<s == 1<<s+1<<s    // ERROR "invalid|shift of type float64"
108	_ = 1<<s+1.<<s == 1<<s+1.<<s   // ERROR "invalid|shift of type float64"
109	_ = 1<<s+1.<<s == 1.<<s+1<<s   // ERROR "invalid|shift of type float64"
110	_ = 1<<s+1.<<s == 1.<<s+1.<<s  // ERROR "invalid|non-integer|shift of type float64"
111	_ = 1.<<s+1<<s == 1<<s+1<<s    // ERROR "invalid|shift of type float64"
112	_ = 1.<<s+1<<s == 1<<s+1.<<s   // ERROR "invalid|shift of type float64"
113	_ = 1.<<s+1<<s == 1.<<s+1<<s   // ERROR "invalid|shift of type float64"
114	_ = 1.<<s+1<<s == 1.<<s+1.<<s  // ERROR "invalid|non-integer|shift of type float64"
115	_ = 1.<<s+1.<<s == 1<<s+1<<s   // ERROR "invalid|shift of type float64"
116	_ = 1.<<s+1.<<s == 1<<s+1.<<s  // ERROR "invalid|non-integer|shift of type float64"
117	_ = 1.<<s+1.<<s == 1.<<s+1<<s  // ERROR "invalid|non-integer|shift of type float64"
118	_ = 1.<<s+1.<<s == 1.<<s+1.<<s // ERROR "invalid|non-integer|shift of type float64"
119)
120
121// shifts in comparisons w/ typed operands
122var (
123	x int
124	_ = 1<<s == x
125	_ = 1.<<s == x
126	_ = 1.1<<s == x // ERROR "truncated"
127
128	_ = 1<<s+x == 1
129	_ = 1<<s+x == 1.
130	_ = 1<<s+x == 1.1 // ERROR "truncated"
131	_ = 1.<<s+x == 1
132	_ = 1.<<s+x == 1.
133	_ = 1.<<s+x == 1.1  // ERROR "truncated"
134	_ = 1.1<<s+x == 1   // ERROR "truncated"
135	_ = 1.1<<s+x == 1.  // ERROR "truncated"
136	_ = 1.1<<s+x == 1.1 // ERROR "truncated"
137
138	_ = 1<<s == x<<s
139	_ = 1.<<s == x<<s
140	_ = 1.1<<s == x<<s // ERROR "truncated"
141)
142
143// shifts as operands in non-arithmetic operations and as arguments
144func _() {
145	var s uint
146	var a []int
147	_ = a[1<<s]
148	_ = a[1.]
149	// For now, the spec disallows these. We may revisit past Go 1.1.
150	_ = a[1.<<s]  // ERROR "integer|shift of type float64"
151	_ = a[1.1<<s] // ERROR "integer|shift of type float64"
152
153	_ = make([]int, 1)
154	_ = make([]int, 1.)
155	_ = make([]int, 1.<<s)
156	_ = make([]int, 1.1<<s) // ERROR "non-integer|truncated"
157
158	_ = float32(1)
159	_ = float32(1 << s) // ERROR "non-integer|shift of type float32"
160	_ = float32(1.)
161	_ = float32(1. << s)  // ERROR "non-integer|shift of type float32"
162	_ = float32(1.1 << s) // ERROR "non-integer|shift of type float32"
163
164	_ = append(a, 1<<s)
165	_ = append(a, 1.<<s)
166	_ = append(a, 1.1<<s) // ERROR "truncated"
167
168	var b []float32
169	_ = append(b, 1<<s)   // ERROR "non-integer|type float32"
170	_ = append(b, 1.<<s)  // ERROR "non-integer|type float32"
171	_ = append(b, 1.1<<s) // ERROR "non-integer|type float32"
172
173	_ = complex(1.<<s, 0)  // ERROR "non-integer|shift of type float64"
174	_ = complex(1.1<<s, 0) // ERROR "non-integer|shift of type float64"
175	_ = complex(0, 1.<<s)  // ERROR "non-integer|shift of type float64"
176	_ = complex(0, 1.1<<s) // ERROR "non-integer|shift of type float64"
177
178	var a4 float64
179	var b4 int
180	_ = complex(1<<s, a4) // ERROR "non-integer|shift of type float64"
181	_ = complex(1<<s, b4) // ERROR "invalid|non-integer|"
182
183	var m1 map[int]string
184	delete(m1, 1<<s)
185	delete(m1, 1.<<s)
186	delete(m1, 1.1<<s) // ERROR "truncated|shift of type float64"
187
188	var m2 map[float32]string
189	delete(m2, 1<<s)   // ERROR "invalid|cannot use 1 << s as type float32"
190	delete(m2, 1.<<s)  // ERROR "invalid|cannot use 1 << s as type float32"
191	delete(m2, 1.1<<s) // ERROR "invalid|cannot use 1.1 << s as type float32"
192}
193
194// shifts of shifts
195func _() {
196	var s uint
197	_ = 1 << (1 << s)
198	_ = 1 << (1. << s)
199	_ = 1 << (1.1 << s)   // ERROR "non-integer|truncated"
200	_ = 1. << (1 << s)    // ERROR "non-integer|shift of type float64"
201	_ = 1. << (1. << s)   // ERROR "non-integer|shift of type float64"
202	_ = 1.1 << (1.1 << s) // ERROR "invalid|non-integer|truncated"
203
204	_ = (1 << s) << (1 << s)
205	_ = (1 << s) << (1. << s)
206	_ = (1 << s) << (1.1 << s)   // ERROR "truncated"
207	_ = (1. << s) << (1 << s)    // ERROR "non-integer|shift of type float64"
208	_ = (1. << s) << (1. << s)   // ERROR "non-integer|shift of type float64"
209	_ = (1.1 << s) << (1.1 << s) // ERROR "invalid|non-integer|truncated"
210
211	var x int
212	x = 1 << (1 << s)
213	x = 1 << (1. << s)
214	x = 1 << (1.1 << s) // ERROR "truncated"
215	x = 1. << (1 << s)
216	x = 1. << (1. << s)
217	x = 1.1 << (1.1 << s) // ERROR "truncated"
218
219	x = (1 << s) << (1 << s)
220	x = (1 << s) << (1. << s)
221	x = (1 << s) << (1.1 << s) // ERROR "truncated"
222	x = (1. << s) << (1 << s)
223	x = (1. << s) << (1. << s)
224	x = (1.1 << s) << (1.1 << s) // ERROR "truncated"
225
226	var y float32
227	y = 1 << (1 << s)     // ERROR "non-integer|type float32"
228	y = 1 << (1. << s)    // ERROR "non-integer|type float32"
229	y = 1 << (1.1 << s)   // ERROR "invalid|truncated|float32"
230	y = 1. << (1 << s)    // ERROR "non-integer|type float32"
231	y = 1. << (1. << s)   // ERROR "non-integer|type float32"
232	y = 1.1 << (1.1 << s) // ERROR "invalid|truncated|float32"
233
234	var z complex128
235	z = (1 << s) << (1 << s)     // ERROR "non-integer|type complex128"
236	z = (1 << s) << (1. << s)    // ERROR "non-integer|type complex128"
237	z = (1 << s) << (1.1 << s)   // ERROR "invalid|truncated|complex128"
238	z = (1. << s) << (1 << s)    // ERROR "non-integer|type complex128"
239	z = (1. << s) << (1. << s)   // ERROR "non-integer|type complex128"
240	z = (1.1 << s) << (1.1 << s) // ERROR "invalid|truncated|complex128"
241}
242