about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBarosl Lee <vcs@barosl.com>2015-07-02 03:55:18 +0900
committerBarosl Lee <vcs@barosl.com>2015-07-10 01:30:52 +0900
commit5c60d1d902da615a770ef211217a46d92b3aaae7 (patch)
tree76dc3b63f7892c17d5a28159eabf5edec77a9a82
parent92a95fe5507a41bdfb055913bec1be24509a5146 (diff)
downloadrust-5c60d1d902da615a770ef211217a46d92b3aaae7.tar.gz
rust-5c60d1d902da615a770ef211217a46d92b3aaae7.zip
Preserve escape sequences in documentation comments on macro expansion
Escape sequences in documentation comments must not be parsed as a
normal string when expanding a macro, otherwise some innocent but
invalid-escape-sequence-looking comments will trigger an ICE.

Although this commit replaces normal string literals with raw string
literals in macro expansion, this shouldn't be much a problem
considering documentation comments are converted into attributes before
being passed to a macro anyways.

Fixes #25929.
Fixes #25943.
-rw-r--r--src/libsyntax/ast.rs2
-rw-r--r--src/test/run-pass/macro-doc-escapes.rs25
2 files changed, 26 insertions, 1 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index e844b206cc0..a944acad84d 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -1104,7 +1104,7 @@ impl TokenTree {
                     tts: vec![TtToken(sp, token::Ident(token::str_to_ident("doc"),
                                                        token::Plain)),
                               TtToken(sp, token::Eq),
-                              TtToken(sp, token::Literal(token::Str_(name), None))],
+                              TtToken(sp, token::Literal(token::StrRaw(name, 0), None))],
                     close_span: sp,
                 }))
             }
diff --git a/src/test/run-pass/macro-doc-escapes.rs b/src/test/run-pass/macro-doc-escapes.rs
new file mode 100644
index 00000000000..ea92f0ffebe
--- /dev/null
+++ b/src/test/run-pass/macro-doc-escapes.rs
@@ -0,0 +1,25 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// When expanding a macro, documentation attributes (including documentation comments) must be
+// passed "as is" without being parsed. Otherwise, some text will be incorrectly interpreted as
+// escape sequences, leading to an ICE.
+//
+// Related issues: #25929, #25943
+
+macro_rules! homura {
+    (#[$x:meta]) => ()
+}
+
+homura! {
+    /// \madoka \x41
+}
+
+fn main() { }