From a673203ec83746bc0bc7e4579fa97519a66f570e Mon Sep 17 00:00:00 2001 From: Pramod Bisht Date: Sun, 9 Sep 2018 12:05:46 +0000 Subject: [PATCH 1/2] Addressed #53692 --- src/librustc_typeck/check/mod.rs | 16 +++++++++++++++- src/test/ui/issue-53692.rs | 17 +++++++++++++++++ src/test/ui/issue-53692.stderr | 27 +++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/issue-53692.rs create mode 100644 src/test/ui/issue-53692.stderr diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index a1e4c85f8214..8f3300fac188 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -4726,7 +4726,21 @@ pub fn suggest_ref_or_into( if receiver.ends_with(&method_call) { None // do not suggest code that is already there (#53348) } else { - Some(format!("{}{}", receiver, method_call)) + // methods defined will be overwrite `.clone()` + // if suggesion is present in `method_call_list` (#53692) + let method_call_list = [".to_vec()", ".to_string()"]; + if receiver.ends_with("clone()") + && method_call_list.contains(&method_call.as_str()){ + // needed to clone receiver, because we don't want other + // suggestion to get affect because of that + let mut new_receiver = receiver.clone(); + let max_len = new_receiver.rfind(".").unwrap(); + new_receiver.truncate(max_len); + Some(format!("{}{}", new_receiver, method_call)) + } + else { + Some(format!("{}{}", receiver, method_call)) + } } }) .collect::>(); if !suggestions.is_empty() { diff --git a/src/test/ui/issue-53692.rs b/src/test/ui/issue-53692.rs new file mode 100644 index 000000000000..314362cf1127 --- /dev/null +++ b/src/test/ui/issue-53692.rs @@ -0,0 +1,17 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +fn main() { + let items = vec![1, 2, 3]; + let ref_items: &[i32] = &items; + let items_clone: Vec = ref_items.clone(); + + let s = "hi"; + let string: String = s.clone(); +} diff --git a/src/test/ui/issue-53692.stderr b/src/test/ui/issue-53692.stderr new file mode 100644 index 000000000000..1dc7621f1e4e --- /dev/null +++ b/src/test/ui/issue-53692.stderr @@ -0,0 +1,27 @@ +error[E0308]: mismatched types + --> $DIR/issue-53692.rs:13:37 + | +LL | let items_clone: Vec = ref_items.clone(); + | ^^^^^^^^^^^^^^^^^ + | | + | expected struct `std::vec::Vec`, found &[i32] + | help: try using a conversion method: `ref_items.to_vec()` + | + = note: expected type `std::vec::Vec` + found type `&[i32]` + +error[E0308]: mismatched types + --> $DIR/issue-53692.rs:16:30 + | +LL | let string: String = s.clone(); + | ^^^^^^^^^ + | | + | expected struct `std::string::String`, found &str + | help: try using a conversion method: `s.to_string()` + | + = note: expected type `std::string::String` + found type `&str` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0308`. From af09bf9293ed89b93662bad02006bcabde587a16 Mon Sep 17 00:00:00 2001 From: Pramod Bisht Date: Sun, 9 Sep 2018 13:43:41 +0000 Subject: [PATCH 2/2] 53692: Addressed Estebank's Nits --- src/librustc_typeck/check/mod.rs | 12 +++++++----- src/test/ui/issue-53692.rs | 7 +++++++ src/test/ui/issue-53692.stderr | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 8f3300fac188..997fdb0df616 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -4726,13 +4726,15 @@ pub fn suggest_ref_or_into( if receiver.ends_with(&method_call) { None // do not suggest code that is already there (#53348) } else { - // methods defined will be overwrite `.clone()` - // if suggesion is present in `method_call_list` (#53692) + /* + methods defined in `method_call_list` will overwrite + `.clone()` in copy of `receiver` + */ let method_call_list = [".to_vec()", ".to_string()"]; - if receiver.ends_with("clone()") + if receiver.ends_with(".clone()") && method_call_list.contains(&method_call.as_str()){ - // needed to clone receiver, because we don't want other - // suggestion to get affect because of that + // created copy of `receiver` because we don't want other + // suggestion to get affected let mut new_receiver = receiver.clone(); let max_len = new_receiver.rfind(".").unwrap(); new_receiver.truncate(max_len); diff --git a/src/test/ui/issue-53692.rs b/src/test/ui/issue-53692.rs index 314362cf1127..0b6cc36fa52e 100644 --- a/src/test/ui/issue-53692.rs +++ b/src/test/ui/issue-53692.rs @@ -12,6 +12,13 @@ fn main() { let ref_items: &[i32] = &items; let items_clone: Vec = ref_items.clone(); + // in that case no suggestion will be triggered + let items_clone_2:Vec = items.clone(); + let s = "hi"; let string: String = s.clone(); + + // in that case no suggestion will be triggered + let s2 = "hi"; + let string_2: String = s2.to_string(); } diff --git a/src/test/ui/issue-53692.stderr b/src/test/ui/issue-53692.stderr index 1dc7621f1e4e..9cd8a5361552 100644 --- a/src/test/ui/issue-53692.stderr +++ b/src/test/ui/issue-53692.stderr @@ -11,7 +11,7 @@ LL | let items_clone: Vec = ref_items.clone(); found type `&[i32]` error[E0308]: mismatched types - --> $DIR/issue-53692.rs:16:30 + --> $DIR/issue-53692.rs:19:30 | LL | let string: String = s.clone(); | ^^^^^^^^^