about summary refs log tree commit diff
path: root/src/comp/syntax
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-11-16 12:32:38 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2011-11-18 12:49:00 +0100
commit4e0311214160ea0dc7d1ff7347db6c6550c79de2 (patch)
treec4024b2ab58c93b1441e887e0f3e93936d2dc530 /src/comp/syntax
parent6297fc979ee715c276b5303decf2220e70629917 (diff)
downloadrust-4e0311214160ea0dc7d1ff7347db6c6550c79de2.tar.gz
rust-4e0311214160ea0dc7d1ff7347db6c6550c79de2.zip
Add a pass-by-copy parameter passing convention
This is intended to solve the problem of how to pass arguments to
constructor functions -- you want to move in rvalues, but not have to
explicitly copy stuff that is not an rvalue. The by-copy passing
convention will ensure the callee gets its own copy of the value. For
rvalues, it'll just pass off the value. For lvalues, it'll make a
copy.

Issue #1177
Diffstat (limited to 'src/comp/syntax')
-rw-r--r--src/comp/syntax/ast.rs2
-rw-r--r--src/comp/syntax/parse/parser.rs5
-rw-r--r--src/comp/syntax/print/pprust.rs3
3 files changed, 7 insertions, 3 deletions
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs
index b77c58709ae..b5164b54c6c 100644
--- a/src/comp/syntax/ast.rs
+++ b/src/comp/syntax/ast.rs
@@ -144,7 +144,7 @@ tag unop {
     deref; not; neg;
 }
 
-tag mode { by_ref; by_val; by_mut_ref; by_move; mode_infer; }
+tag mode { by_ref; by_val; by_mut_ref; by_move; by_copy; mode_infer; }
 
 type stmt = spanned<stmt_>;
 
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 3731a6af7d0..d33bd89d5d8 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -573,7 +573,10 @@ fn parse_arg_mode(p: parser) -> ast::mode {
     if eat(p, token::BINOP(token::AND)) { ast::by_mut_ref }
     else if eat(p, token::BINOP(token::MINUS)) { ast::by_move }
     else if eat(p, token::ANDAND) { ast::by_ref }
-    else if eat(p, token::BINOP(token::PLUS)) { ast::by_val }
+    else if eat(p, token::BINOP(token::PLUS)) {
+        if eat(p, token::BINOP(token::PLUS)) { ast::by_val }
+        else { ast::by_copy }
+    }
     else { ast::mode_infer }
 }
 
diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs
index b5c466bd308..dc09187e062 100644
--- a/src/comp/syntax/print/pprust.rs
+++ b/src/comp/syntax/print/pprust.rs
@@ -1161,7 +1161,8 @@ fn print_arg_mode(s: ps, m: ast::mode) {
       ast::by_mut_ref. { word(s.s, "&"); }
       ast::by_move. { word(s.s, "-"); }
       ast::by_ref. { word(s.s, "&&"); }
-      ast::by_val. { word(s.s, "+"); }
+      ast::by_val. { word(s.s, "++"); }
+      ast::by_copy. { word(s.s, "+"); }
       ast::mode_infer. {}
     }
 }