about summary refs log tree commit diff
path: root/src/rustc
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-08-07 07:14:44 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-08-07 07:14:44 -0700
commit7d374bde4354eddd37bd548d8d8c33a2bc07d2c0 (patch)
tree1cab86c57470d60b73afaebbb48d4ed8fe169af9 /src/rustc
parentdbef6e593dfb1b164c6750ee99ca2b80c249c4f5 (diff)
downloadrust-7d374bde4354eddd37bd548d8d8c33a2bc07d2c0.tar.gz
rust-7d374bde4354eddd37bd548d8d8c33a2bc07d2c0.zip
add lint mode for deprecated pattern usage
Diffstat (limited to 'src/rustc')
-rw-r--r--src/rustc/middle/lint.rs42
-rw-r--r--src/rustc/rustc.rc1
2 files changed, 37 insertions, 6 deletions
diff --git a/src/rustc/middle/lint.rs b/src/rustc/middle/lint.rs
index 4de9bf8e17d..638c583ba9a 100644
--- a/src/rustc/middle/lint.rs
+++ b/src/rustc/middle/lint.rs
@@ -8,7 +8,9 @@ import std::map::{map,hashmap,int_hash,hash_from_strs};
 import std::smallintmap::{map,smallintmap};
 import io::writer_util;
 import util::ppaux::{ty_to_str};
-import syntax::print::pprust::{expr_to_str, mode_to_str};
+import middle::pat_util::{pat_bindings};
+import syntax::ast_util::{path_to_ident};
+import syntax::print::pprust::{expr_to_str, mode_to_str, pat_to_str};
 export lint, ctypes, unused_imports, while_true, path_statement, old_vecs;
 export unrecognized_lint, non_implicitly_copyable_typarams;
 export vecs_implicitly_copyable, implicit_copies;
@@ -49,6 +51,7 @@ enum lint {
     non_implicitly_copyable_typarams,
     vecs_implicitly_copyable,
     deprecated_mode,
+    deprecated_pattern,
     non_camel_case_types
 }
 
@@ -140,6 +143,11 @@ fn get_lint_dict() -> lint_dict {
            desc: ~"warn about deprecated uses of modes",
            default: allow}),
 
+        (~"deprecated_pattern",
+         @{lint: deprecated_pattern,
+           desc: ~"warn about deprecated uses of pattern bindings",
+           default: allow}),
+
         (~"non_camel_case_types",
          @{lint: non_camel_case_types,
            desc: ~"types, variants and traits must have camel case names",
@@ -474,6 +482,27 @@ fn check_item_non_camel_case_types(cx: ty::ctxt, it: @ast::item) {
     }
 }
 
+fn check_pat(tcx: ty::ctxt, pat: @ast::pat) {
+    debug!{"lint check_pat pat=%s", pat_to_str(pat)};
+
+    do pat_bindings(tcx.def_map, pat) |binding_mode, id, span, path| {
+        match binding_mode {
+          ast::bind_by_ref(_) | ast::bind_by_value => {}
+          ast::bind_by_implicit_ref => {
+            let pat_ty = ty::node_id_to_type(tcx, id);
+            let kind = ty::type_kind(tcx, pat_ty);
+            if !ty::kind_is_safe_for_default_mode(kind) {
+                tcx.sess.span_lint(
+                    deprecated_pattern, id, id,
+                    span,
+                    fmt!{"binding `%s` should use ref or copy mode",
+                         *path_to_ident(path)});
+            }
+          }
+        }
+    }
+}
+
 fn check_fn(tcx: ty::ctxt, fk: visit::fn_kind, decl: ast::fn_decl,
             _body: ast::blk, span: span, id: ast::node_id) {
     debug!{"lint check_fn fk=%? id=%?", fk, id};
@@ -527,11 +556,12 @@ fn check_fn(tcx: ty::ctxt, fk: visit::fn_kind, decl: ast::fn_decl,
 fn check_crate(tcx: ty::ctxt, crate: @ast::crate) {
 
     let v = visit::mk_simple_visitor(@{
-        visit_item:
-            |it| check_item(it, tcx),
-        visit_fn:
-            |fk, decl, body, span, id| check_fn(tcx, fk, decl, body,
-                                                span, id),
+        visit_item: |it|
+            check_item(it, tcx),
+        visit_fn: |fk, decl, body, span, id|
+            check_fn(tcx, fk, decl, body, span, id),
+        visit_pat: |pat|
+            check_pat(tcx, pat),
         with *visit::default_simple_visitor()
     });
     visit::visit_crate(*crate, (), v);
diff --git a/src/rustc/rustc.rc b/src/rustc/rustc.rc
index 99a32d3a4ab..ce921f6d39a 100644
--- a/src/rustc/rustc.rc
+++ b/src/rustc/rustc.rc
@@ -12,6 +12,7 @@
 #[no_core];
 
 #[allow(vecs_implicitly_copyable)];
+// #[warn(deprecated_pattern)];
 
 use core(vers = "0.3");
 use std(vers = "0.3");