| //@ run-pass |
| |
| macro_rules! assert_expansion_site_is_tracked { |
| () => {{ |
| let location = std::panic::Location::caller(); |
| assert_eq!(location.file(), file!()); |
| assert_ne!(location.line(), line!(), "line should be outside this fn"); |
| }} |
| } |
| |
| trait Tracked { |
| fn local_tracked(&self); |
| |
| #[track_caller] |
| fn blanket_tracked(&self); |
| |
| #[track_caller] |
| fn default_tracked(&self) { |
| assert_expansion_site_is_tracked!(); |
| } |
| } |
| |
| impl Tracked for () { |
| #[track_caller] |
| fn local_tracked(&self) { |
| assert_expansion_site_is_tracked!(); |
| } |
| |
| fn blanket_tracked(&self) { |
| assert_expansion_site_is_tracked!(); |
| } |
| } |
| |
| impl Tracked for bool { |
| #[track_caller] |
| fn local_tracked(&self) { |
| assert_expansion_site_is_tracked!(); |
| } |
| |
| fn blanket_tracked(&self) { |
| assert_expansion_site_is_tracked!(); |
| } |
| |
| fn default_tracked(&self) { |
| assert_expansion_site_is_tracked!(); |
| } |
| } |
| |
| impl Tracked for u8 { |
| #[track_caller] |
| fn local_tracked(&self) { |
| assert_expansion_site_is_tracked!(); |
| } |
| |
| fn blanket_tracked(&self) { |
| assert_expansion_site_is_tracked!(); |
| } |
| |
| #[track_caller] |
| fn default_tracked(&self) { |
| assert_expansion_site_is_tracked!(); |
| } |
| } |
| |
| fn main() { |
| ().local_tracked(); |
| ().default_tracked(); |
| ().blanket_tracked(); |
| |
| true.local_tracked(); |
| true.default_tracked(); |
| true.blanket_tracked(); |
| |
| 0u8.local_tracked(); |
| 0u8.default_tracked(); |
| 0u8.blanket_tracked(); |
| } |