]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: reject p-notation floats in Go source files
authorDavid Chase <drchase@google.com>
Wed, 27 May 2015 21:33:46 +0000 (17:33 -0400)
committerDavid Chase <drchase@google.com>
Thu, 28 May 2015 18:52:14 +0000 (18:52 +0000)
Use pkgimport == nil (or not) to distinguish between
parsing .go source files where "p" exponent specifier
is not allowed and parsing .a or .o export data where
it is.  Use that to control error when p-exponent is
seen.

Fixes #9036

Change-Id: I8924f09c91d4945ef3f20e80a6e544008a94a7e4
Reviewed-on: https://go-review.googlesource.com/10450
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/compile/internal/gc/lex.go
test/fixedbugs/issue9036.go [new file with mode: 0644]

index d9ba9b210b9ec89df88780d70828046841393c66..cf41c40964f2da66cb6470dee45dbe79fe425618 100644 (file)
@@ -1434,6 +1434,11 @@ casedot:
        }
 
 caseep:
+       if importpkg == nil && (c == 'p' || c == 'P') {
+               // <mantissa>p<base-2-exponent> is allowed in .a/.o imports,
+               // but not in .go sources.  See #9036.
+               Yyerror("malformed floating point constant")
+       }
        cp.WriteByte(byte(c))
        c = getc()
        if c == '+' || c == '-' {
@@ -1442,7 +1447,7 @@ caseep:
        }
 
        if !yy_isdigit(c) {
-               Yyerror("malformed fp constant exponent")
+               Yyerror("malformed floating point constant exponent")
        }
        for yy_isdigit(c) {
                cp.WriteByte(byte(c))
diff --git a/test/fixedbugs/issue9036.go b/test/fixedbugs/issue9036.go
new file mode 100644 (file)
index 0000000..283159e
--- /dev/null
@@ -0,0 +1,29 @@
+// errorcheck
+
+// Copyright 2015 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.
+
+// Expects to see error messages on "p" exponents.
+
+package main
+
+import "fmt"
+
+const (
+       x1 = 1.1    // float
+       x2 = 1e10   // float
+       x3 = 0x1e10 // integer (e is a hex digit)
+       x4 = 0x1p10 // ERROR "malformed floating point constant"
+       x5 = 1p10   // ERROR "malformed floating point constant"
+       x6 = 0p0    // ERROR "malformed floating point constant"
+)
+
+func main() {
+       fmt.Printf("%g %T\n", x1, x1)
+       fmt.Printf("%g %T\n", x2, x2)
+       fmt.Printf("%g %T\n", x3, x3)
+       fmt.Printf("%g %T\n", x4, x4)
+       fmt.Printf("%g %T\n", x5, x5)
+       fmt.Printf("%g %T\n", x6, x6)
+}