//! Regression test for: https://github.com/rust-lang/rust/issues/144957 //! //! This test ensures that lifetime information is included in diagnostics. //! //! Specifically, it checks that the `become` call produces an error with lifetimes shown //! in both caller and callee signatures. //! //! If the test fails: //! - Lifetimes may be missing (fix the diagnostic), or //! - The message format changed (update the test). #![feature(explicit_tail_calls)] #![allow(incomplete_features)] fn foo<'a>(_: fn(&'a ())) { become bar(dummy); //~^ ERROR mismatched signatures //~| NOTE `become` requires caller and callee to have matching signatures //~| NOTE caller signature: `fn(fn(&'a ()))` //~| NOTE callee signature: `fn(for<'a> fn(&'a ()))` } fn bar(_: fn(&())) {} fn dummy(_: &()) {} fn foo_(_: fn(&())) { become bar1(dummy2); //~^ ERROR mismatched signatures //~| NOTE `become` requires caller and callee to have matching signatures //~| NOTE caller signature: `fn(for<'a> fn(&'a ()))` //~| NOTE callee signature: `fn(fn(&'a ()))` } fn bar1<'a>(_: fn(&'a ())) {} fn dummy2(_: &()) {} fn foo__(_: fn(&'static ())) { become bar(dummy3); //~^ ERROR mismatched signatures //~| NOTE `become` requires caller and callee to have matching signatures //~| NOTE caller signature: `fn(fn(&'static ()))` //~| NOTE callee signature: `fn(for<'a> fn(&'a ()))` } fn bar2(_: fn(&())) {} fn dummy3(_: &()) {} fn main() {}