Deny use
ing tool paths
This commit is contained in:
parent
1767585509
commit
ebde2ab363
@ -207,5 +207,9 @@ resolve_expected_found =
|
||||
resolve_indeterminate =
|
||||
cannot determine resolution for the visibility
|
||||
|
||||
resolve_tool_module_imported =
|
||||
cannot use a tool module through an import
|
||||
.note = the tool module imported here
|
||||
|
||||
resolve_module_only =
|
||||
visibility must resolve to a module
|
||||
|
@ -469,6 +469,15 @@ pub(crate) struct ExpectedFound {
|
||||
#[diag(resolve_indeterminate, code = "E0578")]
|
||||
pub(crate) struct Indeterminate(#[primary_span] pub(crate) Span);
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(resolve_tool_module_imported)]
|
||||
pub(crate) struct ToolModuleImported {
|
||||
#[primary_span]
|
||||
pub(crate) span: Span,
|
||||
#[note]
|
||||
pub(crate) import: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(resolve_module_only)]
|
||||
pub(crate) struct ModuleOnly(#[primary_span] pub(crate) Span);
|
||||
|
@ -17,7 +17,7 @@
|
||||
ConstantHasGenerics, ConstantItemKind, HasGenericParams, PathSource, Rib, RibKind,
|
||||
};
|
||||
use crate::macros::{sub_namespace_match, MacroRulesScope};
|
||||
use crate::{AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, Determinacy, Finalize};
|
||||
use crate::{errors, AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, Determinacy, Finalize};
|
||||
use crate::{Import, ImportKind, LexicalScopeBinding, Module, ModuleKind, ModuleOrUniformRoot};
|
||||
use crate::{NameBinding, NameBindingKind, ParentScope, PathResult, PrivacyError, Res};
|
||||
use crate::{ResolutionError, Resolver, Scope, ScopeSet, Segment, ToNameBinding, Weak};
|
||||
@ -1357,7 +1357,7 @@ pub(crate) fn resolve_path_with_ribs(
|
||||
}
|
||||
};
|
||||
|
||||
let is_last = i == path.len() - 1;
|
||||
let is_last = i + 1 == path.len();
|
||||
let ns = if is_last { opt_ns.unwrap_or(TypeNS) } else { TypeNS };
|
||||
let name = ident.name;
|
||||
|
||||
@ -1494,16 +1494,12 @@ enum FindBindingResult<'a> {
|
||||
if let Some(next_module) = binding.module() {
|
||||
module = Some(ModuleOrUniformRoot::Module(next_module));
|
||||
record_segment_res(self, res);
|
||||
} else if res == Res::ToolMod && i + 1 != path.len() {
|
||||
} else if res == Res::ToolMod && !is_last && opt_ns.is_some() {
|
||||
if binding.is_import() {
|
||||
self.tcx
|
||||
.sess
|
||||
.struct_span_err(
|
||||
ident.span,
|
||||
"cannot use a tool module through an import",
|
||||
)
|
||||
.span_note(binding.span, "the tool module imported here")
|
||||
.emit();
|
||||
self.tcx.sess.emit_err(errors::ToolModuleImported {
|
||||
span: ident.span,
|
||||
import: binding.span,
|
||||
});
|
||||
}
|
||||
let res = Res::NonMacroAttr(NonMacroAttrKind::Tool);
|
||||
return PathResult::NonModule(PartialRes::new(res));
|
||||
|
8
tests/ui/resolve/tool-import.rs
Normal file
8
tests/ui/resolve/tool-import.rs
Normal file
@ -0,0 +1,8 @@
|
||||
// edition: 2018
|
||||
|
||||
use clippy::time::Instant;
|
||||
//~^ `clippy` is a tool module
|
||||
|
||||
fn main() {
|
||||
Instant::now();
|
||||
}
|
9
tests/ui/resolve/tool-import.stderr
Normal file
9
tests/ui/resolve/tool-import.stderr
Normal file
@ -0,0 +1,9 @@
|
||||
error[E0433]: failed to resolve: `clippy` is a tool module, not a module
|
||||
--> $DIR/tool-import.rs:3:5
|
||||
|
|
||||
LL | use clippy::time::Instant;
|
||||
| ^^^^^^ `clippy` is a tool module, not a module
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0433`.
|
Loading…
Reference in New Issue
Block a user