From 8d42f3da6358e80c0f13dc057152e04b7283def8 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Mon, 14 Jun 2021 13:17:15 -0400 Subject: [PATCH] don't warn for fully qual inherent methods But do continue to warn for trait methods. --- compiler/rustc_typeck/src/check/method/mod.rs | 10 +++++++++- .../ui/rust-2021/generic-type-collision.fixed | 16 ++++++++++++++++ src/test/ui/rust-2021/generic-type-collision.rs | 16 ++++++++++++++++ .../ui/rust-2021/generic-type-collision.stderr | 10 ++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/rust-2021/generic-type-collision.fixed create mode 100644 src/test/ui/rust-2021/generic-type-collision.rs create mode 100644 src/test/ui/rust-2021/generic-type-collision.stderr diff --git a/compiler/rustc_typeck/src/check/method/mod.rs b/compiler/rustc_typeck/src/check/method/mod.rs index 4a855d6e408..f321d62edf6 100644 --- a/compiler/rustc_typeck/src/check/method/mod.rs +++ b/compiler/rustc_typeck/src/check/method/mod.rs @@ -10,6 +10,7 @@ pub use self::suggest::{SelfSource, TraitInfo}; pub use self::CandidateSource::*; pub use self::MethodError::*; +use crate::check::method::probe::PickKind; use crate::check::FnCtxt; use rustc_ast::ast::Mutability; use rustc_data_structures::sync::Lrc; @@ -552,7 +553,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { if span.edition() < Edition::Edition2021 { if let sym::try_into | sym::try_from | sym::from_iter = method_name.name { - if !matches!(tcx.crate_name(pick.item.def_id.krate), sym::std | sym::core) { + // No need to warn if either: + // + // * The method comes from std/core, since ten it's the built-in trait. + // * This is an inherent method called on a specific type, like `Vec::foo(...)`, + // since such methods take precedence over trait methods. + if !matches!(tcx.crate_name(pick.item.def_id.krate), sym::std | sym::core) + && !matches!(pick.kind, PickKind::InherentImplPick) + { tcx.struct_span_lint_hir(FUTURE_PRELUDE_COLLISION, expr_id, span, |lint| { // "type" refers to either a type or, more likely, a trait from which // the associated function or method is from. diff --git a/src/test/ui/rust-2021/generic-type-collision.fixed b/src/test/ui/rust-2021/generic-type-collision.fixed new file mode 100644 index 00000000000..1ae2b95d515 --- /dev/null +++ b/src/test/ui/rust-2021/generic-type-collision.fixed @@ -0,0 +1,16 @@ +// check-pass +// run-rustfix +// edition 2018 + +trait MyTrait { + fn from_iter(x: Option); +} + +impl MyTrait<()> for Vec { + fn from_iter(_: Option<()>) {} +} + +fn main() { + as MyTrait<_>>::from_iter(None); + //~^ WARNING trait-associated function `from_iter` will become ambiguous in Rust 2021 +} diff --git a/src/test/ui/rust-2021/generic-type-collision.rs b/src/test/ui/rust-2021/generic-type-collision.rs new file mode 100644 index 00000000000..e203656163c --- /dev/null +++ b/src/test/ui/rust-2021/generic-type-collision.rs @@ -0,0 +1,16 @@ +// check-pass +// run-rustfix +// edition 2018 + +trait MyTrait { + fn from_iter(x: Option); +} + +impl MyTrait<()> for Vec { + fn from_iter(_: Option<()>) {} +} + +fn main() { + >::from_iter(None); + //~^ WARNING trait-associated function `from_iter` will become ambiguous in Rust 2021 +} diff --git a/src/test/ui/rust-2021/generic-type-collision.stderr b/src/test/ui/rust-2021/generic-type-collision.stderr new file mode 100644 index 00000000000..3acc6185a61 --- /dev/null +++ b/src/test/ui/rust-2021/generic-type-collision.stderr @@ -0,0 +1,10 @@ +warning: trait-associated function `from_iter` will become ambiguous in Rust 2021 + --> $DIR/generic-type-collision.rs:14:5 + | +LL | >::from_iter(None); + | ^^^^^^^^^^^^^^^^^^^^^ help: disambiguate the associated function: ` as MyTrait<_>>::from_iter` + | + = note: `#[warn(future_prelude_collision)]` on by default + +warning: 1 warning emitted +