diff --git a/src/fallback.rs b/src/fallback.rs index 08c1de39..80e5cced 100644 --- a/src/fallback.rs +++ b/src/fallback.rs @@ -640,6 +640,10 @@ impl Ident { fn _new(string: &str, raw: bool, span: Span) -> Self { validate_ident(string); + if raw && !Self::can_be_raw(string) { + panic!("`{}` cannot be a raw identifier", string); + } + Ident { sym: string.to_owned(), span, @@ -647,6 +651,13 @@ impl Ident { } } + fn can_be_raw(string: &str) -> bool { + match string { + "" | "_" | "super" | "self" | "Self" | "crate" | "$crate" | "{{root}}" => false, + _ => true, + } + } + pub fn new(string: &str, span: Span) -> Self { Ident::_new(string, false, span) } diff --git a/tests/test.rs b/tests/test.rs index 794e7bf9..ee213fdd 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -21,7 +21,16 @@ fn raw_idents() { "r#String" ); assert_eq!(Ident::new_raw("fn", Span::call_site()).to_string(), "r#fn"); - assert_eq!(Ident::new_raw("_", Span::call_site()).to_string(), "r#_"); +} + +#[test] +#[should_panic(expected = "`_` cannot be a raw identifier")] +fn ident_raw_blocked() { + Ident::new_raw("_", Span::call_site()); + Ident::new_raw("super", Span::call_site()); + Ident::new_raw("self", Span::call_site()); + Ident::new_raw("Self", Span::call_site()); + Ident::new_raw("crate", Span::call_site()); } #[test]