Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions compiler/rustc_builtin_macros/src/compile_error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ pub(crate) fn expand_compile_error<'cx>(
#[expect(rustc::diagnostic_outside_of_impl, reason = "diagnostic message is specified by user")]
#[expect(rustc::untranslatable_diagnostic, reason = "diagnostic message is specified by user")]
let guar = cx.dcx().span_err(sp, var.to_string());
cx.resolver.mark_scope_with_compile_error(cx.current_expansion.lint_node_id);

ExpandResult::Ready(DummyResult::any(sp, guar))
}
4 changes: 4 additions & 0 deletions compiler/rustc_expand/src/base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1200,6 +1200,10 @@ pub trait ResolverExpand {
/// Record the name of an opaque `Ty::ImplTrait` pre-expansion so that it can be used
/// to generate an item name later that does not reference placeholder macros.
fn insert_impl_trait_name(&mut self, id: NodeId, name: Symbol);

/// Mark the scope as having a compile error so that error for lookup in this scope
/// should be suppressed
fn mark_scope_with_compile_error(&mut self, parent_node: NodeId);
}

pub trait LintStoreExpand {
Expand Down
3 changes: 2 additions & 1 deletion compiler/rustc_resolve/src/ident.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1718,7 +1718,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
diag_metadata: Option<&DiagMetadata<'_>>,
) -> PathResult<'ra> {
let mut module = None;
let mut module_had_parse_errors = false;
let mut module_had_parse_errors = !self.mods_with_parse_errors.is_empty()
&& self.mods_with_parse_errors.contains(&parent_scope.module.nearest_parent_mod());
let mut allow_super = true;
let mut second_binding = None;

Expand Down
6 changes: 6 additions & 0 deletions compiler/rustc_resolve/src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,12 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
self.invocation_parents[&id].parent_def
}

fn mark_scope_with_compile_error(&mut self, id: NodeId) {
if let Some(id) = self.opt_local_def_id(id) {
self.mods_with_parse_errors.insert(id.to_def_id());
}
}

fn resolve_dollar_crates(&self) {
hygiene::update_dollar_crate_names(|ctxt| {
let ident = Ident::new(kw::DollarCrate, DUMMY_SP.with_ctxt(ctxt));
Expand Down
25 changes: 25 additions & 0 deletions tests/ui/macros/compile_error_macro-suppress-errors.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
mod some_module {
compile_error!("Error in a module"); //~ ERROR: Error in a module

fn abc() {
let _: self::SomeType = self::Hello::new();
let _: SomeType = Hello::new();
}
}

mod another_module {}

fn main() {
// these errors are suppressed because of the compile_error! macro

let _ = some_module::some_function();
let _: some_module::SomeType = some_module::Hello::new();

// these errors are not suppressed

let _ = another_module::some_function();
//~^ ERROR: cannot find function `some_function` in module `another_module`
let _: another_module::SomeType = another_module::Hello::new();
//~^ ERROR: cannot find type `SomeType` in module `another_module`
//~^^ ERROR: failed to resolve: could not find `Hello` in `another_module`
}
28 changes: 28 additions & 0 deletions tests/ui/macros/compile_error_macro-suppress-errors.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
error: Error in a module
--> $DIR/compile_error_macro-suppress-errors.rs:2:5
|
LL | compile_error!("Error in a module");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0433]: failed to resolve: could not find `Hello` in `another_module`
--> $DIR/compile_error_macro-suppress-errors.rs:22:55
|
LL | let _: another_module::SomeType = another_module::Hello::new();
| ^^^^^ could not find `Hello` in `another_module`

error[E0425]: cannot find function `some_function` in module `another_module`
--> $DIR/compile_error_macro-suppress-errors.rs:20:29
|
LL | let _ = another_module::some_function();
| ^^^^^^^^^^^^^ not found in `another_module`

error[E0412]: cannot find type `SomeType` in module `another_module`
--> $DIR/compile_error_macro-suppress-errors.rs:22:28
|
LL | let _: another_module::SomeType = another_module::Hello::new();
| ^^^^^^^^ not found in `another_module`

error: aborting due to 4 previous errors

Some errors have detailed explanations: E0412, E0425, E0433.
For more information about an error, try `rustc --explain E0412`.
Loading