Skip to content
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

Fix the issue of invalid suggestion for a reference of iterator #127669

Merged
merged 2 commits into from
Jul 16, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -466,7 +466,6 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
&& let Some(arg_ty) = typeck_results.expr_ty_adjusted_opt(expr)
{
// Suggest dereferencing the argument to a function/method call if possible

let mut real_trait_pred = trait_pred;
while let Some((parent_code, parent_trait_pred)) = code.parent() {
code = parent_code;
@@ -553,6 +552,9 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
);
if self.predicate_may_hold(&obligation)
&& self.predicate_must_hold_modulo_regions(&sized_obligation)
// Do not suggest * if it is already a reference,
// will suggest removing the borrow instead in that case.
&& !matches!(expr.kind, hir::ExprKind::AddrOf(..))
{
let call_node = self.tcx.hir_node(*call_hir_id);
let msg = "consider dereferencing here";
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
fn main() {
let fields = vec![1];
let variant = vec![2];

// should not suggest `*&variant.iter()`
for (src, dest) in std::iter::zip(fields.iter(), &variant.iter()) {
//~^ ERROR `&std::slice::Iter<'_, {integer}>` is not an iterator
//~| ERROR `&std::slice::Iter<'_, {integer}>` is not an iterator
eprintln!("{} {}", src, dest);
}

// don't suggest add `variant.iter().clone().clone()`
for (src, dest) in std::iter::zip(fields.iter(), &variant.iter().clone()) {
//~^ ERROR `&std::slice::Iter<'_, {integer}>` is not an iterator
//~| ERROR `&std::slice::Iter<'_, {integer}>` is not an iterator
eprintln!("{} {}", src, dest);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
error[E0277]: `&std::slice::Iter<'_, {integer}>` is not an iterator
--> $DIR/invalid-suggest-deref-issue-127590.rs:6:54
|
LL | for (src, dest) in std::iter::zip(fields.iter(), &variant.iter()) {
| -------------- ^^^^^^^^^^^^^^^ `&std::slice::Iter<'_, {integer}>` is not an iterator
| |
| required by a bound introduced by this call
|
= help: the trait `Iterator` is not implemented for `&std::slice::Iter<'_, {integer}>`, which is required by `&std::slice::Iter<'_, {integer}>: IntoIterator`
= note: required for `&std::slice::Iter<'_, {integer}>` to implement `IntoIterator`
note: required by a bound in `std::iter::zip`
--> $SRC_DIR/core/src/iter/adapters/zip.rs:LL:COL
help: consider removing the leading `&`-reference
|
LL - for (src, dest) in std::iter::zip(fields.iter(), &variant.iter()) {
LL + for (src, dest) in std::iter::zip(fields.iter(), variant.iter()) {
|

error[E0277]: `&std::slice::Iter<'_, {integer}>` is not an iterator
--> $DIR/invalid-suggest-deref-issue-127590.rs:6:24
|
LL | for (src, dest) in std::iter::zip(fields.iter(), &variant.iter()) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `&std::slice::Iter<'_, {integer}>` is not an iterator
|
= help: the trait `Iterator` is not implemented for `&std::slice::Iter<'_, {integer}>`, which is required by `Zip<std::slice::Iter<'_, {integer}>, &std::slice::Iter<'_, {integer}>>: IntoIterator`
= help: the trait `Iterator` is implemented for `std::slice::Iter<'a, T>`
= note: required for `Zip<std::slice::Iter<'_, {integer}>, &std::slice::Iter<'_, {integer}>>` to implement `Iterator`
= note: required for `Zip<std::slice::Iter<'_, {integer}>, &std::slice::Iter<'_, {integer}>>` to implement `IntoIterator`

error[E0277]: `&std::slice::Iter<'_, {integer}>` is not an iterator
--> $DIR/invalid-suggest-deref-issue-127590.rs:13:54
|
LL | for (src, dest) in std::iter::zip(fields.iter(), &variant.iter().clone()) {
| -------------- ^^^^^^^^^^^^^^^^^^^^^^^ `&std::slice::Iter<'_, {integer}>` is not an iterator
| |
| required by a bound introduced by this call
|
= help: the trait `Iterator` is not implemented for `&std::slice::Iter<'_, {integer}>`, which is required by `&std::slice::Iter<'_, {integer}>: IntoIterator`
= note: required for `&std::slice::Iter<'_, {integer}>` to implement `IntoIterator`
note: required by a bound in `std::iter::zip`
--> $SRC_DIR/core/src/iter/adapters/zip.rs:LL:COL
help: consider removing the leading `&`-reference
|
LL - for (src, dest) in std::iter::zip(fields.iter(), &variant.iter().clone()) {
LL + for (src, dest) in std::iter::zip(fields.iter(), variant.iter().clone()) {
|

error[E0277]: `&std::slice::Iter<'_, {integer}>` is not an iterator
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this diag also seems weird, it's better if we could remove it.

--> $DIR/invalid-suggest-deref-issue-127590.rs:13:24
|
LL | for (src, dest) in std::iter::zip(fields.iter(), &variant.iter().clone()) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `&std::slice::Iter<'_, {integer}>` is not an iterator
|
= help: the trait `Iterator` is not implemented for `&std::slice::Iter<'_, {integer}>`, which is required by `Zip<std::slice::Iter<'_, {integer}>, &std::slice::Iter<'_, {integer}>>: IntoIterator`
= help: the trait `Iterator` is implemented for `std::slice::Iter<'a, T>`
= note: required for `Zip<std::slice::Iter<'_, {integer}>, &std::slice::Iter<'_, {integer}>>` to implement `Iterator`
= note: required for `Zip<std::slice::Iter<'_, {integer}>, &std::slice::Iter<'_, {integer}>>` to implement `IntoIterator`

error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0277`.