diff options
| author | bors <bors@rust-lang.org> | 2014-01-11 16:21:24 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-01-11 16:21:24 -0800 |
| commit | 54a85d4d675a7129087a2c342ac09a14d446c5cc (patch) | |
| tree | 0b0f46292279b93fd7dfcded2585d5417556c561 | |
| parent | 68ebe8141a9d469ed7a7081e7a4a9ff4c82fbff7 (diff) | |
| parent | 5ea6d0201d54c35205b7c4538b997692aa4f1a91 (diff) | |
| download | rust-54a85d4d675a7129087a2c342ac09a14d446c5cc.tar.gz rust-54a85d4d675a7129087a2c342ac09a14d446c5cc.zip | |
auto merge of #11480 : SiegeLord/rust/float_base, r=cmr
This fixes the incorrect lexing of things like: ~~~rust let b = 0o2f32; let d = 0o4e6; let f = 0o6e6f32; ~~~ and brings the float literal lexer in line with the description of the float literals in the manual.
| -rw-r--r-- | src/libsyntax/parse/lexer.rs | 27 | ||||
| -rw-r--r-- | src/test/compile-fail/lex-bad-fp-base-1.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/lex-bad-fp-base-2.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/lex-bad-fp-base-3.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/lex-bad-fp-base-4.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/lex-bad-fp-base-5.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/lex-bad-fp-base-6.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/lex-bad-fp-base-7.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/lex-bad-fp-base-8.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/lex-bad-fp-base-9.rs | 13 |
10 files changed, 133 insertions, 11 deletions
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs index 4cd64331f9a..885cfbcbdbe 100644 --- a/src/libsyntax/parse/lexer.rs +++ b/src/libsyntax/parse/lexer.rs @@ -463,6 +463,19 @@ fn scan_digits(rdr: @StringReader, radix: uint) -> ~str { }; } +fn check_float_base(rdr: @StringReader, start_bpos: BytePos, last_bpos: BytePos, + base: uint) { + match base { + 16u => fatal_span(rdr, start_bpos, last_bpos, + ~"hexadecimal float literal is not supported"), + 8u => fatal_span(rdr, start_bpos, last_bpos, + ~"octal float literal is not supported"), + 2u => fatal_span(rdr, start_bpos, last_bpos, + ~"binary float literal is not supported"), + _ => () + } +} + fn scan_number(c: char, rdr: @StringReader) -> token::Token { let mut num_str; let mut base = 10u; @@ -540,17 +553,6 @@ fn scan_number(c: char, rdr: @StringReader) -> token::Token { num_str.push_char('.'); num_str.push_str(dec_part); } - if is_float { - match base { - 16u => fatal_span(rdr, start_bpos, rdr.last_pos.get(), - ~"hexadecimal float literal is not supported"), - 8u => fatal_span(rdr, start_bpos, rdr.last_pos.get(), - ~"octal float literal is not supported"), - 2u => fatal_span(rdr, start_bpos, rdr.last_pos.get(), - ~"binary float literal is not supported"), - _ => () - } - } match scan_exponent(rdr, start_bpos) { Some(ref s) => { is_float = true; @@ -566,10 +568,12 @@ fn scan_number(c: char, rdr: @StringReader) -> token::Token { if c == '3' && n == '2' { bump(rdr); bump(rdr); + check_float_base(rdr, start_bpos, rdr.last_pos.get(), base); return token::LIT_FLOAT(str_to_ident(num_str), ast::TyF32); } else if c == '6' && n == '4' { bump(rdr); bump(rdr); + check_float_base(rdr, start_bpos, rdr.last_pos.get(), base); return token::LIT_FLOAT(str_to_ident(num_str), ast::TyF64); /* FIXME (#2252): if this is out of range for either a 32-bit or 64-bit float, it won't be noticed till the @@ -580,6 +584,7 @@ fn scan_number(c: char, rdr: @StringReader) -> token::Token { } } if is_float { + check_float_base(rdr, start_bpos, rdr.last_pos.get(), base); return token::LIT_FLOAT_UNSUFFIXED(str_to_ident(num_str)); } else { if num_str.len() == 0u { diff --git a/src/test/compile-fail/lex-bad-fp-base-1.rs b/src/test/compile-fail/lex-bad-fp-base-1.rs new file mode 100644 index 00000000000..659cb5c8379 --- /dev/null +++ b/src/test/compile-fail/lex-bad-fp-base-1.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let a = 0o1.0; //~ ERROR: octal float literal is not supported +} diff --git a/src/test/compile-fail/lex-bad-fp-base-2.rs b/src/test/compile-fail/lex-bad-fp-base-2.rs new file mode 100644 index 00000000000..b1d45f78e4a --- /dev/null +++ b/src/test/compile-fail/lex-bad-fp-base-2.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let b = 0o2f32; //~ ERROR: octal float literal is not supported +} diff --git a/src/test/compile-fail/lex-bad-fp-base-3.rs b/src/test/compile-fail/lex-bad-fp-base-3.rs new file mode 100644 index 00000000000..79c42360adb --- /dev/null +++ b/src/test/compile-fail/lex-bad-fp-base-3.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let c = 0o3.0f32; //~ ERROR: octal float literal is not supported +} diff --git a/src/test/compile-fail/lex-bad-fp-base-4.rs b/src/test/compile-fail/lex-bad-fp-base-4.rs new file mode 100644 index 00000000000..eaea61b0089 --- /dev/null +++ b/src/test/compile-fail/lex-bad-fp-base-4.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let d = 0o4e4; //~ ERROR: octal float literal is not supported +} diff --git a/src/test/compile-fail/lex-bad-fp-base-5.rs b/src/test/compile-fail/lex-bad-fp-base-5.rs new file mode 100644 index 00000000000..ee25ed95639 --- /dev/null +++ b/src/test/compile-fail/lex-bad-fp-base-5.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let e = 0o5.0e5; //~ ERROR: octal float literal is not supported +} diff --git a/src/test/compile-fail/lex-bad-fp-base-6.rs b/src/test/compile-fail/lex-bad-fp-base-6.rs new file mode 100644 index 00000000000..bf08ec1eae5 --- /dev/null +++ b/src/test/compile-fail/lex-bad-fp-base-6.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let f = 0o6e6f32; //~ ERROR: octal float literal is not supported +} diff --git a/src/test/compile-fail/lex-bad-fp-base-7.rs b/src/test/compile-fail/lex-bad-fp-base-7.rs new file mode 100644 index 00000000000..921ed8f1b69 --- /dev/null +++ b/src/test/compile-fail/lex-bad-fp-base-7.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let g = 0o7.0e7f64; //~ ERROR: octal float literal is not supported +} diff --git a/src/test/compile-fail/lex-bad-fp-base-8.rs b/src/test/compile-fail/lex-bad-fp-base-8.rs new file mode 100644 index 00000000000..10e334ede01 --- /dev/null +++ b/src/test/compile-fail/lex-bad-fp-base-8.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let h = 0x8.0e+9; //~ ERROR: hexadecimal float literal is not supported +} diff --git a/src/test/compile-fail/lex-bad-fp-base-9.rs b/src/test/compile-fail/lex-bad-fp-base-9.rs new file mode 100644 index 00000000000..3ea151cb982 --- /dev/null +++ b/src/test/compile-fail/lex-bad-fp-base-9.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let i = 0x9.0e-9; //~ ERROR: hexadecimal float literal is not supported +} |
