diff --git a/compiler/rustc_ast_lowering/src/expr.rs b/compiler/rustc_ast_lowering/src/expr.rs index 1f195916c774a..fe8f47f51af20 100644 --- a/compiler/rustc_ast_lowering/src/expr.rs +++ b/compiler/rustc_ast_lowering/src/expr.rs @@ -555,7 +555,7 @@ impl<'hir> LoweringContext<'_, 'hir> { fn lower_arm(&mut self, arm: &Arm) -> hir::Arm<'hir> { let pat = self.lower_pat(&arm.pat); - let mut guard = arm.guard.as_ref().map(|cond| { + let guard = arm.guard.as_ref().map(|cond| { if let ExprKind::Let(pat, scrutinee, span, is_recovered) = &cond.kind { hir::Guard::IfLet(self.arena.alloc(hir::Let { hir_id: self.next_id(), @@ -587,10 +587,8 @@ impl<'hir> LoweringContext<'_, 'hir> { } } else if let Some(body) = &arm.body { self.dcx().emit_err(NeverPatternWithBody { span: body.span }); - guard = None; } else if let Some(g) = &arm.guard { self.dcx().emit_err(NeverPatternWithGuard { span: g.span }); - guard = None; } // We add a fake `loop {}` arm body so that it typecks to `!`. diff --git a/tests/ui/rfcs/rfc-0000-never_patterns/ICE-119271-never-arm-attr-in-guard.rs b/tests/ui/rfcs/rfc-0000-never_patterns/ICE-119271-never-arm-attr-in-guard.rs new file mode 100644 index 0000000000000..2490909b6a5a9 --- /dev/null +++ b/tests/ui/rfcs/rfc-0000-never_patterns/ICE-119271-never-arm-attr-in-guard.rs @@ -0,0 +1,10 @@ +fn main() {} + +fn attr_in_guard() { + match None:: { + Some(!) //~ ERROR `!` patterns are experimental + if #[deny(unused_mut)] //~ ERROR attributes on expressions are experimental + false //~ ERROR a guard on a never pattern will never be run + } + match false {} +} diff --git a/tests/ui/rfcs/rfc-0000-never_patterns/ICE-119271-never-arm-attr-in-guard.stderr b/tests/ui/rfcs/rfc-0000-never_patterns/ICE-119271-never-arm-attr-in-guard.stderr new file mode 100644 index 0000000000000..335e6c6db5f74 --- /dev/null +++ b/tests/ui/rfcs/rfc-0000-never_patterns/ICE-119271-never-arm-attr-in-guard.stderr @@ -0,0 +1,27 @@ +error[E0658]: attributes on expressions are experimental + --> $DIR/ICE-119271-never-arm-attr-in-guard.rs:6:16 + | +LL | if #[deny(unused_mut)] + | ^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: `!` patterns are experimental + --> $DIR/ICE-119271-never-arm-attr-in-guard.rs:5:14 + | +LL | Some(!) + | ^ + | + = note: see issue #118155 for more information + = help: add `#![feature(never_patterns)]` to the crate attributes to enable + +error: a guard on a never pattern will never be run + --> $DIR/ICE-119271-never-arm-attr-in-guard.rs:7:13 + | +LL | false + | ^^^^^ help: remove this guard + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0658`.