Skip to content

Commit

Permalink
Unrolled build for rust-lang#127669
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#127669 - chenyukang:yukang-fix-deref-127590, r=nnethercote

Fix the issue of invalid suggestion for a reference of iterator

Fixes rust-lang#127590
  • Loading branch information
rust-timer authored Jul 16, 2024
2 parents a91f7d7 + 48ddf5e commit 3ea2502
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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";
Expand Down
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
--> $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`.

0 comments on commit 3ea2502

Please sign in to comment.