Skip to content

Commit

Permalink
Rollup merge of rust-lang#106361 - clubby789:int-literal-too-large, r…
Browse files Browse the repository at this point in the history
…=estebank

Note maximum integer literal for `IntLiteralTooLarge`

Closes rust-lang#105908

`@rustbot` label +A-diagnostics
  • Loading branch information
matthiaskrgr authored Jan 4, 2023
2 parents d24b229 + 537c7f4 commit 11020b9
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 28 deletions.
4 changes: 2 additions & 2 deletions compiler/rustc_ast/src/util/literal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ pub enum LitError {
InvalidIntSuffix,
InvalidFloatSuffix,
NonDecimalFloat(u32),
IntTooLarge,
IntTooLarge(u32),
}

impl LitKind {
Expand Down Expand Up @@ -333,6 +333,6 @@ fn integer_lit(symbol: Symbol, suffix: Option<Symbol>) -> Result<LitKind, LitErr
// but these kinds of errors are already reported by the lexer.
let from_lexer =
base < 10 && s.chars().any(|c| c.to_digit(10).map_or(false, |d| d >= base));
if from_lexer { LitError::LexerError } else { LitError::IntTooLarge }
if from_lexer { LitError::LexerError } else { LitError::IntTooLarge(base) }
})
}
1 change: 1 addition & 0 deletions compiler/rustc_error_messages/locales/en-US/session.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ session_invalid_float_literal_suffix = invalid suffix `{$suffix}` for float lite
.help = valid suffixes are `f32` and `f64`
session_int_literal_too_large = integer literal is too large
.note = value exceeds limit of `{$limit}`
session_invalid_int_literal_width = invalid width `{$width}` for integer literal
.help = valid widths are 8, 16, 32, 64 and 128
13 changes: 11 additions & 2 deletions compiler/rustc_session/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -260,9 +260,11 @@ pub(crate) struct InvalidFloatLiteralSuffix {

#[derive(Diagnostic)]
#[diag(session_int_literal_too_large)]
#[note]
pub(crate) struct IntLiteralTooLarge {
#[primary_span]
pub span: Span,
pub limit: String,
}

#[derive(Diagnostic)]
Expand Down Expand Up @@ -361,8 +363,15 @@ pub fn report_lit_error(sess: &ParseSess, err: LitError, lit: token::Lit, span:
_ => unreachable!(),
};
}
LitError::IntTooLarge => {
sess.emit_err(IntLiteralTooLarge { span });
LitError::IntTooLarge(base) => {
let max = u128::MAX;
let limit = match base {
2 => format!("{max:#b}"),
8 => format!("{max:#o}"),
16 => format!("{max:#x}"),
_ => format!("{max}"),
};
sess.emit_err(IntLiteralTooLarge { span, limit });
}
}
}
2 changes: 2 additions & 0 deletions src/test/ui/lexer/error-stage.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ error: integer literal is too large
|
LL | 999340282366920938463463374607431768211455999;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `340282366920938463463374607431768211455`

error: aborting due to 8 previous errors

8 changes: 8 additions & 0 deletions src/test/ui/lexer/lex-bad-numeric-literals.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// ignore-tidy-linelength

fn main() {
0o1.0; //~ ERROR: octal float literal is not supported
0o2f32; //~ ERROR: octal float literal is not supported
Expand All @@ -15,6 +17,12 @@ fn main() {
//~^ ERROR: integer literal is too large
9900000000000000000000000000999999999999999999999999999999;
//~^ ERROR: integer literal is too large
0b111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110;
//~^ ERROR: integer literal is too large
0o37777777777777777777777777777777777777777770;
//~^ ERROR: integer literal is too large
0xffffffffffffffffffffffffffffffff0;
//~^ ERROR: integer literal is too large
0x; //~ ERROR: no valid digits
0xu32; //~ ERROR: no valid digits
0ou32; //~ ERROR: no valid digits
Expand Down
76 changes: 52 additions & 24 deletions src/test/ui/lexer/lex-bad-numeric-literals.stderr
Original file line number Diff line number Diff line change
@@ -1,141 +1,169 @@
error: octal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:2:5
--> $DIR/lex-bad-numeric-literals.rs:4:5
|
LL | 0o1.0;
| ^^^^^

error: octal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:4:5
--> $DIR/lex-bad-numeric-literals.rs:6:5
|
LL | 0o3.0f32;
| ^^^^^

error: octal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:5:5
--> $DIR/lex-bad-numeric-literals.rs:7:5
|
LL | 0o4e4;
| ^^^^^

error: octal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:6:5
--> $DIR/lex-bad-numeric-literals.rs:8:5
|
LL | 0o5.0e5;
| ^^^^^^^

error: octal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:7:5
--> $DIR/lex-bad-numeric-literals.rs:9:5
|
LL | 0o6e6f32;
| ^^^^^

error: octal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:8:5
--> $DIR/lex-bad-numeric-literals.rs:10:5
|
LL | 0o7.0e7f64;
| ^^^^^^^

error: hexadecimal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:9:5
--> $DIR/lex-bad-numeric-literals.rs:11:5
|
LL | 0x8.0e+9;
| ^^^^^^^^

error: hexadecimal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:10:5
--> $DIR/lex-bad-numeric-literals.rs:12:5
|
LL | 0x9.0e-9;
| ^^^^^^^^

error[E0768]: no valid digits found for number
--> $DIR/lex-bad-numeric-literals.rs:11:5
--> $DIR/lex-bad-numeric-literals.rs:13:5
|
LL | 0o;
| ^^

error: expected at least one digit in exponent
--> $DIR/lex-bad-numeric-literals.rs:12:5
--> $DIR/lex-bad-numeric-literals.rs:14:5
|
LL | 1e+;
| ^^^

error: hexadecimal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:13:5
--> $DIR/lex-bad-numeric-literals.rs:15:5
|
LL | 0x539.0;
| ^^^^^^^

error[E0768]: no valid digits found for number
--> $DIR/lex-bad-numeric-literals.rs:18:5
--> $DIR/lex-bad-numeric-literals.rs:26:5
|
LL | 0x;
| ^^

error[E0768]: no valid digits found for number
--> $DIR/lex-bad-numeric-literals.rs:19:5
--> $DIR/lex-bad-numeric-literals.rs:27:5
|
LL | 0xu32;
| ^^

error[E0768]: no valid digits found for number
--> $DIR/lex-bad-numeric-literals.rs:20:5
--> $DIR/lex-bad-numeric-literals.rs:28:5
|
LL | 0ou32;
| ^^

error[E0768]: no valid digits found for number
--> $DIR/lex-bad-numeric-literals.rs:21:5
--> $DIR/lex-bad-numeric-literals.rs:29:5
|
LL | 0bu32;
| ^^

error[E0768]: no valid digits found for number
--> $DIR/lex-bad-numeric-literals.rs:22:5
--> $DIR/lex-bad-numeric-literals.rs:30:5
|
LL | 0b;
| ^^

error: octal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:24:5
--> $DIR/lex-bad-numeric-literals.rs:32:5
|
LL | 0o123.456;
| ^^^^^^^^^

error: binary float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:26:5
--> $DIR/lex-bad-numeric-literals.rs:34:5
|
LL | 0b111.101;
| ^^^^^^^^^

error: octal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:3:5
--> $DIR/lex-bad-numeric-literals.rs:5:5
|
LL | 0o2f32;
| ^^^^^^ not supported

error: integer literal is too large
--> $DIR/lex-bad-numeric-literals.rs:14:5
--> $DIR/lex-bad-numeric-literals.rs:16:5
|
LL | 9900000000000000000000000000999999999999999999999999999999;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `340282366920938463463374607431768211455`

error: integer literal is too large
--> $DIR/lex-bad-numeric-literals.rs:16:5
--> $DIR/lex-bad-numeric-literals.rs:18:5
|
LL | 9900000000000000000000000000999999999999999999999999999999;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `340282366920938463463374607431768211455`

error: integer literal is too large
--> $DIR/lex-bad-numeric-literals.rs:20:5
|
LL | 0b111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111`

error: integer literal is too large
--> $DIR/lex-bad-numeric-literals.rs:22:5
|
LL | 0o37777777777777777777777777777777777777777770;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `0o3777777777777777777777777777777777777777777`

error: integer literal is too large
--> $DIR/lex-bad-numeric-literals.rs:24:5
|
LL | 0xffffffffffffffffffffffffffffffff0;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `0xffffffffffffffffffffffffffffffff`

error: octal float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:23:5
--> $DIR/lex-bad-numeric-literals.rs:31:5
|
LL | 0o123f64;
| ^^^^^^^^ not supported

error: binary float literal is not supported
--> $DIR/lex-bad-numeric-literals.rs:25:5
--> $DIR/lex-bad-numeric-literals.rs:33:5
|
LL | 0b101f64;
| ^^^^^^^^ not supported

error: aborting due to 23 previous errors
error: aborting due to 26 previous errors

For more information about this error, try `rustc --explain E0768`.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ error: integer literal is too large
|
LL | concat_bytes!(888888888888888888888888888888888888888);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `340282366920938463463374607431768211455`

error: aborting due to 2 previous errors

2 changes: 2 additions & 0 deletions src/test/ui/parser/int-literal-too-large-span.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ error: integer literal is too large
|
LL | 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `340282366920938463463374607431768211455`

error: aborting due to previous error

2 changes: 2 additions & 0 deletions src/test/ui/parser/issues/issue-5544-a.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ error: integer literal is too large
|
LL | let __isize = 340282366920938463463374607431768211456; // 2^128
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `340282366920938463463374607431768211455`

error: aborting due to previous error

2 changes: 2 additions & 0 deletions src/test/ui/parser/issues/issue-5544-b.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ error: integer literal is too large
|
LL | let __isize = 0xffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff_ff;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: value exceeds limit of `0xffffffffffffffffffffffffffffffff`

error: aborting due to previous error

0 comments on commit 11020b9

Please sign in to comment.