Repository navigation
Open
Labels
A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)Area: Constant evaluation, covers all const contexts (static, const fn, ...)A-constant-promotionArea: constant promotionArea: constant promotionC-bugCategory: This is a bug.Category: This is a bug.T-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.WG-const-evalWorking group: Const evaluationWorking group: Const evaluationregression-from-stable-to-stablePerformance or correctness regression from one stable version to another.Performance or correctness regression from one stable version to another.
Description
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
Labels
A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)Area: Constant evaluation, covers all const contexts (static, const fn, ...)A-constant-promotionArea: constant promotionArea: constant promotionC-bugCategory: This is a bug.Category: This is a bug.T-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.WG-const-evalWorking group: Const evaluationWorking group: Const evaluationregression-from-stable-to-stablePerformance or correctness regression from one stable version to another.Performance or correctness regression from one stable version to another.
Activity
vickenty commentedon Nov 3, 2024
This error can be worked around by adding the freshly stabilized
const {}block around the second call toconcat, but I think this should not be required, given it worked fine before.saethlin commentedon Nov 3, 2024
This is #121557. In particular, see this comment (that GitHub has hidden so the page load might be weird):
#121557 (comment)
You might be interested in the RFC that motivated this: https://rust-lang.github.io/rfcs/3027-infallible-promotion.html