Rollup merge of #115077 - estebank:issue-115019, r=compiler-errors
Do not emit invalid suggestion in E0191 when spans overlap Fix #115019.
This commit is contained in:
commit
0e84d42a9e
3 changed files with 51 additions and 1 deletions
|
@ -597,7 +597,21 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !suggestions.is_empty() {
|
suggestions.sort_by_key(|&(span, _)| span);
|
||||||
|
// There are cases where one bound points to a span within another bound's span, like when
|
||||||
|
// you have code like the following (#115019), so we skip providing a suggestion in those
|
||||||
|
// cases to avoid having a malformed suggestion.
|
||||||
|
//
|
||||||
|
// pub struct Flatten<I> {
|
||||||
|
// inner: <IntoIterator<Item: IntoIterator<Item: >>::IntoIterator as Item>::core,
|
||||||
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
// | ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
// | |
|
||||||
|
// | associated types `Item`, `IntoIter` must be specified
|
||||||
|
// associated types `Item`, `IntoIter` must be specified
|
||||||
|
// }
|
||||||
|
let overlaps = suggestions.windows(2).any(|pair| pair[0].0.overlaps(pair[1].0));
|
||||||
|
if !suggestions.is_empty() && !overlaps {
|
||||||
err.multipart_suggestion(
|
err.multipart_suggestion(
|
||||||
format!("specify the associated type{}", pluralize!(types_count)),
|
format!("specify the associated type{}", pluralize!(types_count)),
|
||||||
suggestions,
|
suggestions,
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#![allow(bare_trait_objects)]
|
||||||
|
#![feature(associated_type_bounds)]
|
||||||
|
trait Item {
|
||||||
|
type Core;
|
||||||
|
}
|
||||||
|
pub struct Flatten<I> {
|
||||||
|
inner: <IntoIterator<Item: IntoIterator<Item: >>::IntoIterator as Item>::Core,
|
||||||
|
//~^ ERROR E0191
|
||||||
|
//~| ERROR E0223
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,24 @@
|
||||||
|
error[E0191]: the value of the associated types `IntoIter` (from trait `IntoIterator`), `IntoIter` (from trait `IntoIterator`), `Item` (from trait `IntoIterator`), `Item` (from trait `IntoIterator`) must be specified
|
||||||
|
--> $DIR/overlaping-bound-suggestion.rs:7:13
|
||||||
|
|
|
||||||
|
LL | inner: <IntoIterator<Item: IntoIterator<Item: >>::IntoIterator as Item>::Core,
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
| | |
|
||||||
|
| | associated types `Item`, `IntoIter` must be specified
|
||||||
|
| associated types `Item`, `IntoIter` must be specified
|
||||||
|
|
||||||
|
error[E0223]: ambiguous associated type
|
||||||
|
--> $DIR/overlaping-bound-suggestion.rs:7:13
|
||||||
|
|
|
||||||
|
LL | inner: <IntoIterator<Item: IntoIterator<Item: >>::IntoIterator as Item>::Core,
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: if there were a trait named `Example` with associated type `IntoIterator` implemented for `(dyn IntoIterator + 'static)`, you could use the fully-qualified path
|
||||||
|
|
|
||||||
|
LL | inner: <<(dyn IntoIterator + 'static) as Example>::IntoIterator as Item>::Core,
|
||||||
|
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0191, E0223.
|
||||||
|
For more information about an error, try `rustc --explain E0191`.
|
Loading…
Add table
Add a link
Reference in a new issue