From 0556e4891ef6e73ee886526cd39d4887850b1a1a Mon Sep 17 00:00:00 2001 From: varkor Date: Sat, 27 Apr 2019 13:26:06 +0100 Subject: [PATCH] Preserve literal suffixes --- src/librustc_lint/types.rs | 18 +++++++++++++++++- .../ui/lint/lint-range-endpoint-overflow.rs | 1 + .../lint/lint-range-endpoint-overflow.stderr | 8 +++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs index d3b0b1169bf..3b3e2455fa7 100644 --- a/src/librustc_lint/types.rs +++ b/src/librustc_lint/types.rs @@ -172,10 +172,26 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx hir::Expr) { if let Ok(start) = cx.sess().source_map() .span_to_snippet(eps[0].span) { + use ast::{LitKind::*, LitIntType}; + // We need to preserve the literal's suffix, + // as it may determine typing information. + let suffix = match lit.node { + Int(_, LitIntType::Signed(s)) => { + format!("{}", s) + } + Int(_, LitIntType::Unsigned(s)) => { + format!("{}", s) + } + Int(_, LitIntType::Unsuffixed) => { + "".to_owned() + } + _ => bug!(), + }; let suggestion = format!( - "{}..={}", + "{}..={}{}", start, lit_val - 1, + suffix, ); err.span_suggestion( parent_expr.span, diff --git a/src/test/ui/lint/lint-range-endpoint-overflow.rs b/src/test/ui/lint/lint-range-endpoint-overflow.rs index f2aeb24a795..5d7430007ab 100644 --- a/src/test/ui/lint/lint-range-endpoint-overflow.rs +++ b/src/test/ui/lint/lint-range-endpoint-overflow.rs @@ -6,6 +6,7 @@ fn main() { let range_c = 0..=256; //~ ERROR literal out of range for `u8` let range_d = 256..5; //~ ERROR literal out of range for `u8` let range_e = 0..257; //~ ERROR literal out of range for `u8` + let _range_f = 0..256u8; //~ ERROR range endpoint is out of range for `u8` range_a.collect::>(); range_b.collect::>(); diff --git a/src/test/ui/lint/lint-range-endpoint-overflow.stderr b/src/test/ui/lint/lint-range-endpoint-overflow.stderr index b2dff2c8d05..72f548cf4ad 100644 --- a/src/test/ui/lint/lint-range-endpoint-overflow.stderr +++ b/src/test/ui/lint/lint-range-endpoint-overflow.stderr @@ -28,5 +28,11 @@ error: literal out of range for `u8` LL | let range_e = 0..257; | ^^^ -error: aborting due to 4 previous errors +error: range endpoint is out of range for `u8` + --> $DIR/lint-range-endpoint-overflow.rs:9:20 + | +LL | let _range_f = 0..256u8; + | ^^^^^^^^ help: use an inclusive range instead: `0..=255u8` + +error: aborting due to 5 previous errors -- 2.44.0