Skip to content

Commit fff484d

Browse files
committed
Auto merge of rust-lang#11977 - y21:is_const_evaluatable_ice, r=Manishearth
don't visit nested bodies in `is_const_evaluatable` Fixes rust-lang#11939 This ICE happened in `if_let_some_else_none`, but the root problem is in one of the utils that it uses. It is (was) possible for `is_const_evalutable` to visit nested bodies which would lead to it trying to get the type of one of the expressions with the wrong typeck table, which won't have the type stored. Notably, for the expression `Bytes::from_static(&[0; 256 * 1024]);` in the linked issue, the array length is an anonymous const in which type checking happens on its own, so we can't use the typeck table of the enclosing function in there. Visiting nested bodies is also not needed for checking whether an expression can be const, so I think it's safe to ignore just ignore them altogether. changelog: Fix ICE when checking for constness in nested bodies
2 parents 9907b90 + b5169ae commit fff484d

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

clippy_utils/src/visitors.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,10 +316,7 @@ pub fn is_const_evaluatable<'tcx>(cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) ->
316316
is_const: bool,
317317
}
318318
impl<'tcx> Visitor<'tcx> for V<'_, 'tcx> {
319-
type NestedFilter = nested_filter::OnlyBodies;
320-
fn nested_visit_map(&mut self) -> Self::Map {
321-
self.cx.tcx.hir()
322-
}
319+
type NestedFilter = rustc_hir::intravisit::nested_filter::None;
323320

324321
fn visit_expr(&mut self, e: &'tcx Expr<'_>) {
325322
if !self.is_const {

tests/ui/crashes/ice-11939.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#![allow(clippy::unit_arg, clippy::no_effect)]
2+
3+
const fn v(_: ()) {}
4+
5+
fn main() {
6+
if true {
7+
v({
8+
[0; 1 + 1];
9+
});
10+
Some(())
11+
} else {
12+
None
13+
};
14+
}

0 commit comments

Comments
 (0)