Rollup merge of #103140 - chenyukang:yukang/fix-103112, r=estebank

Add diagnostic for calling a function with the same name with unresolved Macro

Fixes #103112
This commit is contained in:
Michael Howell 2022-10-23 14:48:15 -07:00 committed by GitHub
commit 3df030d441
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 2 deletions

View File

@ -12,7 +12,7 @@
use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::intern::Interned;
use rustc_data_structures::sync::Lrc;
use rustc_errors::struct_span_err;
use rustc_errors::{struct_span_err, Applicability};
use rustc_expand::base::{Annotatable, DeriveResolutions, Indeterminate, ResolverExpand};
use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind};
use rustc_expand::compile_declarative_macro;
@ -694,7 +694,19 @@ pub(crate) fn finalize_macro_resolutions(&mut self) {
check_consistency(self, &path, path_span, kind, initial_res, res)
}
path_res @ PathResult::NonModule(..) | path_res @ PathResult::Failed { .. } => {
let mut suggestion = None;
let (span, label) = if let PathResult::Failed { span, label, .. } = path_res {
// try to suggest if it's not a macro, maybe a function
if let PathResult::NonModule(partial_res) = self.maybe_resolve_path(&path, Some(ValueNS), &parent_scope)
&& partial_res.unresolved_segments() == 0 {
let sm = self.session.source_map();
let exclamation_span = sm.next_point(span);
suggestion = Some((
vec![(exclamation_span, "".to_string())],
format!("{} is not a macro, but a {}, try to remove `!`", Segment::names_to_string(&path), partial_res.base_res().descr()),
Applicability::MaybeIncorrect
));
}
(span, label)
} else {
(
@ -708,7 +720,7 @@ pub(crate) fn finalize_macro_resolutions(&mut self) {
};
self.report_error(
span,
ResolutionError::FailedToResolve { label, suggestion: None },
ResolutionError::FailedToResolve { label, suggestion },
);
}
PathResult::Module(..) | PathResult::Indeterminate => unreachable!(),

View File

@ -0,0 +1,4 @@
fn main() {
std::process::abort!();
//~^ ERROR: failed to resolve
}

View File

@ -0,0 +1,15 @@
error[E0433]: failed to resolve: could not find `abort` in `process`
--> $DIR/issue-103112.rs:2:19
|
LL | std::process::abort!();
| ^^^^^ could not find `abort` in `process`
|
help: std::process::abort is not a macro, but a function, try to remove `!`
|
LL - std::process::abort!();
LL + std::process::abort();
|
error: aborting due to previous error
For more information about this error, try `rustc --explain E0433`.