From: Rémy Oudompheng Date: Mon, 15 Sep 2014 16:31:47 +0000 (+0200) Subject: cmd/gc: don't walk static nodes generated by anylit. X-Git-Tag: go1.4beta1~408 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e024ed5ca4186b915e9a227f022f9c7bcfded5ae;p=gostls13.git 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 --- diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index ce0f3eb955..a30fa62a6b 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 0000000000..22056e08c5 --- /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: + } +}