]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: update ideal bool rules to match latest spec
authorRuss Cox <rsc@golang.org>
Sun, 3 Feb 2013 06:44:03 +0000 (01:44 -0500)
committerRuss Cox <rsc@golang.org>
Sun, 3 Feb 2013 06:44:03 +0000 (01:44 -0500)
Fixes #3915.
Fixes #3923.

R=ken2
CC=golang-dev
https://golang.org/cl/7281044

src/cmd/gc/const.c
test/const6.go [new file with mode: 0644]

index 83e62bde1d24d26e7fc80df1b5af89e8fa33c19f..92b87c024cd745e9555381454996a0bbcf8d9ee0 100644 (file)
@@ -78,7 +78,6 @@ convlit1(Node **np, Type *t, int explicit)
        if(!explicit && !isideal(n->type))
                return;
 
-       
        if(n->op == OLITERAL) {
                nn = nod(OXXX, N, N);
                *nn = *n;
@@ -88,8 +87,12 @@ convlit1(Node **np, Type *t, int explicit)
 
        switch(n->op) {
        default:
-               if(n->type == idealbool)
-                       n->type = types[TBOOL];
+               if(n->type == idealbool) {
+                       if(t->etype == TBOOL)
+                               n->type = t;
+                       else
+                               n->type = types[TBOOL];
+               }
                if(n->type->etype == TIDEAL) {
                        convlit(&n->left, t);
                        convlit(&n->right, t);
diff --git a/test/const6.go b/test/const6.go
new file mode 100644 (file)
index 0000000..c04435d
--- /dev/null
@@ -0,0 +1,30 @@
+// errorcheck
+
+// Copyright 2013 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.
+
+// Ideal vs non-ideal bool. See issue 3915, 3923.
+
+package p
+
+type mybool bool
+type mybool1 bool
+
+var (
+       x, y int = 1, 2
+       c1 bool = x < y
+       c2 mybool = x < y
+       c3 mybool = c2 == (x < y)
+       c4 mybool = c2 == (1 < 2)
+       c5 mybool = 1 < 2
+       c6 mybool1 = x < y
+       c7 = c1 == c2 // ERROR "mismatched types"
+       c8 = c2 == c6 // ERROR "mismatched types"
+       c9 = c1 == c6 // ERROR "mismatched types"
+       _ = c2 && (x < y)
+       _ = c2 && (1 < 2)
+       _ = c1 && c2 // ERROR "mismatched types"
+       _ = c2 && c6 // ERROR "mismatched types"
+       _ = c1 && c6 // ERROR "mismatched types"
+)