-
-
Notifications
You must be signed in to change notification settings - Fork 14.4k
Recognize potential impl<const N: usize> to impl<N> mistake
#151077
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
rustbot has assigned @petrochenkov. Use |
|
The logic could be made more complex to ensure that the type param isn't being used anywhere in the TypeNS, which would tell us that the suggestion would be less likely to be correct. |
| }) else { | ||
| return; | ||
| }; | ||
| err.subdiagnostic(errors::UnexpectedResChangeImplTyParamToConstParamSugg { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
…Impl…
Doesn't this also trigger outside of impls? E.g., on fn f<N>(_: [(); N]) {}?
Maybe rename the preexisting diag struct (the one for N: Type→const N: Type) to …BoundedTyParam… & remove Impl from this one? Idk, sth. like that
|
@bors rollup Thanks! r=me with nit addressed in one way or another |
When encountering code like `impl<N> Bar<N> for [u8; N]`, suggest `impl<const N: Type> Bar<N> for [u8; N]` as a possibility.
```
error[E0423]: expected value, found type parameter `T`
--> $DIR/issue-69654.rs:5:25
|
LL | impl<T> Bar<T> for [u8; T] {}
| - ^ not a value
| |
| found this type parameter
|
help: you might have meant to write a const parameter here
|
LL | impl<const T: /* Type */> Bar<T> for [u8; T] {}
| +++++ ++++++++++++
```
|
@bors r=fmease |
Recognize potential `impl<const N: usize>` to `impl<N>` mistake
When encountering code like `impl<N> Bar<N> for [u8; N]`, suggest `impl<const N: Type> Bar<N> for [u8; N]` as a possibility.
```
error[E0423]: expected value, found type parameter `T`
--> $DIR/issue-69654.rs:5:25
|
LL | impl<T> Bar<T> for [u8; T] {}
| - ^ not a value
| |
| found this type parameter
|
help: you might have meant to write a const parameter here
|
LL | impl<const T: Type> Bar<T> for [u8; T] {}
| +++++ ++++++
```
Addresses "case 3" from rust-lang#84327.
…uwer Rollup of 12 pull requests Successful merges: - #149408 (refactor: remove Ord bound from BinaryHeap::new etc) - #150406 (Change some `matches!(.., .. if ..)` with let-chains) - #150723 (std: move `errno` and related functions into `sys::io`) - #150877 (resolve: Refactor away the side table `decl_parent_modules`) - #150902 (Update to_uppercase docs to avoid ß->SS example) - #150962 (Remove `FeedConstTy` and provide ty when lowering const arg) - #151034 (std: Change UEFI env vars to volatile storage) - #151036 (Better handle when trying to iterate on a `Range` of a type that isn't `Step`) - #151067 (Avoid should-fail in two ui tests and a codegen-llvm test) - #151072 (also handle ENOTTY ioctl errors when checking pidfd -> pid support) - #151077 (Recognize potential `impl<const N: usize>` to `impl<N>` mistake) - #151096 (Remove `Deref`/`DerefMut` impl for `Providers`.) Failed merges: - #150939 (resolve: Relax some asserts in glob overwriting and add tests) r? @ghost
…uwer Rollup of 11 pull requests Successful merges: - #149408 (refactor: remove Ord bound from BinaryHeap::new etc) - #150406 (Change some `matches!(.., .. if ..)` with let-chains) - #150723 (std: move `errno` and related functions into `sys::io`) - #150877 (resolve: Refactor away the side table `decl_parent_modules`) - #150902 (Update to_uppercase docs to avoid ß->SS example) - #151034 (std: Change UEFI env vars to volatile storage) - #151036 (Better handle when trying to iterate on a `Range` of a type that isn't `Step`) - #151067 (Avoid should-fail in two ui tests and a codegen-llvm test) - #151072 (also handle ENOTTY ioctl errors when checking pidfd -> pid support) - #151077 (Recognize potential `impl<const N: usize>` to `impl<N>` mistake) - #151096 (Remove `Deref`/`DerefMut` impl for `Providers`.) Failed merges: - #150939 (resolve: Relax some asserts in glob overwriting and add tests) r? @ghost
Rollup merge of #151077 - issue-84327, r=fmease Recognize potential `impl<const N: usize>` to `impl<N>` mistake When encountering code like `impl<N> Bar<N> for [u8; N]`, suggest `impl<const N: Type> Bar<N> for [u8; N]` as a possibility. ``` error[E0423]: expected value, found type parameter `T` --> $DIR/issue-69654.rs:5:25 | LL | impl<T> Bar<T> for [u8; T] {} | - ^ not a value | | | found this type parameter | help: you might have meant to write a const parameter here | LL | impl<const T: Type> Bar<T> for [u8; T] {} | +++++ ++++++ ``` Addresses "case 3" from #84327.
Recover parse gracefully from `<const N>` When a const param doesn't have a `: Type`, recover the parser state and provide a structured suggestion. This not only provides guidance on what was missing, but it also makes subsuequent errors to be emitted that would otherwise be silenced. ``` error: expected `:`, found `>` --> $DIR/incorrect-const-param.rs:26:16 | LL | impl<T, const N> From<[T; N]> for VecWrapper<T> | ^ expected `:` | help: you might have meant to write the type of the const parameter here | LL | impl<T, const N: /* Type */> From<[T; N]> for VecWrapper<T> | ++++++++++++ ``` r? @fmease Follow up to rust-lang#151077. Fix rust-lang#84327.
Recover parse gracefully from `<const N>` When a const param doesn't have a `: Type`, recover the parser state and provide a structured suggestion. This not only provides guidance on what was missing, but it also makes subsuequent errors to be emitted that would otherwise be silenced. ``` error: expected `:`, found `>` --> $DIR/incorrect-const-param.rs:26:16 | LL | impl<T, const N> From<[T; N]> for VecWrapper<T> | ^ expected `:` | help: you might have meant to write the type of the const parameter here | LL | impl<T, const N: /* Type */> From<[T; N]> for VecWrapper<T> | ++++++++++++ ``` r? @fmease Follow up to rust-lang#151077. Fix rust-lang#84327.
Rollup merge of #151099 - issue-84327-2, r=fmease Recover parse gracefully from `<const N>` When a const param doesn't have a `: Type`, recover the parser state and provide a structured suggestion. This not only provides guidance on what was missing, but it also makes subsuequent errors to be emitted that would otherwise be silenced. ``` error: expected `:`, found `>` --> $DIR/incorrect-const-param.rs:26:16 | LL | impl<T, const N> From<[T; N]> for VecWrapper<T> | ^ expected `:` | help: you might have meant to write the type of the const parameter here | LL | impl<T, const N: /* Type */> From<[T; N]> for VecWrapper<T> | ++++++++++++ ``` r? @fmease Follow up to #151077. Fix #84327.
…uwer Rollup of 11 pull requests Successful merges: - rust-lang/rust#149408 (refactor: remove Ord bound from BinaryHeap::new etc) - rust-lang/rust#150406 (Change some `matches!(.., .. if ..)` with let-chains) - rust-lang/rust#150723 (std: move `errno` and related functions into `sys::io`) - rust-lang/rust#150877 (resolve: Refactor away the side table `decl_parent_modules`) - rust-lang/rust#150902 (Update to_uppercase docs to avoid ß->SS example) - rust-lang/rust#151034 (std: Change UEFI env vars to volatile storage) - rust-lang/rust#151036 (Better handle when trying to iterate on a `Range` of a type that isn't `Step`) - rust-lang/rust#151067 (Avoid should-fail in two ui tests and a codegen-llvm test) - rust-lang/rust#151072 (also handle ENOTTY ioctl errors when checking pidfd -> pid support) - rust-lang/rust#151077 (Recognize potential `impl<const N: usize>` to `impl<N>` mistake) - rust-lang/rust#151096 (Remove `Deref`/`DerefMut` impl for `Providers`.) Failed merges: - rust-lang/rust#150939 (resolve: Relax some asserts in glob overwriting and add tests) r? @ghost
Recover parse gracefully from `<const N>` When a const param doesn't have a `: Type`, recover the parser state and provide a structured suggestion. This not only provides guidance on what was missing, but it also makes subsuequent errors to be emitted that would otherwise be silenced. ``` error: expected `:`, found `>` --> $DIR/incorrect-const-param.rs:26:16 | LL | impl<T, const N> From<[T; N]> for VecWrapper<T> | ^ expected `:` | help: you might have meant to write the type of the const parameter here | LL | impl<T, const N: /* Type */> From<[T; N]> for VecWrapper<T> | ++++++++++++ ``` r? @fmease Follow up to rust-lang/rust#151077. Fix rust-lang/rust#84327.
When encountering code like
impl<N> Bar<N> for [u8; N], suggestimpl<const N: Type> Bar<N> for [u8; N]as a possibility.Addresses "case 3" from #84327.