Skip to content

Recursive static with impl Trait errors out early #59631

@oli-obk

Description

@oli-obk
Contributor

The following code should probably work. (cc @Aaron1011)

#![feature(impl_trait_in_bindings)]
static FOO: impl Copy = &FOO;

fn main() {
}

(Playground)

Errors:

   Compiling playground v0.0.1 (/playground)
error: non-defining existential type use in defining scope
 --> src/main.rs:2:25
  |
2 | static FOO: impl Copy = &FOO;
  |                         ^^^^ lifetime `'<empty>` is part of concrete type but not used in parameter list of existential type

error: aborting due to previous error

error: Could not compile `playground`.

To learn more, run the command again with --verbose.

Activity

changed the title [-]Recursive struct with impl Trait errors out early[/-] [+]Recursive static with impl Trait errors out early[/+] on Apr 2, 2019
added
A-impl-traitArea: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.
C-bugCategory: This is a bug.
on Apr 2, 2019
jyn514

jyn514 commented on Jul 7, 2021

@jyn514
Member

Triage: the current error for this is

error[E0391]: cycle detected when computing type of `FOO::{opaque#0}`
 --> src/main.rs:2:13
  |
2 | static FOO: impl Copy = &FOO;
  |             ^^^^^^^^^
  |
note: ...which requires borrow-checking `FOO`...
 --> src/main.rs:2:1
  |
2 | static FOO: impl Copy = &FOO;
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...which requires processing `FOO`...
 --> src/main.rs:2:1
  |
2 | static FOO: impl Copy = &FOO;
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...which requires const checking `FOO`...
 --> src/main.rs:2:1
  |
2 | static FOO: impl Copy = &FOO;
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  = note: ...which requires computing whether `impl std::marker::Copy` is freeze...
  = note: ...which requires evaluating trait selection obligation `impl std::marker::Copy: std::marker::Freeze`...
  = note: ...which again requires computing type of `FOO::{opaque#0}`, completing the cycle
  = note: cycle used when normalizing `impl std::marker::Copy`

@oli-obk why do you say this should compile? It seems strange that you could have a completely unconstrainted type, FOO has no defining use.

oli-obk

oli-obk commented on Jul 8, 2021

@oli-obk
ContributorAuthor

I just assumed that considering that

static FOO: &dyn Sync = &FOO;

compiles, that the impl trait version should compile, too. But we can just make a decision and declare this kind of cyclic static to be irrelevant and thus we can just ignore it. It's in the defining use scope, so it gets revealed, which would cause an infinitely deep reference (&&&&&&&&&&...), so it's not really useful or even well defined.

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-impl-traitArea: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.C-bugCategory: This is a bug.F-impl_trait_in_bindings`#![feature(impl_trait_in_bindings)]`requires-nightlyThis issue requires a nightly compiler in some way.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @oli-obk@Centril@jonas-schievink@jyn514

        Issue actions

          Recursive static with impl Trait errors out early · Issue #59631 · rust-lang/rust