diff --git a/src/pkg/text/scanner/scanner.go b/src/pkg/text/scanner/scanner.go index 565650edf9c..6492d322f82 100644 --- a/src/pkg/text/scanner/scanner.go +++ b/src/pkg/text/scanner/scanner.go @@ -389,15 +389,20 @@ func (s *Scanner) scanNumber(ch rune) (rune, rune) { if ch == 'x' || ch == 'X' { // hexadecimal int ch = s.next() + hasMantissa := false for digitVal(ch) < 16 { ch = s.next() + hasMantissa = true + } + if !hasMantissa { + s.error("illegal hexadecimal number") } } else { // octal int or float - seenDecimalDigit := false + has8or9 := false for isDecimal(ch) { if ch > '7' { - seenDecimalDigit = true + has8or9 = true } ch = s.next() } @@ -408,7 +413,7 @@ func (s *Scanner) scanNumber(ch rune) (rune, rune) { return Float, ch } // octal int - if seenDecimalDigit { + if has8or9 { s.error("illegal octal number") } } diff --git a/src/pkg/text/scanner/scanner_test.go b/src/pkg/text/scanner/scanner_test.go index bb3adb55a77..be3998a35ad 100644 --- a/src/pkg/text/scanner/scanner_test.go +++ b/src/pkg/text/scanner/scanner_test.go @@ -446,6 +446,9 @@ func TestError(t *testing.T) { testError(t, `"\'"`, "1:3", "illegal char escape", String) testError(t, `01238`, "1:6", "illegal octal number", Int) + testError(t, `01238123`, "1:9", "illegal octal number", Int) + testError(t, `0x`, "1:3", "illegal hexadecimal number", Int) + testError(t, `0xg`, "1:3", "illegal hexadecimal number", Int) testError(t, `'aa'`, "1:4", "illegal char literal", Char) testError(t, `'`, "1:2", "literal not terminated", Char)