Rollup merge of #120020 - oli-obk:long_const_eval_err_taint, r=compiler-errors
Gracefully handle missing typeck information if typeck errored fixes #116893 I created some logs and the typeck of `fn main` is exactly the same, no matter whether the constant's body is what it is, or if it is replaced with `panic!()`. The latter will cause the ICE not to be emitted though. The reason for that is that we abort compilation if *errors* were emitted, but not if *lint errors* were emitted. This took me way too long to debug, and is another reason why I would have liked https://github.com/rust-lang/compiler-team/issues/633
This commit is contained in:
commit
6ca77ff722
@ -1526,13 +1526,11 @@ fn check_expr_repeat(
|
|||||||
|
|
||||||
self.check_repeat_element_needs_copy_bound(element, count, element_ty);
|
self.check_repeat_element_needs_copy_bound(element, count, element_ty);
|
||||||
|
|
||||||
self.register_wf_obligation(
|
let ty = Ty::new_array_with_const_len(tcx, t, count);
|
||||||
Ty::new_array_with_const_len(tcx, t, count).into(),
|
|
||||||
expr.span,
|
|
||||||
traits::WellFormed(None),
|
|
||||||
);
|
|
||||||
|
|
||||||
Ty::new_array_with_const_len(tcx, t, count)
|
self.register_wf_obligation(ty.into(), expr.span, traits::WellFormed(None));
|
||||||
|
|
||||||
|
ty
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_repeat_element_needs_copy_bound(
|
fn check_repeat_element_needs_copy_bound(
|
||||||
|
@ -128,7 +128,10 @@ fn lookup_and_handle_method(&mut self, id: hir::HirId) {
|
|||||||
if let Some(def_id) = self.typeck_results().type_dependent_def_id(id) {
|
if let Some(def_id) = self.typeck_results().type_dependent_def_id(id) {
|
||||||
self.check_def_id(def_id);
|
self.check_def_id(def_id);
|
||||||
} else {
|
} else {
|
||||||
bug!("no type-dependent def for method");
|
assert!(
|
||||||
|
self.typeck_results().tainted_by_errors.is_some(),
|
||||||
|
"no type-dependent def for method"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,13 @@
|
|||||||
|
//! 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
|
||||||
|
|
||||||
|
// 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).
|
||||||
// The value of `n` will loop indefinitely (4 - 2 - 1 - 4).
|
// The value of `n` will loop indefinitely (4 - 2 - 1 - 4).
|
||||||
let _ = [(); {
|
let s = [(); {
|
||||||
let mut n = 113383; // #20 in https://oeis.org/A006884
|
let mut n = 113383; // #20 in https://oeis.org/A006884
|
||||||
while n != 0 {
|
while n != 0 {
|
||||||
//~^ ERROR is taking a long time
|
//~^ ERROR is taking a long time
|
||||||
@ -9,4 +15,6 @@ fn main() {
|
|||||||
}
|
}
|
||||||
n
|
n
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
s.nonexistent_method();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error: constant evaluation is taking a long time
|
error: constant evaluation is taking a long time
|
||||||
--> $DIR/infinite_loop.rs:6:9
|
--> $DIR/infinite_loop.rs:12:9
|
||||||
|
|
|
|
||||||
LL | / while n != 0 {
|
LL | / while n != 0 {
|
||||||
LL | |
|
LL | |
|
||||||
@ -10,9 +10,9 @@ 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:4:18
|
--> $DIR/infinite_loop.rs:10:18
|
||||||
|
|
|
|
||||||
LL | let _ = [(); {
|
LL | let s = [(); {
|
||||||
| __________________^
|
| __________________^
|
||||||
LL | | let mut n = 113383; // #20 in https://oeis.org/A006884
|
LL | | let mut n = 113383; // #20 in https://oeis.org/A006884
|
||||||
LL | | while n != 0 {
|
LL | | while n != 0 {
|
||||||
|
Loading…
Reference in New Issue
Block a user