diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-11-05 05:08:41 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-11-11 15:45:40 +0300 |
| commit | f7b4b88840d872909a67e5f9623281e3e2165fba (patch) | |
| tree | 25fb38c94bba843e93b0c16fc978854fd2352e90 | |
| parent | 1055bdfb2a5ced99bb47c344c91af2f324ebbb6d (diff) | |
| download | rust-f7b4b88840d872909a67e5f9623281e3e2165fba.tar.gz rust-f7b4b88840d872909a67e5f9623281e3e2165fba.zip | |
Always report patterns more complex than `mut IDENT` as errors
| -rw-r--r-- | src/librustc_passes/ast_validation.rs | 26 | ||||
| -rw-r--r-- | src/librustc_passes/diagnostics.rs | 1 | ||||
| -rw-r--r-- | src/test/compile-fail/no-patterns-in-args-2.rs | 1 | ||||
| -rw-r--r-- | src/test/compile-fail/no-patterns-in-args-macro.rs | 3 |
4 files changed, 18 insertions, 13 deletions
diff --git a/src/librustc_passes/ast_validation.rs b/src/librustc_passes/ast_validation.rs index afa704025b9..40adc6bcb12 100644 --- a/src/librustc_passes/ast_validation.rs +++ b/src/librustc_passes/ast_validation.rs @@ -67,12 +67,14 @@ impl<'a> AstValidator<'a> { } } - fn check_decl_no_pat<ReportFn: Fn(Span)>(&self, decl: &FnDecl, report_err: ReportFn) { + fn check_decl_no_pat<ReportFn: Fn(Span, bool)>(&self, decl: &FnDecl, report_err: ReportFn) { for arg in &decl.inputs { match arg.pat.node { PatKind::Ident(BindingMode::ByValue(Mutability::Immutable), _, None) | PatKind::Wild => {} - _ => report_err(arg.pat.span), + PatKind::Ident(BindingMode::ByValue(Mutability::Mutable), _, None) => + report_err(arg.pat.span, true), + _ => report_err(arg.pat.span, false), } } } @@ -149,7 +151,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> { fn visit_ty(&mut self, ty: &'a Ty) { match ty.node { TyKind::BareFn(ref bfty) => { - self.check_decl_no_pat(&bfty.decl, |span| { + self.check_decl_no_pat(&bfty.decl, |span, _| { struct_span_err!(self.session, span, E0561, "patterns aren't allowed in function pointer types").emit(); }); @@ -253,12 +255,16 @@ impl<'a> Visitor<'a> for AstValidator<'a> { if let TraitItemKind::Method(ref sig, ref block) = trait_item.node { self.check_trait_fn_not_const(sig.constness); if block.is_none() { - self.check_decl_no_pat(&sig.decl, |span| { - self.session.buffer_lint( - lint::builtin::PATTERNS_IN_FNS_WITHOUT_BODY, - trait_item.id, span, - "patterns aren't allowed in methods \ - without bodies"); + self.check_decl_no_pat(&sig.decl, |span, mut_ident| { + if mut_ident { + self.session.buffer_lint( + lint::builtin::PATTERNS_IN_FNS_WITHOUT_BODY, + trait_item.id, span, + "patterns aren't allowed in methods without bodies"); + } else { + struct_span_err!(self.session, span, E0642, + "patterns aren't allowed in methods without bodies").emit(); + } }); } } @@ -292,7 +298,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> { fn visit_foreign_item(&mut self, fi: &'a ForeignItem) { match fi.node { ForeignItemKind::Fn(ref decl, _) => { - self.check_decl_no_pat(decl, |span| { + self.check_decl_no_pat(decl, |span, _| { struct_span_err!(self.session, span, E0130, "patterns aren't allowed in foreign function declarations") .span_label(span, "pattern not allowed in foreign function").emit(); diff --git a/src/librustc_passes/diagnostics.rs b/src/librustc_passes/diagnostics.rs index 1bfa5943ee9..3597a6f1828 100644 --- a/src/librustc_passes/diagnostics.rs +++ b/src/librustc_passes/diagnostics.rs @@ -264,4 +264,5 @@ register_diagnostics! { E0226, // only a single explicit lifetime bound is permitted E0472, // asm! is unsupported on this target E0561, // patterns aren't allowed in function pointer types + E0642, // patterns aren't allowed in methods without bodies } diff --git a/src/test/compile-fail/no-patterns-in-args-2.rs b/src/test/compile-fail/no-patterns-in-args-2.rs index 967c292fa68..4d2412c34a5 100644 --- a/src/test/compile-fail/no-patterns-in-args-2.rs +++ b/src/test/compile-fail/no-patterns-in-args-2.rs @@ -14,7 +14,6 @@ trait Tr { fn f1(mut arg: u8); //~ ERROR patterns aren't allowed in methods without bodies //~^ WARN was previously accepted fn f2(&arg: u8); //~ ERROR patterns aren't allowed in methods without bodies - //~^ WARN was previously accepted fn g1(arg: u8); // OK fn g2(_: u8); // OK #[allow(anonymous_parameters)] diff --git a/src/test/compile-fail/no-patterns-in-args-macro.rs b/src/test/compile-fail/no-patterns-in-args-macro.rs index 3aabd19f6e6..f85ce8f57ea 100644 --- a/src/test/compile-fail/no-patterns-in-args-macro.rs +++ b/src/test/compile-fail/no-patterns-in-args-macro.rs @@ -30,8 +30,7 @@ mod bad_pat { m!((bad, pat)); //~^ ERROR patterns aren't allowed in function pointer types //~| ERROR patterns aren't allowed in foreign function declarations - //~| WARN patterns aren't allowed in methods without bodies - //~| WARN this was previously accepted + //~| ERROR patterns aren't allowed in methods without bodies } fn main() {} |
