Rollup merge of #122181 - chenyukang:yukang-fix-late-lint-crash, r=oli-obk
Fix crash in internal late lint checking Fixes #122177
This commit is contained in:
commit
a08a5d4292
@ -379,13 +379,15 @@ fn check_expr(&mut self, cx: &LateContext<'_>, expr: &Expr<'_>) {
|
|||||||
_ => return, // occurs for fns passed as args
|
_ => return, // occurs for fns passed as args
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExprKind::MethodCall(segment, _recv, args, _span) => {
|
ExprKind::MethodCall(_segment, _recv, args, _span) => {
|
||||||
let def_id = cx.typeck_results().type_dependent_def_id(expr.hir_id).unwrap();
|
let Some((span, def_id, fn_gen_args)) = typeck_results_of_method_fn(cx, expr)
|
||||||
let fn_gen_args = cx.typeck_results().node_args(expr.hir_id);
|
else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
let mut call_tys: Vec<_> =
|
let mut call_tys: Vec<_> =
|
||||||
args.iter().map(|arg| cx.typeck_results().expr_ty(arg)).collect();
|
args.iter().map(|arg| cx.typeck_results().expr_ty(arg)).collect();
|
||||||
call_tys.insert(0, cx.tcx.types.self_param); // dummy inserted for `self`
|
call_tys.insert(0, cx.tcx.types.self_param); // dummy inserted for `self`
|
||||||
(segment.ident.span, def_id, fn_gen_args, call_tys)
|
(span, def_id, fn_gen_args, call_tys)
|
||||||
}
|
}
|
||||||
_ => return,
|
_ => return,
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error: constant evaluation is taking a long time
|
error: constant evaluation is taking a long time
|
||||||
--> $DIR/infinite_loop.rs:12:9
|
--> $DIR/infinite_loop.rs:15:9
|
||||||
|
|
|
|
||||||
LL | / while n != 0 {
|
LL | / while n != 0 {
|
||||||
LL | |
|
LL | |
|
||||||
@ -10,7 +10,7 @@ LL | | }
|
|||||||
= note: this lint makes sure the compiler doesn't get stuck due to infinite loops in const eval.
|
= note: this lint makes sure the compiler doesn't get stuck due to infinite loops in const eval.
|
||||||
If your compilation actually takes a long time, you can safely allow the lint.
|
If your compilation actually takes a long time, you can safely allow the lint.
|
||||||
help: the constant being evaluated
|
help: the constant being evaluated
|
||||||
--> $DIR/infinite_loop.rs:10:18
|
--> $DIR/infinite_loop.rs:13:18
|
||||||
|
|
|
|
||||||
LL | let s = [(); {
|
LL | let s = [(); {
|
||||||
| __________________^
|
| __________________^
|
27
tests/ui/consts/const-eval/infinite_loop.no_ice.stderr
Normal file
27
tests/ui/consts/const-eval/infinite_loop.no_ice.stderr
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
error: constant evaluation is taking a long time
|
||||||
|
--> $DIR/infinite_loop.rs:15:9
|
||||||
|
|
|
||||||
|
LL | / while n != 0 {
|
||||||
|
LL | |
|
||||||
|
LL | | n = if n % 2 == 0 { n / 2 } else { 3 * n + 1 };
|
||||||
|
LL | | }
|
||||||
|
| |_________^
|
||||||
|
|
|
||||||
|
= note: this lint makes sure the compiler doesn't get stuck due to infinite loops in const eval.
|
||||||
|
If your compilation actually takes a long time, you can safely allow the lint.
|
||||||
|
help: the constant being evaluated
|
||||||
|
--> $DIR/infinite_loop.rs:13:18
|
||||||
|
|
|
||||||
|
LL | let s = [(); {
|
||||||
|
| __________________^
|
||||||
|
LL | | let mut n = 113383; // #20 in https://oeis.org/A006884
|
||||||
|
LL | | while n != 0 {
|
||||||
|
LL | |
|
||||||
|
... |
|
||||||
|
LL | | n
|
||||||
|
LL | | }];
|
||||||
|
| |_____^
|
||||||
|
= note: `#[deny(long_running_const_eval)]` on by default
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
@ -1,8 +1,11 @@
|
|||||||
//! This test tests two things at once:
|
//! This test tests two things at once:
|
||||||
//! 1. we error if a const evaluation hits the deny-by-default lint limit
|
//! 1. we error if a const evaluation hits the deny-by-default lint limit
|
||||||
//! 2. we do not ICE on invalid follow-up code
|
//! 2. we do not ICE on invalid follow-up code
|
||||||
|
//! 3. no ICE when run with `-Z unstable-options` (issue 122177)
|
||||||
|
|
||||||
//@ compile-flags: -Z tiny-const-eval-limit
|
//@revisions: eval_limit no_ice
|
||||||
|
//@[no_ice] compile-flags: -Z tiny-const-eval-limit -Z unstable-options
|
||||||
|
//@[eval_limit] compile-flags: -Z tiny-const-eval-limit
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// Tests the Collatz conjecture with an incorrect base case (0 instead of 1).
|
// Tests the Collatz conjecture with an incorrect base case (0 instead of 1).
|
||||||
|
Loading…
Reference in New Issue
Block a user