Skip to content

Commit

Permalink
Unrolled build for rust-lang#136760
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#136760 - chenyukang:fix-overflowing-int-lint-crash, r=oli-obk

Fix unwrap error in overflowing int literal

Fixes rust-lang#136675

it's maybe `negative` only from [check_lit](https://github.com/chenyukang/rust/blob/526e3288feb68eac55013746e03fb54d6a0b9a1e/compiler/rustc_lint/src/types.rs#L546), in this scenario the fields in `TypeLimits` is none.

r? ``@oli-obk``
  • Loading branch information
rust-timer authored Feb 10, 2025
2 parents 124cc92 + ace6bb9 commit 7e9a07e
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 4 deletions.
6 changes: 5 additions & 1 deletion compiler/rustc_lint/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -543,7 +543,11 @@ impl<'tcx> LateLintPass<'tcx> for TypeLimits {
lit: &'tcx hir::Lit,
negated: bool,
) {
lint_literal(cx, self, hir_id, lit.span, lit, negated)
if negated {
self.negated_expr_id = Some(hir_id);
self.negated_expr_span = Some(lit.span);
}
lint_literal(cx, self, hir_id, lit.span, lit, negated);
}

fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx hir::Expr<'tcx>) {
Expand Down
5 changes: 2 additions & 3 deletions compiler/rustc_lint/src/types/literal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -250,12 +250,11 @@ fn lint_int_literal<'tcx>(
lit: &hir::Lit,
t: ty::IntTy,
v: u128,
negated: bool,
) {
let int_type = t.normalize(cx.sess().target.pointer_width);
let (min, max) = int_ty_range(int_type);
let max = max as u128;
let negative = negated ^ (type_limits.negated_expr_id == Some(hir_id));
let negative = type_limits.negated_expr_id == Some(hir_id);

// Detect literal value out of range [min, max] inclusive
// avoiding use of -min to prevent overflow/panic
Expand Down Expand Up @@ -374,7 +373,7 @@ pub(crate) fn lint_literal<'tcx>(
ty::Int(t) => {
match lit.node {
ast::LitKind::Int(v, ast::LitIntType::Signed(_) | ast::LitIntType::Unsuffixed) => {
lint_int_literal(cx, type_limits, hir_id, span, lit, t, v.get(), negated)
lint_int_literal(cx, type_limits, hir_id, span, lit, t, v.get())
}
_ => bug!(),
};
Expand Down
4 changes: 4 additions & 0 deletions tests/ui/lint/lint-overflowing-int-136675.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fn main() {
if let -129 = 0i8 {} //~ ERROR literal out of range for `i8`
let x: i8 = -129; //~ ERROR literal out of range for `i8`
}
21 changes: 21 additions & 0 deletions tests/ui/lint/lint-overflowing-int-136675.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
error: literal out of range for `i8`
--> $DIR/lint-overflowing-int-136675.rs:2:12
|
LL | if let -129 = 0i8 {}
| ^^^^
|
= note: the literal `-129` does not fit into the type `i8` whose range is `-128..=127`
= help: consider using the type `i16` instead
= note: `#[deny(overflowing_literals)]` on by default

error: literal out of range for `i8`
--> $DIR/lint-overflowing-int-136675.rs:3:17
|
LL | let x: i8 = -129;
| ^^^^
|
= note: the literal `-129` does not fit into the type `i8` whose range is `-128..=127`
= help: consider using the type `i16` instead

error: aborting due to 2 previous errors

0 comments on commit 7e9a07e

Please sign in to comment.