Closed
Description
Spawned off of #54528 (specificially this card in the project).
Consider the following code:
const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
fn main() { }
With AST-borrowck, you get (play):
error: trait bounds other than `Sized` on const fn parameters are unstable
--> src/main.rs:1:32
|
1 | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
With NLL (here using migration a la 2018 edition), you get (play):
error: trait bounds other than `Sized` on const fn parameters are unstable
--> src/main.rs:1:32
|
1 | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
warning[E0515]: cannot return reference to temporary value
--> src/main.rs:1:63
|
1 | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
| ^--
| ||
| |temporary value created here
| returns a reference to data owned by the current function
|
= warning: This error has been downgraded to a warning for backwards compatibility with previous releases.
It represents potential unsoundness in your code.
This warning will become a hard error in the future.
error: aborting due to previous error
I have not managed to replicate the above borrow-check error on code that does not exhibit some other const fn
error.
And the problem goes away if you opt into #![feature(const_fn)]
(play).
So, this is really a very minor diagnostic issue.
Metadata
Metadata
Assignees
Labels
Area: Constant evaluation, covers all const contexts (static, const fn, ...)Area: Messages for errors, warnings, and lintsCategory: An issue proposing an enhancement or a PR with one.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.Working towards the "diagnostic parity" goalRelevant to the compiler team, which will review and decide on the PR/issue.
Activity
RalfJung commentedon Nov 15, 2018
Cc @oli-obk might be something in (min) const qualification?
oli-obk commentedon Nov 15, 2018
TLDR: The issue with this is that we have a bunch of separate checks relating to const things, and most of these are spaghetti entangled into one. @eddyb and I are working towards fixing that, but it's nontrivial to say the least.
Details:
We have the following checks that we need to run on MIR (which relate to const):
The current implementation has an early abort for const fns where if the
const_fn
feature gate is not active, we first runmin_const_fn
, and if that fails we don't run the entangled other 4 passes. If we ran the other passes in case ofmin_const_fn
failure, you'd get a lot of error duplication.I don't think we have a tracking issue for the refactoring separating all these passes into distinct dataflow passes, but there's ongoing work.
Aaron1011 commentedon Oct 2, 2021
This now produces the same output both with and without
#![feature(nll)]
.Add regression test for spurious const error with NLL
Rollup merge of rust-lang#89505 - Aaron1011:nll-const-test, r=Mark-Si…
Rollup merge of rust-lang#89505 - Aaron1011:nll-const-test, r=Mark-Si…