]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/syntax: don't assume (operator) ~ means operator ^
authorRobert Griesemer <gri@golang.org>
Thu, 15 Feb 2018 04:54:28 +0000 (20:54 -0800)
committerRobert Griesemer <gri@golang.org>
Thu, 15 Feb 2018 16:41:24 +0000 (16:41 +0000)
The scanner assumed that ~ really meant ^, which may be helpful when
coming from C. But ~ is not a valid Go token, and pretending that it
should be ^ can lead to confusing error messages. Better to be upfront
about it and complain about the invalid character in the first place.

This was code "inherited" from the original yacc parser which was
derived from a C compiler. It's 10 years later and we can probably
assume that people are less confused about C and Go.

Fixes #23587.

Change-Id: I8d8f9b55b0dff009b75c1530d729bf9092c5aea6
Reviewed-on: https://go-review.googlesource.com/94160
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/syntax/scanner.go
src/cmd/compile/internal/syntax/scanner_test.go
test/fixedbugs/issue23587.go [new file with mode: 0644]

index 1e0ff2e3cc27c7f64ba12b2575f973848f2bc1d1..dbb2387f8f0499ac3d88b73d4f7ffe55e1fa3829 100644 (file)
@@ -242,10 +242,6 @@ redo:
                s.op, s.prec = Or, precAdd
                goto assignop
 
-       case '~':
-               s.error("bitwise complement operator is ^")
-               fallthrough
-
        case '^':
                s.op, s.prec = Xor, precAdd
                c = s.getr()
index 4bfe5871fabe13bad73e2ec91c9ade18d6cf2f0c..0b7c2cfe43be876ce5f1f268b78cc8eb027dd7d0 100644 (file)
@@ -343,7 +343,7 @@ func TestScanErrors(t *testing.T) {
                {"\U0001d7d8" /* 𝟘 */, "identifier cannot begin with digit U+1D7D8 '𝟘'", 0, 0},
                {"foo\U0001d7d8_½" /* foo𝟘_½ */, "invalid identifier character U+00BD '½'", 0, 8 /* byte offset */},
 
-               {"x + ~y", "bitwise complement operator is ^", 0, 4},
+               {"x + ~y", "invalid character U+007E '~'", 0, 4},
                {"foo$bar = 0", "invalid character U+0024 '$'", 0, 3},
                {"const x = 0xyz", "malformed hex constant", 0, 12},
                {"0123456789", "malformed octal constant", 0, 10},
diff --git a/test/fixedbugs/issue23587.go b/test/fixedbugs/issue23587.go
new file mode 100644 (file)
index 0000000..bd5df27
--- /dev/null
@@ -0,0 +1,12 @@
+// errorcheck
+
+// Copyright 2018 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 p
+
+func f(x int) {
+       _ = ~x    // ERROR "invalid character"
+       _ = x ~ x // ERROR "invalid character" "unexpected x at end of statement"
+}