Skip to content

temporary value dropped while borrowed #132578

Open
@vickenty

Description

@vickenty

Code

I tried this code:

pub const fn concat(_x: &[u8], _y: &[u8]) -> [u8; 1024] {
    [0u8; 1024]
}

const _: &[u8] = &concat(
    if b"".len() > 0 {
        &concat(b"", b"")
    } else {
        b""
    },
    b""
);

I expected to see this happen: compiles

Instead, this happened: fails to compile with the following error:

error[E0716]: temporary value dropped while borrowed
 --> <source>:7:10
  |
5 | const _: &[u8] = &concat(
  |                   ------ borrow later used by call
6 |     if b"".len() > 0 {
7 |         &concat(b"", b"")
  |          ^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
8 |     } else {
  |     - temporary value is freed at the end of this statement
  |
  = note: consider using a `let` binding to create a longer lived value

Version it worked on

It most recently worked on: 1.78.0

Version with regression

rustc --version --verbose:

rustc 1.79.0 (129f3b996 2024-06-10)

@rustbot modify labels: +regression-from-stable-to-stable -regression-untriaged

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)C-bugCategory: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-const-evalWorking group: Const evaluationregression-from-stable-to-stablePerformance or correctness regression from one stable version to another.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions