Stabilise irrefutable if-let and while-let patterns
This stabilises RFC 2086 (https://github.com/rust-lang/rust/issues/44495). Co-Authored-By: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
b43986184b
commit
afcb938116
30 changed files with 175 additions and 239 deletions
9
src/test/ui/pattern/deny-irrefutable-let-patterns.rs
Normal file
9
src/test/ui/pattern/deny-irrefutable-let-patterns.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#![deny(irrefutable_let_patterns)]
|
||||
|
||||
fn main() {
|
||||
if let _ = 5 {} //~ ERROR irrefutable if-let pattern
|
||||
|
||||
while let _ = 5 { //~ ERROR irrefutable while-let pattern
|
||||
break;
|
||||
}
|
||||
}
|
||||
22
src/test/ui/pattern/deny-irrefutable-let-patterns.stderr
Normal file
22
src/test/ui/pattern/deny-irrefutable-let-patterns.stderr
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
error: irrefutable if-let pattern
|
||||
--> $DIR/deny-irrefutable-let-patterns.rs:4:5
|
||||
|
|
||||
LL | if let _ = 5 {} //~ ERROR irrefutable if-let pattern
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/deny-irrefutable-let-patterns.rs:1:9
|
||||
|
|
||||
LL | #![deny(irrefutable_let_patterns)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: irrefutable while-let pattern
|
||||
--> $DIR/deny-irrefutable-let-patterns.rs:6:5
|
||||
|
|
||||
LL | / while let _ = 5 { //~ ERROR irrefutable while-let pattern
|
||||
LL | | break;
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
43
src/test/ui/pattern/enum-variant-generic-args.rs
Normal file
43
src/test/ui/pattern/enum-variant-generic-args.rs
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(type_alias_enum_variants)]
|
||||
|
||||
#![allow(irrefutable_let_patterns)]
|
||||
|
||||
#[allow(dead_code)]
|
||||
enum Enum<T> { TSVariant(T), SVariant { v: T } }
|
||||
type Alias<T> = Enum<T>;
|
||||
type AliasFixed = Enum<()>;
|
||||
|
||||
macro_rules! is_variant {
|
||||
(TSVariant, $expr:expr) => (is_variant!(@check TSVariant, (_), $expr));
|
||||
(SVariant, $expr:expr) => (is_variant!(@check SVariant, { v: _ }, $expr));
|
||||
(@check $variant:ident, $matcher:tt, $expr:expr) => (
|
||||
assert!(if let Enum::$variant::<()> $matcher = $expr { true } else { false },
|
||||
"expr does not have correct type");
|
||||
);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// Tuple struct variant
|
||||
|
||||
is_variant!(TSVariant, Enum::TSVariant(()));
|
||||
is_variant!(TSVariant, Enum::TSVariant::<()>(()));
|
||||
is_variant!(TSVariant, Enum::<()>::TSVariant(()));
|
||||
|
||||
is_variant!(TSVariant, Alias::TSVariant(()));
|
||||
is_variant!(TSVariant, Alias::<()>::TSVariant(()));
|
||||
|
||||
is_variant!(TSVariant, AliasFixed::TSVariant(()));
|
||||
|
||||
// Struct variant
|
||||
|
||||
is_variant!(SVariant, Enum::SVariant { v: () });
|
||||
is_variant!(SVariant, Enum::SVariant::<()> { v: () });
|
||||
is_variant!(SVariant, Enum::<()>::SVariant { v: () });
|
||||
|
||||
is_variant!(SVariant, Alias::SVariant { v: () });
|
||||
is_variant!(SVariant, Alias::<()>::SVariant { v: () });
|
||||
|
||||
is_variant!(SVariant, AliasFixed::SVariant { v: () });
|
||||
}
|
||||
11
src/test/ui/pattern/irrefutable-let-patterns.rs
Normal file
11
src/test/ui/pattern/irrefutable-let-patterns.rs
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
// run-pass
|
||||
|
||||
#![allow(irrefutable_let_patterns)]
|
||||
|
||||
fn main() {
|
||||
if let _ = 5 {}
|
||||
|
||||
while let _ = 5 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue