diff options
| author | Mara Bos <m-ou.se@m-ou.se> | 2021-03-08 20:09:01 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-08 20:09:01 +0100 |
| commit | 0ee2f4c3e050234ac977fdc8e44a43eb8e3c95a2 (patch) | |
| tree | 66812d4d0ab61ed355a90e95e40560ed74f5772e | |
| parent | 09b17a1c2dfc3853931e223bf1871655af7800f1 (diff) | |
| parent | 6e4dcea0d92e83bbcd983b525abf2a87971a9fe8 (diff) | |
| download | rust-0ee2f4c3e050234ac977fdc8e44a43eb8e3c95a2.tar.gz rust-0ee2f4c3e050234ac977fdc8e44a43eb8e3c95a2.zip | |
Rollup merge of #82829 - JohnTitor:handle-neg-val, r=estebank
Handle negative literals in cast overflow warning Closes #48535 r? `@estebank`
| -rw-r--r-- | compiler/rustc_lint/src/types.rs | 27 | ||||
| -rw-r--r-- | src/test/ui/lint/type-overflow.stderr | 3 |
2 files changed, 23 insertions, 7 deletions
diff --git a/compiler/rustc_lint/src/types.rs b/compiler/rustc_lint/src/types.rs index 792655ff35a..2d311cc32f8 100644 --- a/compiler/rustc_lint/src/types.rs +++ b/compiler/rustc_lint/src/types.rs @@ -217,7 +217,11 @@ fn report_bin_hex_error( cx.struct_span_lint(OVERFLOWING_LITERALS, expr.span, |lint| { let (t, actually) = match ty { attr::IntType::SignedInt(t) => { - let actually = size.sign_extend(val) as i128; + let actually = if negative { + -(size.sign_extend(val) as i128) + } else { + size.sign_extend(val) as i128 + }; (t.name_str(), actually.to_string()) } attr::IntType::UnsignedInt(t) => { @@ -226,11 +230,22 @@ fn report_bin_hex_error( } }; let mut err = lint.build(&format!("literal out of range for `{}`", t)); - err.note(&format!( - "the literal `{}` (decimal `{}`) does not fit into \ - the type `{}` and will become `{}{}`", - repr_str, val, t, actually, t - )); + if negative { + // If the value is negative, + // emits a note about the value itself, apart from the literal. + err.note(&format!( + "the literal `{}` (decimal `{}`) does not fit into \ + the type `{}`", + repr_str, val, t + )); + err.note(&format!("and the value `-{}` will become `{}{}`", repr_str, actually, t)); + } else { + err.note(&format!( + "the literal `{}` (decimal `{}`) does not fit into \ + the type `{}` and will become `{}{}`", + repr_str, val, t, actually, t + )); + } if let Some(sugg_ty) = get_type_suggestion(&cx.typeck_results().node_type(expr.hir_id), val, negative) { diff --git a/src/test/ui/lint/type-overflow.stderr b/src/test/ui/lint/type-overflow.stderr index 521223e3256..8a31fd44746 100644 --- a/src/test/ui/lint/type-overflow.stderr +++ b/src/test/ui/lint/type-overflow.stderr @@ -60,7 +60,8 @@ warning: literal out of range for `i8` LL | let fail = -0b1111_1111i8; | ^^^^^^^^^^^^^ help: consider using the type `i16` instead: `0b1111_1111i16` | - = note: the literal `0b1111_1111i8` (decimal `255`) does not fit into the type `i8` and will become `-1i8` + = note: the literal `0b1111_1111i8` (decimal `255`) does not fit into the type `i8` + = note: and the value `-0b1111_1111i8` will become `1i8` warning: 7 warnings emitted |
