//@ check-pass //@ revisions:e2015 e2018 e2021 e2024 //@[e2015] edition:2015 //@[e2018] edition:2018 //@[e2021] edition:2021 //@[e2024] edition:2024 // Ensure that all (usable as identifier) keywords work as raw identifiers in all positions. // This was motivated by issue #137128, where `r#move`/`r#static`` did not work as `const` names // due to a parser check not acounting for raw identifiers. #![crate_type = "lib"] #![allow(dead_code, nonstandard_style)] // NOTE: It is vital to only use a `tt` fragment to avoid confusing // the parser with nonterminals that can mask bugs. macro_rules! tests { ($kw:tt) => { mod $kw { mod const_item { const $kw: () = (); } mod static_item { static $kw: () = (); } mod fn_item { fn $kw() {} } mod mod_and_use_item { mod $kw { use super::$kw; } } mod ty_alias_item { type $kw = (); } mod struct_item { struct $kw { $kw: () } } mod enum_item { enum $kw { $kw } } mod union_item { union $kw { $kw: () } } mod trait_item { trait $kw { fn $kw() {} } } mod generics_and_impl { struct A<$kw>($kw); enum B<$kw> { A($kw) } trait Tr<$kw> { type $kw; } impl<$kw> Tr<$kw> for A<$kw> { type $kw = (); } impl<$kw> B<$kw> {} } mod extern_crate { #[cfg(any())] extern crate $kw; } mod body { fn expr() { let $kw = 0; let b = $kw; assert_eq!($kw, b); type $kw = (); let $kw: $kw = (); let _ = $kw as $kw; } fn pat_const() { const $kw: u8 = 0; // Ensure that $kw actually matches the constant. #[forbid(unreachable_patterns)] match 1 { $kw => {} _ => {} } } fn pat_binding() { match 1 { $kw => {} _ => {} } } } } }; } tests!(r#break); tests!(r#const); tests!(r#continue); tests!(r#else); tests!(r#enum); tests!(r#extern); tests!(r#false); tests!(r#fn); tests!(r#for); tests!(r#if); tests!(r#impl); tests!(r#in); tests!(r#let); tests!(r#loop); tests!(r#match); tests!(r#mod); tests!(r#move); tests!(r#mut); tests!(r#pub); tests!(r#ref); tests!(r#return); tests!(r#static); tests!(r#struct); tests!(r#trait); tests!(r#true); tests!(r#type); tests!(r#unsafe); tests!(r#use); tests!(r#where); tests!(r#while); tests!(r#abstract); tests!(r#become); tests!(r#box); tests!(r#do); tests!(r#final); tests!(r#macro); tests!(r#override); tests!(r#priv); tests!(r#typeof); tests!(r#unsized); tests!(r#virtual); tests!(r#yield); tests!(r#async); tests!(r#await); tests!(r#dyn); tests!(r#gen); tests!(r#try); // Weak keywords: tests!(auto); tests!(builtin); tests!(catch); tests!(default); tests!(macro_rules); tests!(raw); tests!(reuse); tests!(contract_ensures); tests!(contract_requires); tests!(safe); tests!(union); tests!(yeet);