// run-pass // revisions: default mir-opt //[mir-opt] compile-flags: -Zmir-opt-level=4 fn ptr_call(f: fn()) { f(); } #[track_caller] fn tracked() { let expected_line = line!() - 1; let location = std::panic::Location::caller(); assert_eq!(location.file(), file!()); assert_eq!(location.line(), expected_line, "call shims report location as fn definition"); } trait Trait { fn trait_tracked(); } impl Trait for () { #[track_caller] fn trait_tracked() { let expected_line = line!() - 1; let location = std::panic::Location::caller(); assert_eq!(location.file(), file!()); assert_eq!(location.line(), expected_line, "call shims report location as fn definition"); } } trait TrackedTrait { #[track_caller] fn trait_tracked_default() { let expected_line = line!() - 1; let location = std::panic::Location::caller(); assert_eq!(location.file(), file!()); assert_eq!(location.line(), expected_line, "call shims report location as fn definition"); } } impl TrackedTrait for () {} trait TraitBlanketTracked { #[track_caller] fn tracked_blanket(); } impl TraitBlanketTracked for () { fn tracked_blanket() { let expected_line = line!() - 1; let location = std::panic::Location::caller(); assert_eq!(location.file(), file!()); assert_eq!(location.line(), expected_line, "call shims report location as fn definition"); } } fn main() { ptr_call(tracked); ptr_call(<() as Trait>::trait_tracked); ptr_call(<() as TrackedTrait>::trait_tracked_default); ptr_call(<() as TraitBlanketTracked>::tracked_blanket); }