Plan 9 from Bell Labs’s /usr/web/sources/contrib/stallion/root/386/go/test/fixedbugs/issue2615.go

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


// run

// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Issue 2615: a long chain of else if's causes an overflow
// in the parser stack.

package main

// test returns the index of the lowest set bit in a 256-bit vector.
func test(x [4]uint64) int {
	if x[0]&(1<<0) != 0 {
		return 0
	} else if x[0]&(1<<1) != 0 {
		return 1
	} else if x[0]&(1<<2) != 0 {
		return 2
	} else if x[0]&(1<<3) != 0 {
		return 3
	} else if x[0]&(1<<4) != 0 {
		return 4
	} else if x[0]&(1<<5) != 0 {
		return 5
	} else if x[0]&(1<<6) != 0 {
		return 6
	} else if x[0]&(1<<7) != 0 {
		return 7
	} else if x[0]&(1<<8) != 0 {
		return 8
	} else if x[0]&(1<<9) != 0 {
		return 9
	} else if x[0]&(1<<10) != 0 {
		return 10
	} else if x[0]&(1<<11) != 0 {
		return 11
	} else if x[0]&(1<<12) != 0 {
		return 12
	} else if x[0]&(1<<13) != 0 {
		return 13
	} else if x[0]&(1<<14) != 0 {
		return 14
	} else if x[0]&(1<<15) != 0 {
		return 15
	} else if x[0]&(1<<16) != 0 {
		return 16
	} else if x[0]&(1<<17) != 0 {
		return 17
	} else if x[0]&(1<<18) != 0 {
		return 18
	} else if x[0]&(1<<19) != 0 {
		return 19
	} else if x[0]&(1<<20) != 0 {
		return 20
	} else if x[0]&(1<<21) != 0 {
		return 21
	} else if x[0]&(1<<22) != 0 {
		return 22
	} else if x[0]&(1<<23) != 0 {
		return 23
	} else if x[0]&(1<<24) != 0 {
		return 24
	} else if x[0]&(1<<25) != 0 {
		return 25
	} else if x[0]&(1<<26) != 0 {
		return 26
	} else if x[0]&(1<<27) != 0 {
		return 27
	} else if x[0]&(1<<28) != 0 {
		return 28
	} else if x[0]&(1<<29) != 0 {
		return 29
	} else if x[0]&(1<<30) != 0 {
		return 30
	} else if x[0]&(1<<31) != 0 {
		return 31
	} else if x[0]&(1<<32) != 0 {
		return 32
	} else if x[0]&(1<<33) != 0 {
		return 33
	} else if x[0]&(1<<34) != 0 {
		return 34
	} else if x[0]&(1<<35) != 0 {
		return 35
	} else if x[0]&(1<<36) != 0 {
		return 36
	} else if x[0]&(1<<37) != 0 {
		return 37
	} else if x[0]&(1<<38) != 0 {
		return 38
	} else if x[0]&(1<<39) != 0 {
		return 39
	} else if x[0]&(1<<40) != 0 {
		return 40
	} else if x[0]&(1<<41) != 0 {
		return 41
	} else if x[0]&(1<<42) != 0 {
		return 42
	} else if x[0]&(1<<43) != 0 {
		return 43
	} else if x[0]&(1<<44) != 0 {
		return 44
	} else if x[0]&(1<<45) != 0 {
		return 45
	} else if x[0]&(1<<46) != 0 {
		return 46
	} else if x[0]&(1<<47) != 0 {
		return 47
	} else if x[0]&(1<<48) != 0 {
		return 48
	} else if x[0]&(1<<49) != 0 {
		return 49
	} else if x[0]&(1<<50) != 0 {
		return 50
	} else if x[0]&(1<<51) != 0 {
		return 51
	} else if x[0]&(1<<52) != 0 {
		return 52
	} else if x[0]&(1<<53) != 0 {
		return 53
	} else if x[0]&(1<<54) != 0 {
		return 54
	} else if x[0]&(1<<55) != 0 {
		return 55
	} else if x[0]&(1<<56) != 0 {
		return 56
	} else if x[0]&(1<<57) != 0 {
		return 57
	} else if x[0]&(1<<58) != 0 {
		return 58
	} else if x[0]&(1<<59) != 0 {
		return 59
	} else if x[0]&(1<<60) != 0 {
		return 60
	} else if x[0]&(1<<61) != 0 {
		return 61
	} else if x[0]&(1<<62) != 0 {
		return 62
	} else if x[0]&(1<<63) != 0 {
		return 63
	} else if x[1]&(1<<0) != 0 {
		return 64
	} else if x[1]&(1<<1) != 0 {
		return 65
	} else if x[1]&(1<<2) != 0 {
		return 66
	} else if x[1]&(1<<3) != 0 {
		return 67
	} else if x[1]&(1<<4) != 0 {
		return 68
	} else if x[1]&(1<<5) != 0 {
		return 69
	} else if x[1]&(1<<6) != 0 {
		return 70
	} else if x[1]&(1<<7) != 0 {
		return 71
	} else if x[1]&(1<<8) != 0 {
		return 72
	} else if x[1]&(1<<9) != 0 {
		return 73
	} else if x[1]&(1<<10) != 0 {
		return 74
	} else if x[1]&(1<<11) != 0 {
		return 75
	} else if x[1]&(1<<12) != 0 {
		return 76
	} else if x[1]&(1<<13) != 0 {
		return 77
	} else if x[1]&(1<<14) != 0 {
		return 78
	} else if x[1]&(1<<15) != 0 {
		return 79
	} else if x[1]&(1<<16) != 0 {
		return 80
	} else if x[1]&(1<<17) != 0 {
		return 81
	} else if x[1]&(1<<18) != 0 {
		return 82
	} else if x[1]&(1<<19) != 0 {
		return 83
	} else if x[1]&(1<<20) != 0 {
		return 84
	} else if x[1]&(1<<21) != 0 {
		return 85
	} else if x[1]&(1<<22) != 0 {
		return 86
	} else if x[1]&(1<<23) != 0 {
		return 87
	} else if x[1]&(1<<24) != 0 {
		return 88
	} else if x[1]&(1<<25) != 0 {
		return 89
	} else if x[1]&(1<<26) != 0 {
		return 90
	} else if x[1]&(1<<27) != 0 {
		return 91
	} else if x[1]&(1<<28) != 0 {
		return 92
	} else if x[1]&(1<<29) != 0 {
		return 93
	} else if x[1]&(1<<30) != 0 {
		return 94
	} else if x[1]&(1<<31) != 0 {
		return 95
	} else if x[1]&(1<<32) != 0 {
		return 96
	} else if x[1]&(1<<33) != 0 {
		return 97
	} else if x[1]&(1<<34) != 0 {
		return 98
	} else if x[1]&(1<<35) != 0 {
		return 99
	} else if x[1]&(1<<36) != 0 {
		return 100
	} else if x[1]&(1<<37) != 0 {
		return 101
	} else if x[1]&(1<<38) != 0 {
		return 102
	} else if x[1]&(1<<39) != 0 {
		return 103
	} else if x[1]&(1<<40) != 0 {
		return 104
	} else if x[1]&(1<<41) != 0 {
		return 105
	} else if x[1]&(1<<42) != 0 {
		return 106
	} else if x[1]&(1<<43) != 0 {
		return 107
	} else if x[1]&(1<<44) != 0 {
		return 108
	} else if x[1]&(1<<45) != 0 {
		return 109
	} else if x[1]&(1<<46) != 0 {
		return 110
	} else if x[1]&(1<<47) != 0 {
		return 111
	} else if x[1]&(1<<48) != 0 {
		return 112
	} else if x[1]&(1<<49) != 0 {
		return 113
	} else if x[1]&(1<<50) != 0 {
		return 114
	} else if x[1]&(1<<51) != 0 {
		return 115
	} else if x[1]&(1<<52) != 0 {
		return 116
	} else if x[1]&(1<<53) != 0 {
		return 117
	} else if x[1]&(1<<54) != 0 {
		return 118
	} else if x[1]&(1<<55) != 0 {
		return 119
	} else if x[1]&(1<<56) != 0 {
		return 120
	} else if x[1]&(1<<57) != 0 {
		return 121
	} else if x[1]&(1<<58) != 0 {
		return 122
	} else if x[1]&(1<<59) != 0 {
		return 123
	} else if x[1]&(1<<60) != 0 {
		return 124
	} else if x[1]&(1<<61) != 0 {
		return 125
	} else if x[1]&(1<<62) != 0 {
		return 126
	} else if x[1]&(1<<63) != 0 {
		return 127
	} else if x[2]&(1<<0) != 0 {
		return 128
	} else if x[2]&(1<<1) != 0 {
		return 129
	} else if x[2]&(1<<2) != 0 {
		return 130
	} else if x[2]&(1<<3) != 0 {
		return 131
	} else if x[2]&(1<<4) != 0 {
		return 132
	} else if x[2]&(1<<5) != 0 {
		return 133
	} else if x[2]&(1<<6) != 0 {
		return 134
	} else if x[2]&(1<<7) != 0 {
		return 135
	} else if x[2]&(1<<8) != 0 {
		return 136
	} else if x[2]&(1<<9) != 0 {
		return 137
	} else if x[2]&(1<<10) != 0 {
		return 138
	} else if x[2]&(1<<11) != 0 {
		return 139
	} else if x[2]&(1<<12) != 0 {
		return 140
	} else if x[2]&(1<<13) != 0 {
		return 141
	} else if x[2]&(1<<14) != 0 {
		return 142
	} else if x[2]&(1<<15) != 0 {
		return 143
	} else if x[2]&(1<<16) != 0 {
		return 144
	} else if x[2]&(1<<17) != 0 {
		return 145
	} else if x[2]&(1<<18) != 0 {
		return 146
	} else if x[2]&(1<<19) != 0 {
		return 147
	} else if x[2]&(1<<20) != 0 {
		return 148
	} else if x[2]&(1<<21) != 0 {
		return 149
	} else if x[2]&(1<<22) != 0 {
		return 150
	} else if x[2]&(1<<23) != 0 {
		return 151
	} else if x[2]&(1<<24) != 0 {
		return 152
	} else if x[2]&(1<<25) != 0 {
		return 153
	} else if x[2]&(1<<26) != 0 {
		return 154
	} else if x[2]&(1<<27) != 0 {
		return 155
	} else if x[2]&(1<<28) != 0 {
		return 156
	} else if x[2]&(1<<29) != 0 {
		return 157
	} else if x[2]&(1<<30) != 0 {
		return 158
	} else if x[2]&(1<<31) != 0 {
		return 159
	} else if x[2]&(1<<32) != 0 {
		return 160
	} else if x[2]&(1<<33) != 0 {
		return 161
	} else if x[2]&(1<<34) != 0 {
		return 162
	} else if x[2]&(1<<35) != 0 {
		return 163
	} else if x[2]&(1<<36) != 0 {
		return 164
	} else if x[2]&(1<<37) != 0 {
		return 165
	} else if x[2]&(1<<38) != 0 {
		return 166
	} else if x[2]&(1<<39) != 0 {
		return 167
	} else if x[2]&(1<<40) != 0 {
		return 168
	} else if x[2]&(1<<41) != 0 {
		return 169
	} else if x[2]&(1<<42) != 0 {
		return 170
	} else if x[2]&(1<<43) != 0 {
		return 171
	} else if x[2]&(1<<44) != 0 {
		return 172
	} else if x[2]&(1<<45) != 0 {
		return 173
	} else if x[2]&(1<<46) != 0 {
		return 174
	} else if x[2]&(1<<47) != 0 {
		return 175
	} else if x[2]&(1<<48) != 0 {
		return 176
	} else if x[2]&(1<<49) != 0 {
		return 177
	} else if x[2]&(1<<50) != 0 {
		return 178
	} else if x[2]&(1<<51) != 0 {
		return 179
	} else if x[2]&(1<<52) != 0 {
		return 180
	} else if x[2]&(1<<53) != 0 {
		return 181
	} else if x[2]&(1<<54) != 0 {
		return 182
	} else if x[2]&(1<<55) != 0 {
		return 183
	} else if x[2]&(1<<56) != 0 {
		return 184
	} else if x[2]&(1<<57) != 0 {
		return 185
	} else if x[2]&(1<<58) != 0 {
		return 186
	} else if x[2]&(1<<59) != 0 {
		return 187
	} else if x[2]&(1<<60) != 0 {
		return 188
	} else if x[2]&(1<<61) != 0 {
		return 189
	} else if x[2]&(1<<62) != 0 {
		return 190
	} else if x[2]&(1<<63) != 0 {
		return 191
	} else if x[3]&(1<<0) != 0 {
		return 192
	} else if x[3]&(1<<1) != 0 {
		return 193
	} else if x[3]&(1<<2) != 0 {
		return 194
	} else if x[3]&(1<<3) != 0 {
		return 195
	} else if x[3]&(1<<4) != 0 {
		return 196
	} else if x[3]&(1<<5) != 0 {
		return 197
	} else if x[3]&(1<<6) != 0 {
		return 198
	} else if x[3]&(1<<7) != 0 {
		return 199
	} else if x[3]&(1<<8) != 0 {
		return 200
	} else if x[3]&(1<<9) != 0 {
		return 201
	} else if x[3]&(1<<10) != 0 {
		return 202
	} else if x[3]&(1<<11) != 0 {
		return 203
	} else if x[3]&(1<<12) != 0 {
		return 204
	} else if x[3]&(1<<13) != 0 {
		return 205
	} else if x[3]&(1<<14) != 0 {
		return 206
	} else if x[3]&(1<<15) != 0 {
		return 207
	} else if x[3]&(1<<16) != 0 {
		return 208
	} else if x[3]&(1<<17) != 0 {
		return 209
	} else if x[3]&(1<<18) != 0 {
		return 210
	} else if x[3]&(1<<19) != 0 {
		return 211
	} else if x[3]&(1<<20) != 0 {
		return 212
	} else if x[3]&(1<<21) != 0 {
		return 213
	} else if x[3]&(1<<22) != 0 {
		return 214
	} else if x[3]&(1<<23) != 0 {
		return 215
	} else if x[3]&(1<<24) != 0 {
		return 216
	} else if x[3]&(1<<25) != 0 {
		return 217
	} else if x[3]&(1<<26) != 0 {
		return 218
	} else if x[3]&(1<<27) != 0 {
		return 219
	} else if x[3]&(1<<28) != 0 {
		return 220
	} else if x[3]&(1<<29) != 0 {
		return 221
	} else if x[3]&(1<<30) != 0 {
		return 222
	} else if x[3]&(1<<31) != 0 {
		return 223
	} else if x[3]&(1<<32) != 0 {
		return 224
	} else if x[3]&(1<<33) != 0 {
		return 225
	} else if x[3]&(1<<34) != 0 {
		return 226
	} else if x[3]&(1<<35) != 0 {
		return 227
	} else if x[3]&(1<<36) != 0 {
		return 228
	} else if x[3]&(1<<37) != 0 {
		return 229
	} else if x[3]&(1<<38) != 0 {
		return 230
	} else if x[3]&(1<<39) != 0 {
		return 231
	} else if x[3]&(1<<40) != 0 {
		return 232
	} else if x[3]&(1<<41) != 0 {
		return 233
	} else if x[3]&(1<<42) != 0 {
		return 234
	} else if x[3]&(1<<43) != 0 {
		return 235
	} else if x[3]&(1<<44) != 0 {
		return 236
	} else if x[3]&(1<<45) != 0 {
		return 237
	} else if x[3]&(1<<46) != 0 {
		return 238
	} else if x[3]&(1<<47) != 0 {
		return 239
	} else if x[3]&(1<<48) != 0 {
		return 240
	} else if x[3]&(1<<49) != 0 {
		return 241
	} else if x[3]&(1<<50) != 0 {
		return 242
	} else if x[3]&(1<<51) != 0 {
		return 243
	} else if x[3]&(1<<52) != 0 {
		return 244
	} else if x[3]&(1<<53) != 0 {
		return 245
	} else if x[3]&(1<<54) != 0 {
		return 246
	} else if x[3]&(1<<55) != 0 {
		return 247
	} else if x[3]&(1<<56) != 0 {
		return 248
	} else if x[3]&(1<<57) != 0 {
		return 249
	} else if x[3]&(1<<58) != 0 {
		return 250
	} else if x[3]&(1<<59) != 0 {
		return 251
	} else if x[3]&(1<<60) != 0 {
		return 252
	} else if x[3]&(1<<61) != 0 {
		return 253
	} else if x[3]&(1<<62) != 0 {
		return 254
	} else if x[3]&(1<<63) != 0 {
		return 255
	}
	return -1
}

func main() {
	const ones = ^uint64(0)
	for i := 0; i < 256; i++ {
		bits := [4]uint64{ones, ones, ones, ones}

		// clear bottom i bits
		bits[i/64] ^= 1<<(uint(i)&63) - 1
		for j := i/64 - 1; j >= 0; j-- {
			bits[j] = 0
		}

		k := test(bits)
		if k != i {
			print("test(bits)=", k, " want ", i, "\n")
			panic("failed")
		}
	}
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].