From f09b7b0ecd7fc03c9d433632f89b3267f16cd4f8 Mon Sep 17 00:00:00 2001
From: Eduard Burtescu <edy.burt@gmail.com>
Date: Wed, 27 Nov 2013 17:48:58 +0200
Subject: [PATCH] Freeze the AST by removing a couple of unused @mut ~[T] from
 token_tree.

---
 src/libsyntax/ast.rs                | 16 ++++++++++++++--
 src/libsyntax/ext/log_syntax.rs     |  2 +-
 src/libsyntax/ext/tt/macro_rules.rs |  2 +-
 src/libsyntax/ext/tt/transcribe.rs  |  9 ++++-----
 src/libsyntax/fold.rs               |  6 +++---
 src/libsyntax/parse/parser.rs       |  4 ++--
 6 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index b888c8772d0..6e73c6abd0b 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -612,14 +612,14 @@ pub enum token_tree {
     tt_tok(Span, ::parse::token::Token),
     // a delimited sequence (the delimiters appear as the first
     // and last elements of the vector)
-    tt_delim(@mut ~[token_tree]),
+    tt_delim(@~[token_tree]),
 
     // These only make sense for right-hand-sides of MBE macros:
 
     // a kleene-style repetition sequence with a span, a tt_forest,
     // an optional separator, and a boolean where true indicates
     // zero or more (*), and false indicates one or more (+).
-    tt_seq(Span, @mut ~[token_tree], Option<::parse::token::Token>, bool),
+    tt_seq(Span, @~[token_tree], Option<::parse::token::Token>, bool),
 
     // a syntactic variable that will be filled in by macro expansion.
     tt_nonterminal(Span, Ident)
@@ -1180,6 +1180,18 @@ pub enum inlined_item {
     ii_foreign(@foreign_item),
 }
 
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    fn is_freeze<T: Freeze>() {}
+
+    // Assert that the AST remains Freeze (#10693).
+    #[test] fn ast_is_freeze() {
+        is_freeze::<item>();
+    }
+}
+
 /* hold off on tests ... they appear in a later merge.
 #[cfg(test)]
 mod test {
diff --git a/src/libsyntax/ext/log_syntax.rs b/src/libsyntax/ext/log_syntax.rs
index 3e07b16221e..2007abcc81c 100644
--- a/src/libsyntax/ext/log_syntax.rs
+++ b/src/libsyntax/ext/log_syntax.rs
@@ -23,7 +23,7 @@ pub fn expand_syntax_ext(cx: @ExtCtxt,
     cx.print_backtrace();
     println(
         print::pprust::tt_to_str(
-            &ast::tt_delim(@mut tt.to_owned()),
+            &ast::tt_delim(@tt.to_owned()),
             get_ident_interner()));
 
     //trivial expression
diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs
index 3cc00ef8199..8291a76fab6 100644
--- a/src/libsyntax/ext/tt/macro_rules.rs
+++ b/src/libsyntax/ext/tt/macro_rules.rs
@@ -104,7 +104,7 @@ fn generic_extension(cx: @ExtCtxt,
         println!("{}! \\{ {} \\}",
                   cx.str_of(name),
                   print::pprust::tt_to_str(
-                      &ast::tt_delim(@mut arg.to_owned()),
+                      &ast::tt_delim(@arg.to_owned()),
                       get_ident_interner()));
     }
 
diff --git a/src/libsyntax/ext/tt/transcribe.rs b/src/libsyntax/ext/tt/transcribe.rs
index 0f7b92b5b06..1bcfbcf7ab2 100644
--- a/src/libsyntax/ext/tt/transcribe.rs
+++ b/src/libsyntax/ext/tt/transcribe.rs
@@ -22,7 +22,7 @@ use std::option;
 
 ///an unzipping of `token_tree`s
 struct TtFrame {
-    forest: @mut ~[ast::token_tree],
+    forest: @~[ast::token_tree],
     idx: uint,
     dotdotdoted: bool,
     sep: Option<Token>,
@@ -52,7 +52,7 @@ pub fn new_tt_reader(sp_diag: @mut span_handler,
     let r = @mut TtReader {
         sp_diag: sp_diag,
         stack: @mut TtFrame {
-            forest: @mut src,
+            forest: @src,
             idx: 0u,
             dotdotdoted: false,
             sep: None,
@@ -74,7 +74,7 @@ pub fn new_tt_reader(sp_diag: @mut span_handler,
 
 fn dup_tt_frame(f: @mut TtFrame) -> @mut TtFrame {
     @mut TtFrame {
-        forest: @mut (*f.forest).clone(),
+        forest: @(*f.forest).clone(),
         idx: f.idx,
         dotdotdoted: f.dotdotdoted,
         sep: f.sep.clone(),
@@ -175,8 +175,7 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
     loop {
         {
             let stack = &mut *r.stack;
-            let forest = &mut *stack.forest;
-            if stack.idx < forest.len() {
+            if stack.idx < stack.forest.len() {
                 break;
             }
         }
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index 4c0653a3c04..887d3d2014a 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -457,10 +457,10 @@ pub fn fold_tts<T:ast_fold>(tts: &[token_tree], fld: &T) -> ~[token_tree] {
         match *tt {
             tt_tok(span, ref tok) =>
             tt_tok(span,maybe_fold_ident(tok,fld)),
-            tt_delim(ref tts) => tt_delim(@mut fold_tts(**tts, fld)),
-            tt_seq(span, ref pattern, ref sep, is_optional) =>
+            tt_delim(tts) => tt_delim(@fold_tts(*tts, fld)),
+            tt_seq(span, pattern, ref sep, is_optional) =>
             tt_seq(span,
-                   @mut fold_tts(**pattern, fld),
+                   @fold_tts(*pattern, fld),
                    sep.as_ref().map(|tok|maybe_fold_ident(tok,fld)),
                    is_optional),
             tt_nonterminal(sp,ref ident) =>
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index b9a7ec33ee4..fab0de4179e 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2112,7 +2112,7 @@ impl Parser {
                     };
                     tt_seq(
                         mk_sp(sp.lo, p.span.hi),
-                        @mut seq,
+                        @seq,
                         s,
                         z
                     )
@@ -2157,7 +2157,7 @@ impl Parser {
                 result.push(parse_any_tt_tok(self));
                 self.open_braces.pop();
 
-                tt_delim(@mut result)
+                tt_delim(@result)
             }
             _ => parse_non_delim_tt_tok(self)
         }