Conversation
|
HIR ty lowering was modified cc @fmease |
This comment has been minimized.
This comment has been minimized.
| impl X for $name {} | ||
|
|
||
| #[automatically_derived] | ||
| impl $name { |
There was a problem hiding this comment.
The impl's span here is not copied from the input, so it should be marked as coming from a derive.
enum_map_derive uses a different quote, but there the impl should also be marked as coming from a derive.
So if we want to suggest adding missing generic parameters to an impl, we should check the impl's span, not some specific ident's span. And if the impl's span comes from a derive (or an external macro in general), we don't suggest adding the generic parameter.
I'm not sure why the conditions checking things like source_equal are necessary.
is_automatically_derived is also unreliable, many user-defined derives don't add that attribute, if the impl's span is from a derive, then checking for is_automatically_derived is redundant.
There was a problem hiding this comment.
The case where source_equal comes into play is when you have a derive on a type with a duplicated name, where the expansion resolves the impl to be about the other type and not the one being expanded:
error[E0107]: struct takes 0 lifetime arguments but 1 lifetime argument was supplied
--> $DIR/multiple-types-with-same-name-and-derive-default-133965.rs:5:10
|
LL | #[derive(Default)]
| ^^^^^^^ expected 0 lifetime arguments
...
LL | struct NonGeneric<'a, const N: usize> {}
| -- help: remove the lifetime argument
|
note: struct defined here, with 0 lifetime parameters
--> $DIR/multiple-types-with-same-name-and-derive-default-133965.rs:3:8
|
LL | struct NonGeneric {}
| ^^^^^^^^^^
I will have to detect that case regardless, so that I can silence it because it is completely redundant/useless.
There was a problem hiding this comment.
After #162831 lands, I think I can remove the source_equals check safely, but I'd keep it just in case as it makes sure that we are indeed pointing at the type's ident.
b7358ef to
7f323b4
Compare
This comment has been minimized.
This comment has been minimized.
7f323b4 to
d717072
Compare
When a derive macro expands the annotated item's name directly using `quote!`, it keep the item's Span context (instead of having a new context). This means that the generic Span context machinery which provides feedback that an error happened due to a derive doesn't kick in. If a derive macro isn't written to take into account the existence of type parameters, an error for "mismatched number of type parameters" will be emitted. We now detect the case when this happens due to the derive macro, and customize the output to point that out, as well as avoid giving suggestions that will always be wrong.
d717072 to
a8a03d8
Compare
|
This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
…chenkov Do not continue past `rustc_resolve` when encountering duplicated items Duplicated items cause *lots* of confusing knock down errors. This change side-steps some known ICEs, and reduces the verbosity of crates with duplicated items at the cost of not emitting every error that we could. Noticed just how problematic these can be while looking at rust-lang#160695, as `#[derive]`s are particularly prone to the kind of confusion these duplicates cause. Fix rust-lang#120873, fix rust-lang#123690. r? @petrochenkov
…chenkov Do not continue past `rustc_resolve` when encountering duplicated items Duplicated items cause *lots* of confusing knock down errors. This change side-steps some known ICEs, and reduces the verbosity of crates with duplicated items at the cost of not emitting every error that we could. Noticed just how problematic these can be while looking at rust-lang#160695, as `#[derive]`s are particularly prone to the kind of confusion these duplicates cause. Fix rust-lang#120873, fix rust-lang#123690. r? @petrochenkov
…chenkov Do not continue past `rustc_resolve` when encountering duplicated items Duplicated items cause *lots* of confusing knock down errors. This change side-steps some known ICEs, and reduces the verbosity of crates with duplicated items at the cost of not emitting every error that we could. Noticed just how problematic these can be while looking at rust-lang#160695, as `#[derive]`s are particularly prone to the kind of confusion these duplicates cause. Fix rust-lang#120873, fix rust-lang#123690. r? @petrochenkov
Rollup merge of #162831 - estebank:duplicated-items, r=petrochenkov Do not continue past `rustc_resolve` when encountering duplicated items Duplicated items cause *lots* of confusing knock down errors. This change side-steps some known ICEs, and reduces the verbosity of crates with duplicated items at the cost of not emitting every error that we could. Noticed just how problematic these can be while looking at #160695, as `#[derive]`s are particularly prone to the kind of confusion these duplicates cause. Fix #120873, fix #123690. r? @petrochenkov
When a derive macro expands the annotated item's name directly using
quote!, it keep the item's Span context (instead of having a new context). This means that the generic Span context machinery which provides feedback that an error happened due to a derive doesn't kick in.If a derive macro isn't written to take into account the existence of type parameters, an error for "mismatched number of type parameters" will be emitted. We now detect the case when this happens due to the derive macro, and customize the output to point that out, as well as avoid giving suggestions that will always be wrong.
Partially address #160463 (this doesn't detect a nameres error caused by referencing type parameter within a derive).
r? @petrochenkov