Skip to content

Commit

Permalink
Fix crash in late internal checking
Browse files Browse the repository at this point in the history
  • Loading branch information
chenyukang committed Mar 8, 2024
1 parent 9823f17 commit c81521a
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 7 deletions.
10 changes: 6 additions & 4 deletions compiler/rustc_lint/src/internal.rs
Expand Up @@ -379,13 +379,15 @@ impl LateLintPass<'_> for Diagnostics {
_ => return, // occurs for fns passed as args
}
}
ExprKind::MethodCall(segment, _recv, args, _span) => {
let def_id = cx.typeck_results().type_dependent_def_id(expr.hir_id).unwrap();
let fn_gen_args = cx.typeck_results().node_args(expr.hir_id);
ExprKind::MethodCall(_segment, _recv, args, _span) => {
let Some((span, def_id, fn_gen_args)) = typeck_results_of_method_fn(cx, expr)
else {
return;
};
let mut call_tys: Vec<_> =
args.iter().map(|arg| cx.typeck_results().expr_ty(arg)).collect();
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,
};
Expand Down
@@ -1,5 +1,5 @@
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 | |
Expand All @@ -10,7 +10,7 @@ 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:10:18
--> $DIR/infinite_loop.rs:13:18
|
LL | let s = [(); {
| __________________^
Expand Down
27 changes: 27 additions & 0 deletions tests/ui/consts/const-eval/infinite_loop.no_ice.stderr
@@ -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

5 changes: 4 additions & 1 deletion tests/ui/consts/const-eval/infinite_loop.rs
@@ -1,8 +1,11 @@
//! This test tests two things at once:
//! 1. we error if a const evaluation hits the deny-by-default lint limit
//! 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() {
// Tests the Collatz conjecture with an incorrect base case (0 instead of 1).
Expand Down

0 comments on commit c81521a

Please sign in to comment.