diff --git a/src/stable.rs b/src/stable.rs index ad9870ce..7bcdaad9 100644 --- a/src/stable.rs +++ b/src/stable.rs @@ -1198,6 +1198,11 @@ fn op(input: Cursor) -> PResult { } fn op_char(input: Cursor) -> PResult { + if input.starts_with("//") || input.starts_with("/*") { + // Do not accept `/` of a comment as an op. + return Err(LexError); + } + let mut chars = input.chars(); let first = match chars.next() { Some(ch) => ch, diff --git a/tests/test.rs b/tests/test.rs index caed47ce..5ed21a4f 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -2,7 +2,7 @@ extern crate proc_macro2; use std::str::{self, FromStr}; -use proc_macro2::{Literal, Span, Term, TokenStream, TokenTree}; +use proc_macro2::{Literal, Spacing, Span, Term, TokenStream, TokenTree}; #[test] fn terms() { @@ -293,6 +293,18 @@ fn tricky_doc_comment() { assert!(tokens.len() == 3, "not length 3 -- {:?}", tokens); } +#[test] +fn op_before_comment() { + let mut tts = TokenStream::from_str("~// comment").unwrap().into_iter(); + match tts.next().unwrap() { + TokenTree::Op(tt) => { + assert_eq!(tt.op(), '~'); + assert_eq!(tt.spacing(), Spacing::Alone); + } + wrong => panic!("wrong token {:?}", wrong), + } +} + #[test] fn raw_identifier() { let mut tts = TokenStream::from_str("r#dyn").unwrap().into_iter();