Repository navigation
Closed as not planned
Labels
A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)Area: Constant evaluation, covers all const contexts (static, const fn, ...)A-lifetimesArea: Lifetimes / regionsArea: Lifetimes / regionsC-bugCategory: This is a bug.Category: This is a bug.P-mediumMedium priorityMedium 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-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: [playground] [godbolt]
pub struct Dir<'a>(&'a [File<'a>]);
impl<'a> Dir<'a> {
pub const fn new(x: &'a [File<'a>]) -> Self {
Self(x)
}
}
pub struct File<'a>(&'a str);
impl<'a> File<'a> {
pub const fn new(x: &'a str) -> Self {
Self(x)
}
}
pub static OK: Dir<'static> = Dir::new(&[File::new("")]);
pub static ERR: Dir<'static> = if true {
Dir::new(&[File::new("")]) //~ ERROR: temporary value dropped while borrowed
} else {
unreachable!()
};I expected to see this happen: code compiles: temporary is promoted to &'static due to the const evaluation context.
Instead, this happened: code errors: temporary value dropped while borrowed.
Version it worked on
It most recently worked on: 1.78
Version with regression
rustc --version --verbose:
rustc 1.79.0 (129f3b996 2024-06-10)
binary: rustc
commit-hash: 129f3b9964af4d4a709d1383930ade12dfe7c081
commit-date: 2024-06-10
host: x86_64-pc-windows-msvc
release: 1.79.0
LLVM version: 18.1.7
Meta
@rustbot modify labels: +regression-from-stable-to-stable -regression-untriaged
Bisects to #121557
Initially reported on urlo: https://users.rust-lang.org/t/code-compiles-in-1-78-0-but-not-in-1-79-0/113038?u=cad97
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-lifetimesArea: Lifetimes / regionsArea: Lifetimes / regionsC-bugCategory: This is a bug.Category: This is a bug.P-mediumMedium priorityMedium 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-stablePerformance or correctness regression from one stable version to another.Performance or correctness regression from one stable version to another.
Activity
CAD97 commentedon Jun 16, 2024
@rustbot claim
I think I found what needs to be fixed. Just claiming the fix; I don't know how handling the regression should go.
RalfJung commentedon Jun 16, 2024
We recently changed our rules for promotion of function calls, quite deliberately: #121557. This seems to me to be expected fall-out from that change?
RalfJung commentedon Jun 16, 2024
Cc @rust-lang/wg-const-eval
CAD97 commentedon Jun 16, 2024
That does look to be more directly relevant than #121346. The initial report can't fix itself with
constblocks though, unfortunately, sinceDir::new(&[File::new()])all shows up from a macro expansion.@rustbot release-assignment
The thread I was pulling on didn't go anywhere and I don't know enough to determine much more on my own, plus may be intentional
RalfJung commentedon Jun 16, 2024
Dir::new(&[File::new("")])is exactly the kind of code we'd like to not compile since it moves a function call (File::new) into a promoted. However for backwards compatibility reasons, we currently still let it compile. However, once that kind of function call is inside a conditional, having it implicitly promoted becomes really sketchy, and crater showed that this pattern is very rare in the wild (crater found zero regressions). So we moved to rejecting that code, finally making tangible progress on #80619.The intended way to write such code is
Dir::new(const { &[File::new("")] }).CAD97 commentedon Jun 16, 2024
So that it's mentioned directly here: the urlo source looks like
and cannot introduce a
constblock to make it compile, as the correct place to introduce it is inside of theinclude_dir!macro. (Although in fairness OOP likely wantscfg_match!rather thanif cfg!anyway. Note thatinclude_dir!expands toDir::new(&[File::new("file path", include_bytes!("file path")), ...]), it's not a source include.)RalfJung commentedon Jun 16, 2024
The const block should be inside that included file then. Basically, when you want
&exprto be promoted to'staticlifetime, write itconst { &expr }.lqd commentedon Jun 16, 2024
(The OP does bisect to #121557)
apiraino commentedon Jul 11, 2024
WG-prioritization assigning priority (Zulip discussion).
@rustbot label -I-prioritize +P-medium
RalfJung commentedon Jul 11, 2024
This is now fixed upstream in include_dir, see Michael-F-Bryan/include_dir#99.
CAD97 commentedon Aug 16, 2024
Closing as deliberate and expected breakage.