// Tests that the correct span is used to determine the edition of an attribute that was safe to use // in earlier editions, but has become `unsafe` in later editions. // // Determining the correct edition is non-trivial because of macro expansion. For instance, // the `thread_local!` macro (defined in std and hence using the most recent edition) parses the // attribute, and then re-emits it. Therefore, the span of the `#` token starting the // `#[no_mangle]` attribute has std's edition, while the attribute name has the edition of this // file, which may be different. //@ revisions: e2015 e2018 e2021 e2024 //@[e2018] edition:2018 //@[e2021] edition:2021 //@[e2024] edition:2024 // //@[e2015] check-pass //@[e2018] check-pass //@[e2021] check-pass #![crate_type = "lib"] #[no_mangle] //[e2024]~ ERROR unsafe attribute used without unsafe static TEST_OUTSIDE: usize = 0; thread_local! { #[no_mangle]//[e2024]~ ERROR unsafe attribute used without unsafe static TEST: usize = 0; }