]> git.lizzy.rs Git - rust.git/commitdiff
Preserve escape sequences in documentation comments on macro expansion
authorBarosl Lee <vcs@barosl.com>
Wed, 1 Jul 2015 18:55:18 +0000 (03:55 +0900)
committerBarosl Lee <vcs@barosl.com>
Thu, 9 Jul 2015 16:30:52 +0000 (01:30 +0900)
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.

src/libsyntax/ast.rs
src/test/run-pass/macro-doc-escapes.rs [new file with mode: 0644]

index e844b206cc0a0c0937802d45fda711c9b98dbb47..a944acad84df14188c8acb0aa8d37f65b232dc41 100644 (file)
@@ -1104,7 +1104,7 @@ pub fn get_tt(&self, index: usize) -> 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 (file)
index 0000000..ea92f0f
--- /dev/null
@@ -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() { }