Skip to content

Error: constant expression depends on a generic parameter #73899

Closed
@est31

Description

@est31
Member

Successor of #61935 and #61383.

This code:

#![feature(const_generics)]
trait Foo {}

impl<const N: usize> Foo for [(); N]
where
    Self:FooImpl<{N==0}>
{}

trait FooImpl<const IS_ZERO: bool>{}

impl FooImpl<{0u8==0u8}> for [();0] {}

impl<const N:usize> FooImpl<{0u8!=0u8}> for [();N] {}

fn foo<T: Foo>(v: T) {}

fn main() {
    foo([]);
    foo([()]);
}

Gives this error message (on nightly):

error: constant expression depends on a generic parameter
 --> src/main.rs:6:10
  |
6 |     Self:FooImpl<{N==0}>
  |          ^^^^^^^^^^^^^^^
  |
  = note: this may fail depending on what value the parameter takes

It'd be great if this could work so that you can implement a trait differently for different values of type parameters.

cc @lcnr who suggested to open a new issue for this.

Activity

lcnr

lcnr commented on Jun 30, 2020

@lcnr
Contributor

background: his error was introduced in #70107 as the previous state was unsound, see #70107 (comment):

unfortunately, without this check, const generic would be unsound. The problem is really that const generics is incomplete and we're missing some critical components that are necessary to get them working properly. Const generics is unstable ("very unstable" in some sense in that it explicitly warns you things may break if you try to use them at the moment). We're grateful to have people testing them so that we can address the flaws before stabilising the feature, but we haven't yet reached the point where we can guarantee any kind of stability. Hopefully that will change before too long :)

added
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on Jul 5, 2020
added
E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.
on Nov 22, 2020
lcnr

lcnr commented on Nov 22, 2020

@lcnr
Contributor

With feature(const_evaluatable_checked) this test is now working as expected.

Marking as E-needs-test.

est31

est31 commented on Nov 22, 2020

@est31
MemberAuthor

@lcnr if I try this:

#![feature(const_evaluatable_checked, min_const_generics)]
trait Foo {}

impl<const N: usize> Foo for [(); N]
where
    Self:FooImpl<{N==0}>
{}

trait FooImpl<const IS_ZERO: bool>{}

impl FooImpl<{0u8==0u8}> for [();0] {}

impl<const N:usize> FooImpl<{0u8!=0u8}> for [();N] {}

fn foo<T: Foo>(v: T) {}

fn main() {
    foo([]);
    foo([()]);
}

I get this error:

error: generic parameters may not be used in const operations
 --> src/main.rs:6:19
  |
6 |     Self:FooImpl<{N==0}>
  |                   ^ cannot perform const operation using `N`
  |
  = help: const parameters may only be used as standalone arguments, i.e. `N`

Using the nightly from playground 1.50.0-nightly (2020-11-21 da384694807172f0ca40)

lcnr

lcnr commented on Nov 22, 2020

@lcnr
Contributor

you need full const_generics for this, we should probably add a note here which recommends using feature(const_generics) and feature(const_evaluatable_checked) here.

est31

est31 commented on Nov 22, 2020

@est31
MemberAuthor

@lcnr alright that works. I'll file a PR

added a commit that references this issue on Nov 22, 2020
added a commit that references this issue on Nov 22, 2020

Rollup merge of rust-lang#79302 - est31:issue_73899_test, r=lcnr

749fe40
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-genericsArea: const generics (parameters and arguments)C-bugCategory: This is a bug.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.F-const_generics`#![feature(const_generics)]`F-generic_const_exprs`#![feature(generic_const_exprs)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.requires-nightlyThis issue requires a nightly compiler in some way.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @jonas-schievink@est31@JohnTitor@lcnr

      Issue actions

        Error: constant expression depends on a generic parameter · Issue #73899 · rust-lang/rust