diff options
-rw-r--r-- | src/cmd/gc/walk.c | 2 | ||||
-rw-r--r-- | test/fixedbugs/issue8017.go | 26 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index ce0f3eb95..a30fa62a6 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -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); diff --git a/test/fixedbugs/issue8017.go b/test/fixedbugs/issue8017.go new file mode 100644 index 000000000..22056e08c --- /dev/null +++ b/test/fixedbugs/issue8017.go @@ -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: + } +} |