From 6e8524be1895a9b313f324700ad373e4f70144d7 Mon Sep 17 00:00:00 2001
From: Russ Cox <rsc@golang.org>
Date: Sun, 30 Aug 2009 18:47:48 -0700
Subject: [PATCH] array index bug

x[i]
x not addressable, i >= UINF
double evaluated i
second eval killed live registers

manifested as gob instability

R=ken
OCL=34097
CL=34099
---
 src/cmd/6g/cgen.c        |  6 +++---
 test/fixedbugs/bug199.go | 25 +++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)
 create mode 100644 test/fixedbugs/bug199.go

diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c
index ab712e5435..2f2b2d9eb2 100644
--- a/src/cmd/6g/cgen.c
+++ b/src/cmd/6g/cgen.c
@@ -470,9 +470,9 @@ agen(Node *n, Node *res)
 			agen(nl, &n3);
 			goto index;
 		}
-		cgen(nr, res);
 		tempname(&tmp, nr->type);
-		gmove(res, &tmp);
+		cgen(nr, &tmp);
+		nr = &tmp;
 
 	irad:
 		regalloc(&n3, types[tptr], res);
@@ -792,7 +792,7 @@ bgen(Node *n, int true, Prog *to)
 			regfree(&n1);
 			break;
 		}
-		
+
 		if(isinter(nl->type)) {
 			// front end shold only leave cmp to literal nil
 			if((a != OEQ && a != ONE) || nr->op != OLITERAL) {
diff --git a/test/fixedbugs/bug199.go b/test/fixedbugs/bug199.go
new file mode 100644
index 0000000000..c7bd21f11b
--- /dev/null
+++ b/test/fixedbugs/bug199.go
@@ -0,0 +1,25 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 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.
+
+package main
+
+type S struct {
+	a []int;
+}
+var s = &S{make([]int, 10)}
+
+func main() {
+	s.a[f()] = 1	// 6g used to call f twice here
+}
+
+var n int
+func f() int{
+	if n++; n > 1 {
+		panicln("f twice");
+	}
+	return 0
+}
+
-- 
2.30.9