aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Martin <ality@pbrane.org>2012-03-19 15:57:28 -0700
committerAnthony Martin <ality@pbrane.org>2012-03-19 15:57:28 -0700
commite1f22bdcc56b52a163ecccfe6e95aaf75addcdce (patch)
tree60080229279c51a1381c6353e4eaeba72136cf70
parentaa1d4170a4f586bf2d9c68097f049977146bd31c (diff)
downloadgo-e1f22bdcc56b52a163ecccfe6e95aaf75addcdce.tar.gz
go-e1f22bdcc56b52a163ecccfe6e95aaf75addcdce.zip
gc: fix struct and array comparisons for new bool rules
The two optimizations for small structs and arrays were missing the implicit cast from ideal bool. Fixes #3351. R=rsc, lvd CC=golang-dev https://golang.org/cl/5848062
-rw-r--r--src/cmd/gc/walk.c2
-rw-r--r--test/fixedbugs/bug427.go39
2 files changed, 41 insertions, 0 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 0ed68f86b0..5c8282b52e 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -2514,6 +2514,7 @@ walkcompare(Node **np, NodeList **init)
expr = nodbool(n->op == OEQ);
typecheck(&expr, Erv);
walkexpr(&expr, init);
+ expr->type = n->type;
*np = expr;
return;
}
@@ -2534,6 +2535,7 @@ walkcompare(Node **np, NodeList **init)
expr = nodbool(n->op == OEQ);
typecheck(&expr, Erv);
walkexpr(&expr, init);
+ expr->type = n->type;
*np = expr;
return;
}
diff --git a/test/fixedbugs/bug427.go b/test/fixedbugs/bug427.go
new file mode 100644
index 0000000000..1239e7a332
--- /dev/null
+++ b/test/fixedbugs/bug427.go
@@ -0,0 +1,39 @@
+// compile
+
+// Copyright 2012 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.
+
+// http://code.google.com/p/go/issues/detail?id=3351
+
+package main
+
+// struct with four fields of basic type
+type S struct {a, b, c, d int}
+
+// struct with five fields of basic type
+type T struct {a, b, c, d, e int}
+
+// array with four elements
+type A [4]int
+
+// array with five elements
+type B [5]int
+
+func main() {
+ var i interface{}
+
+ var s1, s2 S
+ i = s1 == s2
+
+ var t1, t2 T
+ i = t1 == t2
+
+ var a1, a2 A
+ i = a1 == a2
+
+ var b1, b2 B
+ i = b1 == b2
+
+ _ = i
+}