Skip to content

NLL: spurious error emitted on body of (erroneous) const fn body #55825

Closed
@pnkfelix

Description

@pnkfelix
Member

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.

Activity

RalfJung

RalfJung commented on Nov 15, 2018

@RalfJung
Member

Cc @oli-obk might be something in (min) const qualification?

oli-obk

oli-obk commented on Nov 15, 2018

@oli-obk
Contributor

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):

  • min_const_fn compliance
  • const_fn compliance
  • promotion of runtime values to an anonymous static/constant
  • const compliance (valid array length, const item initializer or enum discriminant)
  • static compliance (valid static item initializer)
  • no interior mutability checks
  • no drop in const checks

The current implementation has an early abort for const fns where if the const_fn feature gate is not active, we first run min_const_fn, and if that fails we don't run the entangled other 4 passes. If we ran the other passes in case of min_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.

added
C-enhancementCategory: An issue proposing an enhancement or a PR with one.
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on Jun 11, 2020
Aaron1011

Aaron1011 commented on Oct 2, 2021

@Aaron1011
Member

This now produces the same output both with and without #![feature(nll)].

added
E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.
on Oct 2, 2021
added a commit that references this issue on Oct 3, 2021
5b66048
added 2 commits that reference this issue on Oct 4, 2021

Rollup merge of rust-lang#89505 - Aaron1011:nll-const-test, r=Mark-Si…

33178d2

Rollup merge of rust-lang#89505 - Aaron1011:nll-const-test, r=Mark-Si…

5c5dde8
added
A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)
on Dec 1, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-const-evalArea: Constant evaluation, covers all const contexts (static, const fn, ...)A-diagnosticsArea: Messages for errors, warnings, and lintsC-enhancementCategory: An issue proposing an enhancement or a PR with one.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.NLL-diagnosticsWorking towards the "diagnostic parity" goalT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @pnkfelix@RalfJung@oli-obk@crlf0710@Aaron1011

      Issue actions

        NLL: spurious error emitted on body of (erroneous) const fn body · Issue #55825 · rust-lang/rust