]> git.lizzy.rs Git - rust.git/commitdiff
Always report patterns more complex than `mut IDENT` as errors
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sun, 5 Nov 2017 02:08:41 +0000 (05:08 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 11 Nov 2017 12:45:40 +0000 (15:45 +0300)
src/librustc_passes/ast_validation.rs
src/librustc_passes/diagnostics.rs
src/test/compile-fail/no-patterns-in-args-2.rs
src/test/compile-fail/no-patterns-in-args-macro.rs

index afa704025b9ad7f8864228a61a09df65cdddf256..40adc6bcb122fb727542c02d9504f246d7593502 100644 (file)
@@ -67,12 +67,14 @@ fn invalid_visibility(&self, vis: &Visibility, span: Span, note: Option<&str>) {
         }
     }
 
-    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 @@ 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();
index 1bfa5943ee90a1849851be8459648cfa34b6018e..3597a6f18287e62e2e9d41640e2b918f8587b84e 100644 (file)
@@ -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
 }
index 967c292fa68d241a3c3e3f12f93a806468b978a4..4d2412c34a5faf46984fe06e6326ba2f68b4641d 100644 (file)
@@ -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)]
index 3aabd19f6e6495993e4ed4e654d265232b2969ff..f85ce8f57ea716e174e9e62cfa31f32a5fcddeb2 100644 (file)
@@ -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() {}