From 5c60d1d902da615a770ef211217a46d92b3aaae7 Mon Sep 17 00:00:00 2001 From: Barosl Lee Date: Thu, 2 Jul 2015 03:55:18 +0900 Subject: [PATCH] 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. --- src/libsyntax/ast.rs | 2 +- src/test/run-pass/macro-doc-escapes.rs | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/macro-doc-escapes.rs 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 or the MIT license +// , 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() { }