1
Fork 0

Check FromIterator trait impl in prelude collision check.

This commit is contained in:
Mara Bos 2021-07-06 13:41:22 +00:00
parent c5e344f774
commit 60535441c8
3 changed files with 23 additions and 0 deletions

View file

@ -155,6 +155,7 @@ symbols! {
FormatSpec, FormatSpec,
Formatter, Formatter,
From, From,
FromIterator,
Future, Future,
FxHashMap, FxHashMap,
FxHashSet, FxHashSet,

View file

@ -4,11 +4,13 @@ use hir::ItemKind;
use rustc_ast::Mutability; use rustc_ast::Mutability;
use rustc_errors::Applicability; use rustc_errors::Applicability;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_middle::ty::subst::InternalSubsts;
use rustc_middle::ty::{Ref, Ty}; use rustc_middle::ty::{Ref, Ty};
use rustc_session::lint::builtin::RUST_2021_PRELUDE_COLLISIONS; use rustc_session::lint::builtin::RUST_2021_PRELUDE_COLLISIONS;
use rustc_span::symbol::kw::Underscore; use rustc_span::symbol::kw::Underscore;
use rustc_span::symbol::{sym, Ident}; use rustc_span::symbol::{sym, Ident};
use rustc_span::Span; use rustc_span::Span;
use rustc_trait_selection::infer::InferCtxtExt;
use crate::check::{ use crate::check::{
method::probe::{self, Pick}, method::probe::{self, Pick},
@ -206,6 +208,25 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
return; return;
} }
// For from_iter, check if the type actualy implements FromIterator.
// If we know it does not, we don't need to warn.
if method_name.name == sym::from_iter {
if let Some(trait_def_id) = self.tcx.get_diagnostic_item(sym::FromIterator) {
if !self
.infcx
.type_implements_trait(
trait_def_id,
self_ty,
InternalSubsts::empty(),
self.param_env,
)
.may_apply()
{
return;
}
}
}
// No need to lint if this is an inherent method called on a specific type, like `Vec::foo(...)`, // No need to lint if this is an inherent method called on a specific type, like `Vec::foo(...)`,
// since such methods take precedence over trait methods. // since such methods take precedence over trait methods.
if matches!(pick.kind, probe::PickKind::InherentImplPick) { if matches!(pick.kind, probe::PickKind::InherentImplPick) {

View file

@ -89,6 +89,7 @@
over elements of type `{A}`", over elements of type `{A}`",
label = "value of type `{Self}` cannot be built from `std::iter::Iterator<Item={A}>`" label = "value of type `{Self}` cannot be built from `std::iter::Iterator<Item={A}>`"
)] )]
#[rustc_diagnostic_item = "FromIterator"]
pub trait FromIterator<A>: Sized { pub trait FromIterator<A>: Sized {
/// Creates a value from an iterator. /// Creates a value from an iterator.
/// ///