- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.9k
Closed
Labels
C-bugCategory: This is a bug.Category: This is a bug.P-highHigh priorityHigh priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-nightlyPerformance or correctness regression from stable to nightly.Performance or correctness regression from stable to nightly.
Description
Compiling the following code in older editions (edition 2024 works):
// rustc +nightly-2025-08-10 src/main.rs
use std::fmt;
pub struct ItemIdentifier;
impl ItemIdentifier {
    fn nserror() -> Self {
        todo!()
    }
    pub fn path(&self) -> impl fmt::Display + '_ {
        0
    }
}
struct Ty {
    pointee: Box<Self>,
}
impl Ty {
    fn is_static_object(&self) -> bool {
        true
    }
    fn behind_pointer(&self) -> impl fmt::Display + '_ {
        0
    }
}
fn foo(ty: &Ty, f: &mut fmt::Formatter<'_>) {
    let _res = match ty {
        Ty { pointee } if pointee.is_static_object() => {
            write!(
                f,
                "{}, {}",
                pointee.behind_pointer(),
                ItemIdentifier::path(&ItemIdentifier::nserror()),
            )
        }
        _ => todo!(),
    };
}
fn main() {}(Reduced from https://github.com/madsmtm/objc2/tree/master/crates/header-translator, this is as small as I managed to make it, it seems like both pointee and ItemIdentifier are required?).
Fails compiling with:
error[E0716]: temporary value dropped while borrowed
  --> src/main.rs:36:39
   |
36 |                 ItemIdentifier::path(&ItemIdentifier::nserror()),
   |                 ----------------------^^^^^^^^^^^^^^^^^^^^^^^^^-
   |                 |                     |
   |                 |                     creates a temporary value which is freed while still in use
   |                 a temporary with access to the borrow is created here ...
37 |             )
38 |         }
   |         -
   |         |
   |         temporary value is freed at the end of this statement
   |         ... and the borrow might be used here, when that temporary is dropped and runs the destructor for type `impl std::fmt::Display + '_`
   |
   = note: consider using a `let` binding to create a longer lived value
For more information about this error, try `rustc --explain E0716`.
A cargo bisect-rustc reveals that this was introduced in #143376 (nightly-2025-08-09 works, nightly-2025-08-10 fails), it is unclear to me if this breakage was intentional or not?
@rustbot modify labels: +regression-from-stable-to-nightly -regression-untriaged
Metadata
Metadata
Assignees
Labels
C-bugCategory: This is a bug.Category: This is a bug.P-highHigh priorityHigh priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-nightlyPerformance or correctness regression from stable to nightly.Performance or correctness regression from stable to nightly.