]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't report redundant error for invalid integer literals
authorRobert Griesemer <gri@golang.org>
Sun, 10 Mar 2019 17:19:31 +0000 (10:19 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 12 Mar 2019 22:59:12 +0000 (22:59 +0000)
Fixes #30722.

Change-Id: Ia4c6e37282edc44788cd8af3f6cfa10895a19e4f
Reviewed-on: https://go-review.googlesource.com/c/go/+/166519
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/mpint.go
test/fixedbugs/issue30722.go [new file with mode: 0644]

index e4dd22d0a02e061ebceeb42428a495406a113ce0..340350bca7b2bf7db60039cb15e969015468c46d 100644 (file)
@@ -283,15 +283,11 @@ func (a *Mpint) SetInt64(c int64) {
 func (a *Mpint) SetString(as string) {
        _, ok := a.Val.SetString(as, 0)
        if !ok {
-               // required syntax is [+-][0[x]]d*
-               // At the moment we lose precise error cause;
-               // the old code distinguished between:
-               // - malformed hex constant
-               // - malformed octal constant
-               // - malformed decimal constant
-               // TODO(gri) use different conversion function
-               yyerror("malformed integer constant: %s", as)
-               a.Val.SetUint64(0)
+               // The lexer checks for correct syntax of the literal
+               // and reports detailed errors. Thus SetString should
+               // never fail (in theory it might run out of memory,
+               // but that wouldn't be reported as an error here).
+               Fatalf("malformed integer constant: %s", as)
                return
        }
        if a.checkOverflow(0) {
diff --git a/test/fixedbugs/issue30722.go b/test/fixedbugs/issue30722.go
new file mode 100644 (file)
index 0000000..02258f0
--- /dev/null
@@ -0,0 +1,17 @@
+// errorcheck
+
+// Copyright 2019 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.
+
+// Verify that we only get one error per invalid integer literal.
+
+package p
+
+const (
+       _ = 1_       // ERROR "'_' must separate successive digits"
+       _ = 0b       // ERROR "binary literal has no digits"
+       _ = 0o       // ERROR "octal literal has no digits"
+       _ = 0x       // ERROR "hexadecimal literal has no digits"
+       _ = 0xde__ad // ERROR "'_' must separate successive digits"
+)