Skip to content

Support inner doc comments in proc_macro #49656

Description

@dtolnay

An inner doc comment //! doc currently incorrectly tokenizes as an outer attribute, #[doc = "//! doc"]. It should be an inner attribute, #![doc = " doc"]. You can see the correct behavior in macro_rules:

macro_rules! tokens {
    (#![doc = $tt:tt]) => {
        println!("{:?}", $tt);
    }
}

fn main() {
    tokens! {
        //! doc
    }
}

Repro script

#!/bin/sh

cargo new --lib repro_macro
cargo new --lib repro

echo >repro_macro/src/lib.rs '
#![feature(proc_macro)]

extern crate proc_macro;
use proc_macro::TokenStream;

#[proc_macro]
pub fn repro(_input: TokenStream) -> TokenStream {
    let mut tts = "//! doc\n".parse::<TokenStream>().unwrap().into_iter();
    println!("{}", tts.next().unwrap());
    println!("{}", tts.next().unwrap());
    TokenStream::empty()
}
'

echo >>repro_macro/Cargo.toml '
[lib]
proc-macro = true
'

echo >repro/src/lib.rs '
#![feature(proc_macro)]

extern crate repro_macro;
repro_macro::repro!();
'

echo >>repro/Cargo.toml '
repro_macro = { path = "../repro_macro" }
'

cargo build --manifest-path repro/Cargo.toml
#
[ doc = "//! doc" ]

@alexcrichton

Activity

  1. alexcrichton commented on Apr 4, 2018

    @alexcrichton
    Member

    I've added a fix for this in #49597

  2. added a commit that references this issue on Apr 4, 2018
    a57b1fb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-decl-macros-2-0Area: Declarative macros 2.0 (#39412)C-bugCategory: This is a bug.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions