]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: don't walk static nodes generated by anylit.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Mon, 15 Sep 2014 16:31:47 +0000 (18:31 +0200)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Mon, 15 Sep 2014 16:31:47 +0000 (18:31 +0200)
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

src/cmd/gc/walk.c
test/fixedbugs/issue8017.go [new file with mode: 0644]

index ce0f3eb955d0058ffeb262a6ad3edf4e426fb1d8..a30fa62a6b78d9ec5228559e9bc1259ccc502ef8 100644 (file)
@@ -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 (file)
index 0000000..22056e0
--- /dev/null
@@ -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:
+       }
+}