From f7b4b88840d872909a67e5f9623281e3e2165fba Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 5 Nov 2017 05:08:41 +0300 Subject: [PATCH] Always report patterns more complex than `mut IDENT` as errors --- src/librustc_passes/ast_validation.rs | 26 ++++++++++++------- src/librustc_passes/diagnostics.rs | 1 + .../compile-fail/no-patterns-in-args-2.rs | 1 - .../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 @@ fn invalid_visibility(&self, vis: &Visibility, span: Span, note: Option<&str>) { } } - fn check_decl_no_pat(&self, decl: &FnDecl, report_err: ReportFn) { + fn check_decl_no_pat(&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 @@ fn visit_expr(&mut self, expr: &'a Expr) { 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 @@ fn visit_item(&mut self, item: &'a Item) { 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 @@ fn visit_item(&mut self, item: &'a Item) { 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 @@ fn foo() {} 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() {} -- 2.44.0