diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index d2306254e31426b7d6b6acbbcfc639afb50b5aed..460d505ba98b50b0de92d24d7988a839201e7f39 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -396,7 +396,7 @@ struct BaseError<'a> { // Try to lookup name in more relaxed fashion for better error reporting. let ident = path.last().unwrap().ident; - let candidates = self + let mut candidates = self .r .lookup_import_candidates(ident, ns, &self.parent_scope, is_expected) .into_iter() @@ -408,6 +408,18 @@ struct BaseError<'a> { }) .collect::>(); let crate_def_id = CRATE_DEF_ID.to_def_id(); + // Try to filter out intrinsics candidates, as long as we have + // some other candidates to suggest. + let intrinsic_candidates: Vec<_> = candidates + .drain_filter(|sugg| { + let path = path_names_to_string(&sugg.path); + path.starts_with("core::intrinsics::") || path.starts_with("std::intrinsics::") + }) + .collect(); + if candidates.is_empty() { + // Put them back if we have no more candidates to suggest... + candidates.extend(intrinsic_candidates); + } if candidates.is_empty() && is_expected(Res::Def(DefKind::Enum, crate_def_id)) { let mut enum_candidates: Vec<_> = self .r diff --git a/src/test/ui/resolve/filter-intrinsics.rs b/src/test/ui/resolve/filter-intrinsics.rs new file mode 100644 index 0000000000000000000000000000000000000000..c0956ef85aff6b2b6765880228149179d8a866d9 --- /dev/null +++ b/src/test/ui/resolve/filter-intrinsics.rs @@ -0,0 +1,10 @@ +fn main() { + // Should suggest only `std::mem::size_of` + let _ = size_of::(); + //~^ ERROR cannot find + + // Should suggest `std::intrinsics::fabsf64`, + // since there is no non-intrinsic to suggest. + let _ = fabsf64(1.0); + //~^ ERROR cannot find +} diff --git a/src/test/ui/resolve/filter-intrinsics.stderr b/src/test/ui/resolve/filter-intrinsics.stderr new file mode 100644 index 0000000000000000000000000000000000000000..955070891fbbea6084e5f9d027515d79dbe07b28 --- /dev/null +++ b/src/test/ui/resolve/filter-intrinsics.stderr @@ -0,0 +1,25 @@ +error[E0425]: cannot find function `size_of` in this scope + --> $DIR/filter-intrinsics.rs:3:13 + | +LL | let _ = size_of::(); + | ^^^^^^^ not found in this scope + | +help: consider importing this function + | +LL | use std::mem::size_of; + | + +error[E0425]: cannot find function `fabsf64` in this scope + --> $DIR/filter-intrinsics.rs:8:13 + | +LL | let _ = fabsf64(1.0); + | ^^^^^^^ not found in this scope + | +help: consider importing this function + | +LL | use std::intrinsics::fabsf64; + | + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0425`.