Skip to content

Commit

Permalink
Rollup merge of rust-lang#90028 - tmiasko:structural-match-closure, r…
Browse files Browse the repository at this point in the history
…=spastorino

Reject closures in patterns

Fixes rust-lang#90013.
  • Loading branch information
JohnTitor committed Oct 21, 2021
2 parents ebc8159 + c97cf7f commit b678d34
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 1 deletion.
3 changes: 3 additions & 0 deletions compiler/rustc_mir_build/src/thir/pattern/const_to_pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,9 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> {
traits::NonStructuralMatchTy::Opaque => {
"opaque types cannot be used in patterns".to_string()
}
traits::NonStructuralMatchTy::Closure => {
"closures cannot be used in patterns".to_string()
}
traits::NonStructuralMatchTy::Generator => {
"generators cannot be used in patterns".to_string()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ pub enum NonStructuralMatchTy<'tcx> {
Dynamic,
Foreign,
Opaque,
Closure,
Generator,
Projection,
}
Expand Down Expand Up @@ -154,6 +155,9 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for Search<'a, 'tcx> {
ty::Projection(..) => {
return ControlFlow::Break(NonStructuralMatchTy::Projection);
}
ty::Closure(..) => {
return ControlFlow::Break(NonStructuralMatchTy::Closure);
}
ty::Generator(..) | ty::GeneratorWitness(..) => {
return ControlFlow::Break(NonStructuralMatchTy::Generator);
}
Expand Down Expand Up @@ -197,7 +201,7 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for Search<'a, 'tcx> {
// First check all contained types and then tell the caller to continue searching.
return ty.super_visit_with(self);
}
ty::Closure(..) | ty::Infer(_) | ty::Placeholder(_) | ty::Bound(..) => {
ty::Infer(_) | ty::Placeholder(_) | ty::Bound(..) => {
bug!("unexpected type during structural-match checking: {:?}", ty);
}
ty::Error(_) => {
Expand Down
8 changes: 8 additions & 0 deletions src/test/ui/consts/closure-structural-match-issue-90013.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Regression test for issue 90013.
// check-pass
#![allow(incomplete_features)]
#![feature(inline_const)]

fn main() {
const { || {} };
}
14 changes: 14 additions & 0 deletions src/test/ui/pattern/non-structural-match-types.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// edition:2021
#![allow(incomplete_features)]
#![allow(unreachable_code)]
#![feature(const_async_blocks)]
#![feature(inline_const)]

fn main() {
match loop {} {
const { || {} } => {}, //~ ERROR cannot be used in patterns
}
match loop {} {
const { async {} } => {}, //~ ERROR cannot be used in patterns
}
}
14 changes: 14 additions & 0 deletions src/test/ui/pattern/non-structural-match-types.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error: `[closure@$DIR/non-structural-match-types.rs:9:17: 9:22]` cannot be used in patterns
--> $DIR/non-structural-match-types.rs:9:9
|
LL | const { || {} } => {},
| ^^^^^^^^^^^^^^^

error: `impl Future` cannot be used in patterns
--> $DIR/non-structural-match-types.rs:12:9
|
LL | const { async {} } => {},
| ^^^^^^^^^^^^^^^^^^

error: aborting due to 2 previous errors

0 comments on commit b678d34

Please sign in to comment.