| // A regression test for <https://github.com/rust-lang/rust/issues/144985>. | |
| // Previously, using `become` in a default trait method would lead to an ICE | |
| // in a path determining whether the method in question is marked as `#[track_caller]`. | |
| // | |
| //@ run-pass | |
| //@ ignore-backends: gcc | |
| #![feature(explicit_tail_calls)] | |
| #![expect(incomplete_features)] | |
| trait Trait { | |
| fn bar(&self) -> usize { | |
| 123 | |
| } | |
| fn foo(&self) -> usize { | |
| #[allow(tail_call_track_caller)] | |
| become self.bar(); | |
| } | |
| } | |
| struct Struct; | |
| impl Trait for Struct {} | |
| struct OtherStruct; | |
| impl Trait for OtherStruct { | |
| #[track_caller] | |
| fn bar(&self) -> usize { | |
| 456 | |
| } | |
| } | |
| fn main() { | |
| assert_eq!(Struct.foo(), 123); | |
| assert_eq!(OtherStruct.foo(), 456); | |
| } |