mirror of
https://github.com/golang/go
synced 2024-09-06 00:19:45 +00:00
cmd/gc: don't walk static nodes generated by anylit.
During anylit run, nodes such as SLICEARR(statictmp, [:]) may be generated and are expected to be found unchanged by gen_as_init. In some walks (in particular walkselect), the statement may be walked again and lowered to its usual form, leading to a crash. Fixes #8017. Fixes #8024. Fixes #8058. LGTM=rsc R=golang-codereviews, dvyukov, gobot, rsc CC=golang-codereviews https://golang.org/cl/112080043
This commit is contained in:
parent
8d47b08255
commit
e024ed5ca4
|
@ -137,6 +137,8 @@ walkstmt(Node **np)
|
|||
n = *np;
|
||||
if(n == N)
|
||||
return;
|
||||
if(n->dodata == 2) // don't walk, generated by anylit.
|
||||
return;
|
||||
|
||||
setlineno(n);
|
||||
|
||||
|
|
26
test/fixedbugs/issue8017.go
Normal file
26
test/fixedbugs/issue8017.go
Normal file
|
@ -0,0 +1,26 @@
|
|||
// compile
|
||||
|
||||
// Copyright 2014 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.
|
||||
|
||||
// Issues 8017 and 8058: walk modifies nodes generated
|
||||
// by slicelit and causes an internal error afterwards
|
||||
// when gen_as_init parses it back.
|
||||
|
||||
package main
|
||||
|
||||
func F() {
|
||||
var ch chan int
|
||||
select {
|
||||
case <-ch:
|
||||
case <-make(chan int, len([2][]int{([][]int{})[len(ch)], []int{}})):
|
||||
}
|
||||
}
|
||||
|
||||
func G() {
|
||||
select {
|
||||
case <-([1][]chan int{[]chan int{}})[0][0]:
|
||||
default:
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue