Skip to content

Commit

Permalink
cmd/compile: reject p-notation floats in Go source files
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
dr2chase committed May 28, 2015
1 parent bd8bb67 commit 596bb76
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/cmd/compile/internal/gc/lex.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 == '-' {
Expand All @@ -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))
Expand Down
29 changes: 29 additions & 0 deletions test/fixedbugs/issue9036.go
Original file line number Diff line number Diff line change
@@ -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)
}

0 comments on commit 596bb76

Please sign in to comment.