about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-09-23 04:39:27 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-09-23 13:30:13 -0500
commitba3eebd41db384c2a46535e8db8c7b2337d55f0b (patch)
tree0a746d1b95cd85358fa07aca67683524c8dd1f79 /src/libsyntax/parse
parent2e7ddee8239ceba5989c5dfd83e9a935775b00d1 (diff)
downloadrust-ba3eebd41db384c2a46535e8db8c7b2337d55f0b.tar.gz
rust-ba3eebd41db384c2a46535e8db8c7b2337d55f0b.zip
Make it illegal to use modes in a fn signature with providing
an explicit variable name. (Step one to changing the defaults)

First step to #3535
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/obsolete.rs8
-rw-r--r--src/libsyntax/parse/parser.rs16
2 files changed, 20 insertions, 4 deletions
diff --git a/src/libsyntax/parse/obsolete.rs b/src/libsyntax/parse/obsolete.rs
index 3891e7b6d17..d787123bf61 100644
--- a/src/libsyntax/parse/obsolete.rs
+++ b/src/libsyntax/parse/obsolete.rs
@@ -21,7 +21,8 @@ pub enum ObsoleteSyntax {
     ObsoleteWith,
     ObsoleteClassMethod,
     ObsoleteClassTraits,
-    ObsoletePrivSection
+    ObsoletePrivSection,
+    ObsoleteModeInFnType
 }
 
 #[cfg(stage0)]
@@ -99,6 +100,11 @@ impl parser : ObsoleteReporter {
                 "the `priv` keyword is applied to individual items, methods, \
                  and fields"
             ),
+            ObsoleteModeInFnType => (
+                "mode without identifier in fn type",
+                "to use a (deprecated) mode in a fn type, you should \
+                 give the argument an explicit name (like `&&v: int`)"
+            ),
         };
 
         self.report(sp, kind, kind_str, desc);
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index a6ad5b35484..f2e7245a1d4 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -19,7 +19,8 @@ use obsolete::{
     ObsoleteReporter, ObsoleteSyntax,
     ObsoleteLowerCaseKindBounds, ObsoleteLet,
     ObsoleteFieldTerminator, ObsoleteStructCtor,
-    ObsoleteWith, ObsoleteClassMethod, ObsoleteClassTraits
+    ObsoleteWith, ObsoleteClassMethod, ObsoleteClassTraits,
+    ObsoleteModeInFnType
 };
 use ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
              bind_by_ref, bind_by_implicit_ref, bind_by_value, bind_by_move,
@@ -618,6 +619,15 @@ impl parser {
             } else { special_idents::invalid }
         };
 
+        match m {
+            expl(_) => {
+                if i == special_idents::invalid {
+                    self.obsolete(copy self.span, ObsoleteModeInFnType);
+                }
+            }
+            _ => {}
+        }
+
         let t = self.parse_ty(false);
 
         {mode: m, ty: t, ident: i, id: self.get_id()}
@@ -1585,7 +1595,7 @@ impl parser {
     }
 
     fn parse_sugary_call_expr(keyword: ~str,
-                              ctor: fn(+@expr) -> expr_) -> @expr {
+                              ctor: fn(+v: @expr) -> expr_) -> @expr {
         let lo = self.last_span;
         // Parse the callee `foo` in
         //    for foo || {
@@ -2400,7 +2410,7 @@ impl parser {
                                     fn(parser) -> arg_or_capture_item)
                             -> (self_ty, fn_decl, capture_clause) {
 
-        fn maybe_parse_self_ty(cnstr: fn(+mutability) -> ast::self_ty_,
+        fn maybe_parse_self_ty(cnstr: fn(+v: mutability) -> ast::self_ty_,
                                p: parser) -> ast::self_ty_ {
             // We need to make sure it isn't a mode or a type
             if p.token_is_keyword(~"self", p.look_ahead(1)) ||