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:
varkor 2019-01-12 03:10:59 +00:00
parent b43986184b
commit afcb938116
30 changed files with 175 additions and 239 deletions

View file

@ -1,8 +0,0 @@
struct Irrefutable(i32);
fn main() {
let irr = Irrefutable(0);
if let Irrefutable(x) = irr { //~ ERROR E0162
println!("{}", x);
}
}

View file

@ -1,9 +0,0 @@
error[E0162]: irrefutable if-let pattern
--> $DIR/E0162.rs:5:12
|
LL | if let Irrefutable(x) = irr { //~ ERROR E0162
| ^^^^^^^^^^^^^^ irrefutable pattern
error: aborting due to previous error
For more information about this error, try `rustc --explain E0162`.

View file

@ -1,9 +0,0 @@
struct Irrefutable(i32);
fn main() {
let irr = Irrefutable(0);
while let Irrefutable(x) = irr { //~ ERROR E0165
//~| irrefutable pattern
// ...
}
}

View file

@ -1,9 +0,0 @@
error[E0165]: irrefutable while-let pattern
--> $DIR/E0165.rs:5:15
|
LL | while let Irrefutable(x) = irr { //~ ERROR E0165
| ^^^^^^^^^^^^^^ irrefutable pattern
error: aborting due to previous error
For more information about this error, try `rustc --explain E0165`.

View file

@ -1,8 +0,0 @@
// gate-test-irrefutable_let_patterns
#[allow(irrefutable_let_patterns)]
fn main() {
if let _ = 5 {}
//~^ ERROR irrefutable if-let pattern [E0162]
}

View file

@ -1,9 +0,0 @@
error[E0162]: irrefutable if-let pattern
--> $DIR/feature-gate-without_gate_irrefutable_pattern.rs:6:12
|
LL | if let _ = 5 {}
| ^ irrefutable pattern
error: aborting due to previous error
For more information about this error, try `rustc --explain E0162`.

View file

@ -1,3 +1,5 @@
// compile-pass
fn macros() {
macro_rules! foo{
($p:pat, $e:expr, $b:block) => {{
@ -10,20 +12,20 @@ fn macros() {
}}
}
foo!(a, 1, { //~ ERROR irrefutable if-let
foo!(a, 1, { //~ WARN irrefutable if-let
println!("irrefutable pattern");
});
bar!(a, 1, { //~ ERROR irrefutable if-let
bar!(a, 1, { //~ WARN irrefutable if-let
println!("irrefutable pattern");
});
}
pub fn main() {
if let a = 1 { //~ ERROR irrefutable if-let
if let a = 1 { //~ WARN irrefutable if-let
println!("irrefutable pattern");
}
if let a = 1 { //~ ERROR irrefutable if-let
if let a = 1 { //~ WARN irrefutable if-let
println!("irrefutable pattern");
} else if true {
println!("else-if in irrefutable if-let");
@ -33,13 +35,13 @@ pub fn main() {
if let 1 = 2 {
println!("refutable pattern");
} else if let a = 1 { //~ ERROR irrefutable if-let
} else if let a = 1 { //~ WARN irrefutable if-let
println!("irrefutable pattern");
}
if true {
println!("if");
} else if let a = 1 { //~ ERROR irrefutable if-let
} else if let a = 1 { //~ WARN irrefutable if-let
println!("irrefutable pattern");
}
}

View file

@ -1,39 +1,62 @@
error[E0162]: irrefutable if-let pattern
--> $DIR/if-let.rs:13:10
warning: irrefutable if-let pattern
--> $DIR/if-let.rs:6:13
|
LL | foo!(a, 1, { //~ ERROR irrefutable if-let
| ^ irrefutable pattern
error[E0162]: irrefutable if-let pattern
--> $DIR/if-let.rs:16:10
LL | if let $p = $e $b
| ^^
...
LL | / foo!(a, 1, { //~ WARN irrefutable if-let
LL | | println!("irrefutable pattern");
LL | | });
| |_______- in this macro invocation
|
LL | bar!(a, 1, { //~ ERROR irrefutable if-let
| ^ irrefutable pattern
= note: #[warn(irrefutable_let_patterns)] on by default
error[E0162]: irrefutable if-let pattern
--> $DIR/if-let.rs:22:12
warning: irrefutable if-let pattern
--> $DIR/if-let.rs:6:13
|
LL | if let a = 1 { //~ ERROR irrefutable if-let
| ^ irrefutable pattern
LL | if let $p = $e $b
| ^^
...
LL | / bar!(a, 1, { //~ WARN irrefutable if-let
LL | | println!("irrefutable pattern");
LL | | });
| |_______- in this macro invocation
error[E0162]: irrefutable if-let pattern
--> $DIR/if-let.rs:26:12
warning: irrefutable if-let pattern
--> $DIR/if-let.rs:24:5
|
LL | if let a = 1 { //~ ERROR irrefutable if-let
| ^ irrefutable pattern
LL | / if let a = 1 { //~ WARN irrefutable if-let
LL | | println!("irrefutable pattern");
LL | | }
| |_____^
error[E0162]: irrefutable if-let pattern
--> $DIR/if-let.rs:36:19
warning: irrefutable if-let pattern
--> $DIR/if-let.rs:28:5
|
LL | } else if let a = 1 { //~ ERROR irrefutable if-let
| ^ irrefutable pattern
LL | / if let a = 1 { //~ WARN irrefutable if-let
LL | | println!("irrefutable pattern");
LL | | } else if true {
LL | | println!("else-if in irrefutable if-let");
LL | | } else {
LL | | println!("else in irrefutable if-let");
LL | | }
| |_____^
error[E0162]: irrefutable if-let pattern
--> $DIR/if-let.rs:42:19
warning: irrefutable if-let pattern
--> $DIR/if-let.rs:38:12
|
LL | } else if let a = 1 { //~ ERROR irrefutable if-let
| ^ irrefutable pattern
LL | } else if let a = 1 { //~ WARN irrefutable if-let
| ____________^
LL | | println!("irrefutable pattern");
LL | | }
| |_____^
error: aborting due to 6 previous errors
warning: irrefutable if-let pattern
--> $DIR/if-let.rs:44:12
|
LL | } else if let a = 1 { //~ WARN irrefutable if-let
| ____________^
LL | | println!("irrefutable pattern");
LL | | }
| |_____^
For more information about this error, try `rustc --explain E0162`.

View file

@ -10,5 +10,5 @@ fn main() {
[(); return while let Some(n) = Some(0) {}];
//~^ ERROR return statement outside of function body
//~^^ ERROR irrefutable while-let pattern
//~^^ WARN irrefutable while-let pattern
}

View file

@ -22,13 +22,14 @@ error[E0572]: return statement outside of function body
LL | [(); return while let Some(n) = Some(0) {}];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0165]: irrefutable while-let pattern
--> $DIR/issue-51714.rs:11:27
warning: irrefutable while-let pattern
--> $DIR/issue-51714.rs:11:17
|
LL | [(); return while let Some(n) = Some(0) {}];
| ^^^^^^^ irrefutable pattern
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: #[warn(irrefutable_let_patterns)] on by default
error: aborting due to 5 previous errors
error: aborting due to 4 previous errors
Some errors occurred: E0165, E0572.
For more information about an error, try `rustc --explain E0165`.
For more information about this error, try `rustc --explain E0572`.

View 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;
}
}

View 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

View 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: () });
}

View file

@ -0,0 +1,11 @@
// run-pass
#![allow(irrefutable_let_patterns)]
fn main() {
if let _ = 5 {}
while let _ = 5 {
break;
}
}

View file

@ -2,7 +2,6 @@
// Enabling `ireffutable_let_patterns` isn't necessary for what this tests, but it makes coming up
// with examples easier.
#![feature(irrefutable_let_patterns)]
#[allow(irrefutable_let_patterns)]
fn main() {

View file

@ -1,5 +1,5 @@
error: ambiguous use of `&&`
--> $DIR/syntax-ambiguity-2015.rs:11:47
--> $DIR/syntax-ambiguity-2015.rs:10:47
|
LL | if let Range { start: _, end: _ } = true..true && false { }
| ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)`
@ -8,7 +8,7 @@ LL | if let Range { start: _, end: _ } = true..true && false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `||`
--> $DIR/syntax-ambiguity-2015.rs:14:47
--> $DIR/syntax-ambiguity-2015.rs:13:47
|
LL | if let Range { start: _, end: _ } = true..true || false { }
| ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)`
@ -17,7 +17,7 @@ LL | if let Range { start: _, end: _ } = true..true || false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `&&`
--> $DIR/syntax-ambiguity-2015.rs:17:50
--> $DIR/syntax-ambiguity-2015.rs:16:50
|
LL | while let Range { start: _, end: _ } = true..true && false { }
| ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)`
@ -26,7 +26,7 @@ LL | while let Range { start: _, end: _ } = true..true && false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `||`
--> $DIR/syntax-ambiguity-2015.rs:20:50
--> $DIR/syntax-ambiguity-2015.rs:19:50
|
LL | while let Range { start: _, end: _ } = true..true || false { }
| ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)`
@ -35,7 +35,7 @@ LL | while let Range { start: _, end: _ } = true..true || false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `&&`
--> $DIR/syntax-ambiguity-2015.rs:23:19
--> $DIR/syntax-ambiguity-2015.rs:22:19
|
LL | if let true = false && false { }
| ^^^^^^^^^^^^^^ help: consider adding parentheses: `(false && false)`
@ -44,7 +44,7 @@ LL | if let true = false && false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `&&`
--> $DIR/syntax-ambiguity-2015.rs:26:22
--> $DIR/syntax-ambiguity-2015.rs:25:22
|
LL | while let true = (1 == 2) && false { }
| ^^^^^^^^^^^^^^^^^ help: consider adding parentheses: `((1 == 2) && false)`

View file

@ -2,7 +2,6 @@
// Enabling `ireffutable_let_patterns` isn't necessary for what this tests, but it makes coming up
// with examples easier.
#![feature(irrefutable_let_patterns)]
#[allow(irrefutable_let_patterns)]
fn main() {

View file

@ -1,5 +1,5 @@
error: ambiguous use of `&&`
--> $DIR/syntax-ambiguity-2018.rs:11:47
--> $DIR/syntax-ambiguity-2018.rs:10:47
|
LL | if let Range { start: _, end: _ } = true..true && false { }
| ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)`
@ -8,7 +8,7 @@ LL | if let Range { start: _, end: _ } = true..true && false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `||`
--> $DIR/syntax-ambiguity-2018.rs:14:47
--> $DIR/syntax-ambiguity-2018.rs:13:47
|
LL | if let Range { start: _, end: _ } = true..true || false { }
| ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)`
@ -17,7 +17,7 @@ LL | if let Range { start: _, end: _ } = true..true || false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `&&`
--> $DIR/syntax-ambiguity-2018.rs:17:50
--> $DIR/syntax-ambiguity-2018.rs:16:50
|
LL | while let Range { start: _, end: _ } = true..true && false { }
| ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)`
@ -26,7 +26,7 @@ LL | while let Range { start: _, end: _ } = true..true && false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `||`
--> $DIR/syntax-ambiguity-2018.rs:20:50
--> $DIR/syntax-ambiguity-2018.rs:19:50
|
LL | while let Range { start: _, end: _ } = true..true || false { }
| ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)`
@ -35,7 +35,7 @@ LL | while let Range { start: _, end: _ } = true..true || false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `&&`
--> $DIR/syntax-ambiguity-2018.rs:23:19
--> $DIR/syntax-ambiguity-2018.rs:22:19
|
LL | if let true = false && false { }
| ^^^^^^^^^^^^^^ help: consider adding parentheses: `(false && false)`
@ -44,7 +44,7 @@ LL | if let true = false && false { }
= note: see rust-lang/rust#53668 for more information
error: ambiguous use of `&&`
--> $DIR/syntax-ambiguity-2018.rs:26:22
--> $DIR/syntax-ambiguity-2018.rs:25:22
|
LL | while let true = (1 == 2) && false { }
| ^^^^^^^^^^^^^^^^^ help: consider adding parentheses: `((1 == 2) && false)`

View file

@ -1,5 +0,0 @@
// should-fail-irrefutable_let_patterns
fn main() {
if let _ = 5 {}
//~^ ERROR irrefutable if-let pattern [E0162]
}

View file

@ -1,9 +0,0 @@
error[E0162]: irrefutable if-let pattern
--> $DIR/should-fail-no_gate_irrefutable_if_let_pattern.rs:3:12
|
LL | if let _ = 5 {}
| ^ irrefutable pattern
error: aborting due to previous error
For more information about this error, try `rustc --explain E0162`.

View file

@ -1,7 +0,0 @@
#![feature(irrefutable_let_patterns)]
// should-fail-irrefutable_let_patterns_with_gate
fn main() {
if let _ = 5 {}
//~^ ERROR irrefutable if-let pattern [irrefutable_let_patterns]
}

View file

@ -1,10 +0,0 @@
error: irrefutable if-let pattern
--> $DIR/should-fail-with_gate_irrefutable_pattern_deny.rs:5:5
|
LL | if let _ = 5 {}
| ^^^^^^^^^^^^^^^
|
= note: #[deny(irrefutable_let_patterns)] on by default
error: aborting due to previous error

View file

@ -1,3 +1,5 @@
// run-pass
fn macros() {
macro_rules! foo{
($p:pat, $e:expr, $b:block) => {{
@ -10,16 +12,17 @@ fn macros() {
}}
}
foo!(a, 1, { //~ ERROR irrefutable while-let
foo!(a, 1, { //~ WARN irrefutable while-let
println!("irrefutable pattern");
});
bar!(a, 1, { //~ ERROR irrefutable while-let
bar!(a, 1, { //~ WARN irrefutable while-let
println!("irrefutable pattern");
});
}
pub fn main() {
while let a = 1 { //~ ERROR irrefutable while-let
while let a = 1 { //~ WARN irrefutable while-let
println!("irrefutable pattern");
break;
}
}

View file

@ -1,21 +1,32 @@
error[E0165]: irrefutable while-let pattern
--> $DIR/while-let.rs:13:10
warning: irrefutable while-let pattern
--> $DIR/while-let.rs:6:13
|
LL | foo!(a, 1, { //~ ERROR irrefutable while-let
| ^ irrefutable pattern
error[E0165]: irrefutable while-let pattern
--> $DIR/while-let.rs:16:10
LL | while let $p = $e $b
| ^^^^^
...
LL | / foo!(a, 1, { //~ WARN irrefutable while-let
LL | | println!("irrefutable pattern");
LL | | });
| |_______- in this macro invocation
|
LL | bar!(a, 1, { //~ ERROR irrefutable while-let
| ^ irrefutable pattern
= note: #[warn(irrefutable_let_patterns)] on by default
error[E0165]: irrefutable while-let pattern
--> $DIR/while-let.rs:22:15
warning: irrefutable while-let pattern
--> $DIR/while-let.rs:6:13
|
LL | while let a = 1 { //~ ERROR irrefutable while-let
| ^ irrefutable pattern
LL | while let $p = $e $b
| ^^^^^
...
LL | / bar!(a, 1, { //~ WARN irrefutable while-let
LL | | println!("irrefutable pattern");
LL | | });
| |_______- in this macro invocation
error: aborting due to 3 previous errors
warning: irrefutable while-let pattern
--> $DIR/while-let.rs:24:5
|
LL | / while let a = 1 { //~ WARN irrefutable while-let
LL | | println!("irrefutable pattern");
LL | | }
| |_____^
For more information about this error, try `rustc --explain E0165`.