From a4b8366bf1af03f4640eb1a34f3b456b96e49aa4 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 2 Nov 2018 23:39:18 -0400 Subject: [PATCH 1/8] Stabalize allow_irrefutable_patterns --- .../irrefutable-let-patterns.md | 28 ------- src/librustc/lint/builtin.rs | 2 +- src/librustc_mir/hair/pattern/check_match.rs | 46 +++-------- src/libsyntax/feature_gate.rs | 5 +- .../allow_irrefutable_let_patterns.stderr | 8 ++ src/test/ui/error-codes/E0162.rs | 18 ----- src/test/ui/error-codes/E0162.stderr | 9 --- src/test/ui/error-codes/E0165.rs | 19 ----- src/test/ui/error-codes/E0165.stderr | 9 --- ...e-gate-without_gate_irrefutable_pattern.rs | 17 ---- ...te-without_gate_irrefutable_pattern.stderr | 9 --- src/test/ui/if/if-let.rs | 14 ++-- src/test/ui/if/if-let.stderr | 77 ++++++++++++------- src/test/ui/issues/issue-51714.rs | 2 +- src/test/ui/issues/issue-51714.stderr | 13 ++-- ...fail-no_gate_irrefutable_if_let_pattern.rs | 15 ---- ...-no_gate_irrefutable_if_let_pattern.stderr | 9 --- ...fail-with_gate_irrefutable_pattern_deny.rs | 17 ---- ...-with_gate_irrefutable_pattern_deny.stderr | 10 --- src/test/ui/while-let.rs | 8 +- src/test/ui/while-let.stderr | 41 ++++++---- 21 files changed, 117 insertions(+), 259 deletions(-) delete mode 100644 src/doc/unstable-book/src/language-features/irrefutable-let-patterns.md create mode 100644 src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr delete mode 100644 src/test/ui/error-codes/E0162.rs delete mode 100644 src/test/ui/error-codes/E0162.stderr delete mode 100644 src/test/ui/error-codes/E0165.rs delete mode 100644 src/test/ui/error-codes/E0165.stderr delete mode 100644 src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.stderr delete mode 100644 src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.rs delete mode 100644 src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.stderr delete mode 100644 src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.rs delete mode 100644 src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.stderr diff --git a/src/doc/unstable-book/src/language-features/irrefutable-let-patterns.md b/src/doc/unstable-book/src/language-features/irrefutable-let-patterns.md deleted file mode 100644 index 46b843778e810..0000000000000 --- a/src/doc/unstable-book/src/language-features/irrefutable-let-patterns.md +++ /dev/null @@ -1,28 +0,0 @@ -# `irrefutable_let_patterns` - -The tracking issue for this feature is: [#44495] - -[#44495]: https://github.com/rust-lang/rust/issues/44495 - ------------------------- - -This feature changes the way that "irrefutable patterns" are handled -in the `if let` and `while let` forms. An *irrefutable pattern* is one -that cannot fail to match -- for example, the `_` pattern matches any -value, and hence it is "irrefutable". Without this feature, using an -irrefutable pattern in an `if let` gives a hard error (since often -this indicates programmer error). But when the feature is enabled, the -error becomes a lint (since in some cases irrefutable patterns are -expected). This means you can use `#[allow]` to silence the lint: - -```rust -#![feature(irrefutable_let_patterns)] - -#[allow(irrefutable_let_patterns)] -fn main() { - // These two examples used to be errors, but now they - // trigger a lint (that is allowed): - if let _ = 5 {} - while let _ = 5 { break; } -} -``` diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 01d87bdbf6337..c84d1cacb0067 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -290,7 +290,7 @@ declare_lint! { declare_lint! { pub IRREFUTABLE_LET_PATTERNS, - Deny, + Warn, "detects irrefutable patterns in if-let and while-let statements" } diff --git a/src/librustc_mir/hair/pattern/check_match.rs b/src/librustc_mir/hair/pattern/check_match.rs index 32f8752c31be7..790e1126e80a0 100644 --- a/src/librustc_mir/hair/pattern/check_match.rs +++ b/src/librustc_mir/hair/pattern/check_match.rs @@ -363,7 +363,7 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>, { let mut seen = Matrix::empty(); let mut catchall = None; - let mut printed_if_let_err = false; + for (arm_index, &(ref pats, guard)) in arms.iter().enumerate() { for &(pat, hir_pat) in pats { let v = vec![pat]; @@ -372,27 +372,10 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>, NotUseful => { match source { hir::MatchSource::IfLetDesugar { .. } => { - if cx.tcx.features().irrefutable_let_patterns { - cx.tcx.lint_node( - lint::builtin::IRREFUTABLE_LET_PATTERNS, - hir_pat.id, pat.span, - "irrefutable if-let pattern"); - } else { - if printed_if_let_err { - // we already printed an irrefutable if-let pattern error. - // We don't want two, that's just confusing. - } else { - // find the first arm pattern so we can use its span - let &(ref first_arm_pats, _) = &arms[0]; - let first_pat = &first_arm_pats[0]; - let span = first_pat.0.span; - struct_span_err!(cx.tcx.sess, span, E0162, - "irrefutable if-let pattern") - .span_label(span, "irrefutable pattern") - .emit(); - printed_if_let_err = true; - } - } + cx.tcx.lint_node( + lint::builtin::IRREFUTABLE_LET_PATTERNS, + hir_pat.id, pat.span, + "irrefutable if-let pattern"); } hir::MatchSource::WhileLetDesugar => { @@ -407,21 +390,10 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>, }, // The arm with the wildcard pattern. 1 => { - if cx.tcx.features().irrefutable_let_patterns { - cx.tcx.lint_node( - lint::builtin::IRREFUTABLE_LET_PATTERNS, - hir_pat.id, pat.span, - "irrefutable while-let pattern"); - } else { - // find the first arm pattern so we can use its span - let &(ref first_arm_pats, _) = &arms[0]; - let first_pat = &first_arm_pats[0]; - let span = first_pat.0.span; - struct_span_err!(cx.tcx.sess, span, E0165, - "irrefutable while-let pattern") - .span_label(span, "irrefutable pattern") - .emit(); - } + cx.tcx.lint_node( + lint::builtin::IRREFUTABLE_LET_PATTERNS, + hir_pat.id, pat.span, + "irrefutable while-let pattern"); }, _ => bug!(), } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 55652c481bd3f..10ca1cad338bf 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -433,9 +433,6 @@ declare_features! ( // #[doc(alias = "...")] (active, doc_alias, "1.27.0", Some(50146), None), - // Allows irrefutable patterns in if-let and while-let statements (RFC 2086) - (active, irrefutable_let_patterns, "1.27.0", Some(44495), None), - // Allows use of the :literal macro fragment specifier (RFC 1576) (active, macro_literal_matcher, "1.27.0", Some(35625), None), @@ -691,6 +688,8 @@ declare_features! ( // impl Iterator for &mut Iterator // impl Debug for Foo<'_> (accepted, impl_header_lifetime_elision, "1.31.0", Some(15872), None), + // Allows irrefutable patterns in if-let and while-let statements (RFC 2086) + (accepted, irrefutable_let_patterns, "1.32.0", Some(44495), None), ); // If you change this, please modify src/doc/unstable-book as well. You must diff --git a/src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr b/src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr new file mode 100644 index 0000000000000..74941bd24afca --- /dev/null +++ b/src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr @@ -0,0 +1,8 @@ +warning: the feature `irrefutable_let_patterns` has been stable since 1.32.0 and no longer requires an attribute to enable + --> $DIR/allow_irrefutable_let_patterns.rs:12:12 + | +LL | #![feature(irrefutable_let_patterns)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[warn(stable_features)] on by default + diff --git a/src/test/ui/error-codes/E0162.rs b/src/test/ui/error-codes/E0162.rs deleted file mode 100644 index e13b0af6f7977..0000000000000 --- a/src/test/ui/error-codes/E0162.rs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -struct Irrefutable(i32); - -fn main() { - let irr = Irrefutable(0); - if let Irrefutable(x) = irr { //~ ERROR E0162 - println!("{}", x); - } -} diff --git a/src/test/ui/error-codes/E0162.stderr b/src/test/ui/error-codes/E0162.stderr deleted file mode 100644 index 91f402dad59b5..0000000000000 --- a/src/test/ui/error-codes/E0162.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0162]: irrefutable if-let pattern - --> $DIR/E0162.rs:15: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`. diff --git a/src/test/ui/error-codes/E0165.rs b/src/test/ui/error-codes/E0165.rs deleted file mode 100644 index 142635fc6ee45..0000000000000 --- a/src/test/ui/error-codes/E0165.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -struct Irrefutable(i32); - -fn main() { - let irr = Irrefutable(0); - while let Irrefutable(x) = irr { //~ ERROR E0165 - //~| irrefutable pattern - // ... - } -} diff --git a/src/test/ui/error-codes/E0165.stderr b/src/test/ui/error-codes/E0165.stderr deleted file mode 100644 index 66be95e38d2aa..0000000000000 --- a/src/test/ui/error-codes/E0165.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0165]: irrefutable while-let pattern - --> $DIR/E0165.rs:15: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`. diff --git a/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.rs b/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.rs deleted file mode 100644 index 7bcddbb6a2f16..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.rs +++ /dev/null @@ -1,17 +0,0 @@ -// gate-test-irrefutable_let_patterns - -// Copyright 2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#[allow(irrefutable_let_patterns)] -fn main() { - if let _ = 5 {} - //~^ ERROR 15:12: 15:13: irrefutable if-let pattern [E0162] -} diff --git a/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.stderr b/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.stderr deleted file mode 100644 index 2b23962a3042e..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-without_gate_irrefutable_pattern.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0162]: irrefutable if-let pattern - --> $DIR/feature-gate-without_gate_irrefutable_pattern.rs:15:12 - | -LL | if let _ = 5 {} - | ^ irrefutable pattern - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0162`. diff --git a/src/test/ui/if/if-let.rs b/src/test/ui/if/if-let.rs index 1e9144910b053..665bb0354b91c 100644 --- a/src/test/ui/if/if-let.rs +++ b/src/test/ui/if/if-let.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// compile-pass + fn macros() { macro_rules! foo{ ($p:pat, $e:expr, $b:block) => {{ @@ -20,20 +22,20 @@ fn macros() { }} } - foo!(a, 1, { //~ ERROR irrefutable if-let + foo!(a, 1, { //~ warning irrefutable if-let println!("irrefutable pattern"); }); - bar!(a, 1, { //~ ERROR irrefutable if-let + bar!(a, 1, { //~ warning irrefutable if-let println!("irrefutable pattern"); }); } pub fn main() { - if let a = 1 { //~ ERROR irrefutable if-let + if let a = 1 { //~ warning irrefutable if-let println!("irrefutable pattern"); } - if let a = 1 { //~ ERROR irrefutable if-let + if let a = 1 { //~ warning irrefutable if-let println!("irrefutable pattern"); } else if true { println!("else-if in irrefutable if-let"); @@ -43,13 +45,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 { //~ warning irrefutable if-let println!("irrefutable pattern"); } if true { println!("if"); - } else if let a = 1 { //~ ERROR irrefutable if-let + } else if let a = 1 { //~ warning irrefutable if-let println!("irrefutable pattern"); } } diff --git a/src/test/ui/if/if-let.stderr b/src/test/ui/if/if-let.stderr index de8d6feb3c4c8..b0c6e3dc90f2a 100644 --- a/src/test/ui/if/if-let.stderr +++ b/src/test/ui/if/if-let.stderr @@ -1,39 +1,62 @@ -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:23:10 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:16:13 | -LL | foo!(a, 1, { //~ ERROR irrefutable if-let - | ^ irrefutable pattern - -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:26:10 +LL | if let $p = $e $b + | ^^ +... +LL | / foo!(a, 1, { //~ warning 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:32:12 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:16:13 | -LL | if let a = 1 { //~ ERROR irrefutable if-let - | ^ irrefutable pattern +LL | if let $p = $e $b + | ^^ +... +LL | / bar!(a, 1, { //~ warning irrefutable if-let +LL | | println!("irrefutable pattern"); +LL | | }); + | |_______- in this macro invocation -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:36:12 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:34:5 | -LL | if let a = 1 { //~ ERROR irrefutable if-let - | ^ irrefutable pattern +LL | / if let a = 1 { //~ warning irrefutable if-let +LL | | println!("irrefutable pattern"); +LL | | } + | |_____^ -error[E0162]: irrefutable if-let pattern - --> $DIR/if-let.rs:46:19 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:38:5 | -LL | } else if let a = 1 { //~ ERROR irrefutable if-let - | ^ irrefutable pattern +LL | / if let a = 1 { //~ warning 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:52:19 +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:48:12 | -LL | } else if let a = 1 { //~ ERROR irrefutable if-let - | ^ irrefutable pattern +LL | } else if let a = 1 { //~ warning irrefutable if-let + | ____________^ +LL | | println!("irrefutable pattern"); +LL | | } + | |_____^ -error: aborting due to 6 previous errors +warning: irrefutable if-let pattern + --> $DIR/if-let.rs:54:12 + | +LL | } else if let a = 1 { //~ warning irrefutable if-let + | ____________^ +LL | | println!("irrefutable pattern"); +LL | | } + | |_____^ -For more information about this error, try `rustc --explain E0162`. diff --git a/src/test/ui/issues/issue-51714.rs b/src/test/ui/issues/issue-51714.rs index 2b9d51f81b988..231f752fefa22 100644 --- a/src/test/ui/issues/issue-51714.rs +++ b/src/test/ui/issues/issue-51714.rs @@ -20,5 +20,5 @@ fn main() { [(); return while let Some(n) = Some(0) {}]; //~^ ERROR return statement outside of function body - //~^^ ERROR irrefutable while-let pattern + //~^^ warning irrefutable while-let pattern } diff --git a/src/test/ui/issues/issue-51714.stderr b/src/test/ui/issues/issue-51714.stderr index ddc70bfb38e01..ace5daabf838d 100644 --- a/src/test/ui/issues/issue-51714.stderr +++ b/src/test/ui/issues/issue-51714.stderr @@ -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:21:27 +warning: irrefutable while-let pattern + --> $DIR/issue-51714.rs:21: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`. diff --git a/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.rs b/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.rs deleted file mode 100644 index 8c9a24f4e7222..0000000000000 --- a/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.rs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// should-fail-irrefutable_let_patterns -fn main() { - if let _ = 5 {} - //~^ ERROR irrefutable if-let pattern [E0162] -} diff --git a/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.stderr b/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.stderr deleted file mode 100644 index d8570ad4e83e4..0000000000000 --- a/src/test/ui/should-fail-no_gate_irrefutable_if_let_pattern.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0162]: irrefutable if-let pattern - --> $DIR/should-fail-no_gate_irrefutable_if_let_pattern.rs:13:12 - | -LL | if let _ = 5 {} - | ^ irrefutable pattern - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0162`. diff --git a/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.rs b/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.rs deleted file mode 100644 index 6f95f10c0d93f..0000000000000 --- a/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#![feature(irrefutable_let_patterns)] - -// should-fail-irrefutable_let_patterns_with_gate -fn main() { - if let _ = 5 {} - //~^ ERROR irrefutable if-let pattern [irrefutable_let_patterns] -} diff --git a/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.stderr b/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.stderr deleted file mode 100644 index 9dc0d1968e601..0000000000000 --- a/src/test/ui/should-fail-with_gate_irrefutable_pattern_deny.stderr +++ /dev/null @@ -1,10 +0,0 @@ -error: irrefutable if-let pattern - --> $DIR/should-fail-with_gate_irrefutable_pattern_deny.rs:15:5 - | -LL | if let _ = 5 {} - | ^^^^^^^^^^^^^^^ - | - = note: #[deny(irrefutable_let_patterns)] on by default - -error: aborting due to previous error - diff --git a/src/test/ui/while-let.rs b/src/test/ui/while-let.rs index a70dcccd4e85e..957f1b116d793 100644 --- a/src/test/ui/while-let.rs +++ b/src/test/ui/while-let.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// compile-pass + fn macros() { macro_rules! foo{ ($p:pat, $e:expr, $b:block) => {{ @@ -20,16 +22,16 @@ fn macros() { }} } - foo!(a, 1, { //~ ERROR irrefutable while-let + foo!(a, 1, { //~ warning irrefutable while-let println!("irrefutable pattern"); }); - bar!(a, 1, { //~ ERROR irrefutable while-let + bar!(a, 1, { //~ warning irrefutable while-let println!("irrefutable pattern"); }); } pub fn main() { - while let a = 1 { //~ ERROR irrefutable while-let + while let a = 1 { //~ warning irrefutable while-let println!("irrefutable pattern"); } } diff --git a/src/test/ui/while-let.stderr b/src/test/ui/while-let.stderr index de4d8be212e43..d5f2b1acdb19a 100644 --- a/src/test/ui/while-let.stderr +++ b/src/test/ui/while-let.stderr @@ -1,21 +1,32 @@ -error[E0165]: irrefutable while-let pattern - --> $DIR/while-let.rs:23:10 +warning: irrefutable while-let pattern + --> $DIR/while-let.rs:16:13 | -LL | foo!(a, 1, { //~ ERROR irrefutable while-let - | ^ irrefutable pattern - -error[E0165]: irrefutable while-let pattern - --> $DIR/while-let.rs:26:10 +LL | while let $p = $e $b + | ^^^^^ +... +LL | / foo!(a, 1, { //~ warning 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:32:15 +warning: irrefutable while-let pattern + --> $DIR/while-let.rs:16:13 | -LL | while let a = 1 { //~ ERROR irrefutable while-let - | ^ irrefutable pattern +LL | while let $p = $e $b + | ^^^^^ +... +LL | / bar!(a, 1, { //~ warning 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:34:5 + | +LL | / while let a = 1 { //~ warning irrefutable while-let +LL | | println!("irrefutable pattern"); +LL | | } + | |_____^ -For more information about this error, try `rustc --explain E0165`. From 1e371f8029f1aa98e5056b124ee8cf3d494951db Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 9 Nov 2018 17:34:37 -0500 Subject: [PATCH 2/8] added and updated tests --- src/test/run-pass/allow-irrefutable-if-let.rs | 16 ++++++++++++++++ src/test/run-pass/allow-irrefutable-while-let.rs | 16 ++++++++++++++++ .../allow_irrefutable_let_patterns.rs | 0 .../allow_irrefutable_let_patterns.stderr | 0 .../deny-irrefutable-if-let.rs | 16 ++++++++++++++++ .../deny-irrefutable-if-let.stderr | 16 ++++++++++++++++ .../deny-irrefutable-while-let.rs | 16 ++++++++++++++++ .../deny-irrefutable-while-let.stderr | 16 ++++++++++++++++ 8 files changed, 96 insertions(+) create mode 100644 src/test/run-pass/allow-irrefutable-if-let.rs create mode 100644 src/test/run-pass/allow-irrefutable-while-let.rs rename src/test/{run-pass/binding => ui/rfc-2086-irrefutable_let_patterns}/allow_irrefutable_let_patterns.rs (100%) rename src/test/{run-pass/binding => ui/rfc-2086-irrefutable_let_patterns}/allow_irrefutable_let_patterns.stderr (100%) create mode 100644 src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-if-let.rs create mode 100644 src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-if-let.stderr create mode 100644 src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-while-let.rs create mode 100644 src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-while-let.stderr diff --git a/src/test/run-pass/allow-irrefutable-if-let.rs b/src/test/run-pass/allow-irrefutable-if-let.rs new file mode 100644 index 0000000000000..bc3c4d1bf7994 --- /dev/null +++ b/src/test/run-pass/allow-irrefutable-if-let.rs @@ -0,0 +1,16 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[allow(irrefutable_let_patterns)] +fn main() { + if let _ = 5 { + let _x = 1; + } +} diff --git a/src/test/run-pass/allow-irrefutable-while-let.rs b/src/test/run-pass/allow-irrefutable-while-let.rs new file mode 100644 index 0000000000000..1590ffd5293d0 --- /dev/null +++ b/src/test/run-pass/allow-irrefutable-while-let.rs @@ -0,0 +1,16 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[allow(irrefutable_let_patterns)] +fn main() { + while let _ = 5 { + break; + } +} diff --git a/src/test/run-pass/binding/allow_irrefutable_let_patterns.rs b/src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.rs similarity index 100% rename from src/test/run-pass/binding/allow_irrefutable_let_patterns.rs rename to src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.rs diff --git a/src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr b/src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.stderr similarity index 100% rename from src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr rename to src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.stderr diff --git a/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-if-let.rs b/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-if-let.rs new file mode 100644 index 0000000000000..c6ac7127211f8 --- /dev/null +++ b/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-if-let.rs @@ -0,0 +1,16 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[deny(irrefutable_let_patterns)] +fn main() { + if let _ = 5 { + let _x = 1; + } +} diff --git a/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-if-let.stderr b/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-if-let.stderr new file mode 100644 index 0000000000000..d3812e30398ce --- /dev/null +++ b/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-if-let.stderr @@ -0,0 +1,16 @@ +error: irrefutable if-let pattern + --> $DIR/deny-irrefutable-if-let.rs:13:5 + | +LL | / if let _ = 5 { +LL | | let _x = 1; +LL | | } + | |_____^ + | +note: lint level defined here + --> $DIR/deny-irrefutable-if-let.rs:11:8 + | +LL | #[deny(irrefutable_let_patterns)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-while-let.rs b/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-while-let.rs new file mode 100644 index 0000000000000..598b2d90df68e --- /dev/null +++ b/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-while-let.rs @@ -0,0 +1,16 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[deny(irrefutable_let_patterns)] +fn main() { + while let _ = 5 { + break; + } +} diff --git a/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-while-let.stderr b/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-while-let.stderr new file mode 100644 index 0000000000000..8b002a59f3eb9 --- /dev/null +++ b/src/test/ui/rfc-2086-irrefutable_let_patterns/deny-irrefutable-while-let.stderr @@ -0,0 +1,16 @@ +error: irrefutable while-let pattern + --> $DIR/deny-irrefutable-while-let.rs:13:5 + | +LL | / while let _ = 5 { +LL | | break; +LL | | } + | |_____^ + | +note: lint level defined here + --> $DIR/deny-irrefutable-while-let.rs:11:8 + | +LL | #[deny(irrefutable_let_patterns)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + From 751e13d4fecd3b19140a33695d5647f2359de984 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Sun, 2 Dec 2018 13:44:39 -0500 Subject: [PATCH 3/8] add stderr --- .../binding/allow_irrefutable_let_patterns.stderr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr diff --git a/src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr b/src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr new file mode 100644 index 0000000000000..1d0b39219e406 --- /dev/null +++ b/src/test/run-pass/binding/allow_irrefutable_let_patterns.stderr @@ -0,0 +1,8 @@ +warning: the feature `irrefutable_let_patterns` has been stable since 1.32.0 and no longer requires an attribute to enable + + --> $DIR/allow_irrefutable_let_patterns.rs:12:12 + | +LL | #![feature(irrefutable_let_patterns)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[warn(stable_features)] on by default From 12492a9e42a1bd151a069cfe32b23d320f26565a Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 3 Dec 2018 12:59:44 -0500 Subject: [PATCH 4/8] fixed diagnostic text --- src/librustc_mir/diagnostics.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/librustc_mir/diagnostics.rs b/src/librustc_mir/diagnostics.rs index 56a9daf84f768..7f0754e8eaf4f 100644 --- a/src/librustc_mir/diagnostics.rs +++ b/src/librustc_mir/diagnostics.rs @@ -335,6 +335,8 @@ match Some(42) { "##, E0162: r##" +#### Note: this error code is no longer emitted by the compiler. + An if-let pattern attempts to match the pattern, and enters the body if the match was successful. If the match is irrefutable (when it cannot fail to match), use a regular `let`-binding instead. For instance: @@ -362,6 +364,8 @@ println!("{}", x); "##, E0165: r##" +#### Note: this error code is no longer emitted by the compiler. + A while-let pattern attempts to match the pattern, and enters the body if the match was successful. If the match is irrefutable (when it cannot fail to match), use a regular `let`-binding inside a `loop` instead. For instance: From 95f56e5df91bafed61d5f61c203930ed8513c882 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 3 Dec 2018 13:10:01 -0500 Subject: [PATCH 5/8] Fixed the inline code --- src/librustc_mir/diagnostics.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/diagnostics.rs b/src/librustc_mir/diagnostics.rs index 7f0754e8eaf4f..6682972349402 100644 --- a/src/librustc_mir/diagnostics.rs +++ b/src/librustc_mir/diagnostics.rs @@ -341,7 +341,7 @@ An if-let pattern attempts to match the pattern, and enters the body if the match was successful. If the match is irrefutable (when it cannot fail to match), use a regular `let`-binding instead. For instance: -```compile_fail,E0162 +```compile_pass struct Irrefutable(i32); let irr = Irrefutable(0); @@ -370,7 +370,7 @@ A while-let pattern attempts to match the pattern, and enters the body if the match was successful. If the match is irrefutable (when it cannot fail to match), use a regular `let`-binding inside a `loop` instead. For instance: -```compile_fail,E0165 +```compile_pass,no_run struct Irrefutable(i32); let irr = Irrefutable(0); From 3e6940abdeb5551f4276fdbfb56ac435b50099fd Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 5 Dec 2018 17:25:25 -0500 Subject: [PATCH 6/8] Removed erronious feaure_gate to `macro_literal_matcher` --- src/libsyntax/feature_gate.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index abbb6af6894a0..ffeccaf0c1c5b 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -430,9 +430,6 @@ declare_features! ( // #[doc(alias = "...")] (active, doc_alias, "1.27.0", Some(50146), None), - // Allows use of the :literal macro fragment specifier (RFC 1576) - (active, macro_literal_matcher, "1.27.0", Some(35625), None), - // inconsistent bounds in where clauses (active, trivial_bounds, "1.28.0", Some(48214), None), From b67d0f555ad8262a85fec29244b534a818e61865 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 5 Dec 2018 17:28:14 -0500 Subject: [PATCH 7/8] Removed line from test File: allow_irrefutable_let_patterns.rs --- .../allow_irrefutable_let_patterns.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.rs b/src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.rs index 866784e517c7d..c0dbde77b3f0f 100644 --- a/src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.rs +++ b/src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.rs @@ -9,7 +9,6 @@ // except according to those terms. // run-pass -#![feature(irrefutable_let_patterns)] // must-compile-successfully-irrefutable_let_patterns_with_gate #[allow(irrefutable_let_patterns)] From 0fe89939134e130ce909c56e7dfb85e489d4e575 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 5 Dec 2018 17:28:40 -0500 Subject: [PATCH 8/8] Removed unnecessary stderr file --- .../allow_irrefutable_let_patterns.stderr | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.stderr diff --git a/src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.stderr b/src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.stderr deleted file mode 100644 index 74941bd24afca..0000000000000 --- a/src/test/ui/rfc-2086-irrefutable_let_patterns/allow_irrefutable_let_patterns.stderr +++ /dev/null @@ -1,8 +0,0 @@ -warning: the feature `irrefutable_let_patterns` has been stable since 1.32.0 and no longer requires an attribute to enable - --> $DIR/allow_irrefutable_let_patterns.rs:12:12 - | -LL | #![feature(irrefutable_let_patterns)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: #[warn(stable_features)] on by default -