Auto merge of #28364 - petrochenkov:usegate, r=alexcrichton
Closes https://github.com/rust-lang/rust/issues/28075 Closes https://github.com/rust-lang/rust/issues/28388 r? @eddyb cc @brson
This commit is contained in:
@@ -100,7 +100,7 @@
|
|||||||
#![cfg_attr(stage0, feature(alloc_system))]
|
#![cfg_attr(stage0, feature(alloc_system))]
|
||||||
#![cfg_attr(not(stage0), feature(needs_allocator))]
|
#![cfg_attr(not(stage0), feature(needs_allocator))]
|
||||||
|
|
||||||
#![cfg_attr(test, feature(test, rustc_private))]
|
#![cfg_attr(test, feature(test, rustc_private, box_heap))]
|
||||||
|
|
||||||
#[cfg(stage0)]
|
#[cfg(stage0)]
|
||||||
extern crate alloc_system;
|
extern crate alloc_system;
|
||||||
|
|||||||
@@ -38,6 +38,8 @@
|
|||||||
#![feature(core_intrinsics)]
|
#![feature(core_intrinsics)]
|
||||||
#![feature(core_slice_ext)]
|
#![feature(core_slice_ext)]
|
||||||
#![feature(core_str_ext)]
|
#![feature(core_str_ext)]
|
||||||
|
#![feature(fmt_internals)]
|
||||||
|
#![feature(fmt_radix)]
|
||||||
#![feature(heap_api)]
|
#![feature(heap_api)]
|
||||||
#![feature(iter_order)]
|
#![feature(iter_order)]
|
||||||
#![feature(iter_arith)]
|
#![feature(iter_arith)]
|
||||||
@@ -47,6 +49,8 @@
|
|||||||
#![feature(oom)]
|
#![feature(oom)]
|
||||||
#![feature(pattern)]
|
#![feature(pattern)]
|
||||||
#![feature(ptr_as_ref)]
|
#![feature(ptr_as_ref)]
|
||||||
|
#![feature(ref_slice)]
|
||||||
|
#![feature(slice_bytes)]
|
||||||
#![feature(slice_patterns)]
|
#![feature(slice_patterns)]
|
||||||
#![feature(staged_api)]
|
#![feature(staged_api)]
|
||||||
#![feature(step_by)]
|
#![feature(step_by)]
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ use slice::SliceConcatExt;
|
|||||||
use boxed::Box;
|
use boxed::Box;
|
||||||
|
|
||||||
pub use core::str::{FromStr, Utf8Error};
|
pub use core::str::{FromStr, Utf8Error};
|
||||||
|
#[allow(deprecated)]
|
||||||
pub use core::str::{Lines, LinesAny, CharRange};
|
pub use core::str::{Lines, LinesAny, CharRange};
|
||||||
pub use core::str::{Split, RSplit};
|
pub use core::str::{Split, RSplit};
|
||||||
pub use core::str::{SplitN, RSplitN};
|
pub use core::str::{SplitN, RSplitN};
|
||||||
|
|||||||
@@ -767,6 +767,11 @@ impl<'a, 'tcx, 'v> hir_visit::Visitor<'v> for LateContext<'a, 'tcx> {
|
|||||||
hir_visit::walk_path(self, p);
|
hir_visit::walk_path(self, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_path_list_item(&mut self, prefix: &hir::Path, item: &hir::PathListItem) {
|
||||||
|
run_lints!(self, check_path_list_item, late_passes, item);
|
||||||
|
hir_visit::walk_path_list_item(self, prefix, item);
|
||||||
|
}
|
||||||
|
|
||||||
fn visit_attribute(&mut self, attr: &ast::Attribute) {
|
fn visit_attribute(&mut self, attr: &ast::Attribute) {
|
||||||
run_lints!(self, check_attribute, late_passes, attr);
|
run_lints!(self, check_attribute, late_passes, attr);
|
||||||
}
|
}
|
||||||
@@ -915,6 +920,11 @@ impl<'a, 'v> ast_visit::Visitor<'v> for EarlyContext<'a> {
|
|||||||
ast_visit::walk_path(self, p);
|
ast_visit::walk_path(self, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_path_list_item(&mut self, prefix: &ast::Path, item: &ast::PathListItem) {
|
||||||
|
run_lints!(self, check_path_list_item, early_passes, item);
|
||||||
|
ast_visit::walk_path_list_item(self, prefix, item);
|
||||||
|
}
|
||||||
|
|
||||||
fn visit_attribute(&mut self, attr: &ast::Attribute) {
|
fn visit_attribute(&mut self, attr: &ast::Attribute) {
|
||||||
run_lints!(self, check_attribute, early_passes, attr);
|
run_lints!(self, check_attribute, early_passes, attr);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -161,6 +161,7 @@ pub trait LateLintPass: LintPass {
|
|||||||
fn check_lifetime_def(&mut self, _: &LateContext, _: &hir::LifetimeDef) { }
|
fn check_lifetime_def(&mut self, _: &LateContext, _: &hir::LifetimeDef) { }
|
||||||
fn check_explicit_self(&mut self, _: &LateContext, _: &hir::ExplicitSelf) { }
|
fn check_explicit_self(&mut self, _: &LateContext, _: &hir::ExplicitSelf) { }
|
||||||
fn check_path(&mut self, _: &LateContext, _: &hir::Path, _: ast::NodeId) { }
|
fn check_path(&mut self, _: &LateContext, _: &hir::Path, _: ast::NodeId) { }
|
||||||
|
fn check_path_list_item(&mut self, _: &LateContext, _: &hir::PathListItem) { }
|
||||||
fn check_attribute(&mut self, _: &LateContext, _: &ast::Attribute) { }
|
fn check_attribute(&mut self, _: &LateContext, _: &ast::Attribute) { }
|
||||||
|
|
||||||
/// Called when entering a syntax node that can have lint attributes such
|
/// Called when entering a syntax node that can have lint attributes such
|
||||||
@@ -206,6 +207,7 @@ pub trait EarlyLintPass: LintPass {
|
|||||||
fn check_lifetime_def(&mut self, _: &EarlyContext, _: &ast::LifetimeDef) { }
|
fn check_lifetime_def(&mut self, _: &EarlyContext, _: &ast::LifetimeDef) { }
|
||||||
fn check_explicit_self(&mut self, _: &EarlyContext, _: &ast::ExplicitSelf) { }
|
fn check_explicit_self(&mut self, _: &EarlyContext, _: &ast::ExplicitSelf) { }
|
||||||
fn check_path(&mut self, _: &EarlyContext, _: &ast::Path, _: ast::NodeId) { }
|
fn check_path(&mut self, _: &EarlyContext, _: &ast::Path, _: ast::NodeId) { }
|
||||||
|
fn check_path_list_item(&mut self, _: &EarlyContext, _: &ast::PathListItem) { }
|
||||||
fn check_attribute(&mut self, _: &EarlyContext, _: &ast::Attribute) { }
|
fn check_attribute(&mut self, _: &EarlyContext, _: &ast::Attribute) { }
|
||||||
|
|
||||||
/// Called when entering a syntax node that can have lint attributes such
|
/// Called when entering a syntax node that can have lint attributes such
|
||||||
|
|||||||
@@ -279,6 +279,11 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
|
|||||||
visit::walk_path(self, path);
|
visit::walk_path(self, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_path_list_item(&mut self, path: &hir::Path, item: &hir::PathListItem) {
|
||||||
|
self.lookup_and_handle_definition(&item.node.id());
|
||||||
|
visit::walk_path_list_item(self, path, item);
|
||||||
|
}
|
||||||
|
|
||||||
fn visit_item(&mut self, _: &hir::Item) {
|
fn visit_item(&mut self, _: &hir::Item) {
|
||||||
// Do not recurse into items. These items will be added to the
|
// Do not recurse into items. These items will be added to the
|
||||||
// worklist and recursed into manually if necessary.
|
// worklist and recursed into manually if necessary.
|
||||||
|
|||||||
@@ -355,6 +355,12 @@ impl<'a, 'v, 'tcx> Visitor<'v> for Checker<'a, 'tcx> {
|
|||||||
visit::walk_path(self, path)
|
visit::walk_path(self, path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_path_list_item(&mut self, prefix: &hir::Path, item: &hir::PathListItem) {
|
||||||
|
check_path_list_item(self.tcx, item,
|
||||||
|
&mut |id, sp, stab| self.check(id, sp, stab));
|
||||||
|
visit::walk_path_list_item(self, prefix, item)
|
||||||
|
}
|
||||||
|
|
||||||
fn visit_pat(&mut self, pat: &hir::Pat) {
|
fn visit_pat(&mut self, pat: &hir::Pat) {
|
||||||
check_pat(self.tcx, pat,
|
check_pat(self.tcx, pat,
|
||||||
&mut |id, sp, stab| self.check(id, sp, stab));
|
&mut |id, sp, stab| self.check(id, sp, stab));
|
||||||
@@ -470,7 +476,17 @@ pub fn check_path(tcx: &ty::ctxt, path: &hir::Path, id: ast::NodeId,
|
|||||||
}
|
}
|
||||||
None => {}
|
None => {}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn check_path_list_item(tcx: &ty::ctxt, item: &hir::PathListItem,
|
||||||
|
cb: &mut FnMut(DefId, Span, &Option<&Stability>)) {
|
||||||
|
match tcx.def_map.borrow().get(&item.node.id()).map(|d| d.full_def()) {
|
||||||
|
Some(def::DefPrimTy(..)) => {}
|
||||||
|
Some(def) => {
|
||||||
|
maybe_do_stability_check(tcx, def.def_id(), item.span, cb);
|
||||||
|
}
|
||||||
|
None => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn check_pat(tcx: &ty::ctxt, pat: &hir::Pat,
|
pub fn check_pat(tcx: &ty::ctxt, pat: &hir::Pat,
|
||||||
|
|||||||
@@ -423,6 +423,10 @@ mod svh_visitor {
|
|||||||
SawPath.hash(self.st); visit::walk_path(self, path)
|
SawPath.hash(self.st); visit::walk_path(self, path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_path_list_item(&mut self, prefix: &Path, item: &'v PathListItem) {
|
||||||
|
SawPath.hash(self.st); visit::walk_path_list_item(self, prefix, item)
|
||||||
|
}
|
||||||
|
|
||||||
fn visit_block(&mut self, b: &Block) {
|
fn visit_block(&mut self, b: &Block) {
|
||||||
SawBlock.hash(self.st); visit::walk_block(self, b)
|
SawBlock.hash(self.st); visit::walk_block(self, b)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,6 +121,9 @@ pub trait Visitor<'v> : Sized {
|
|||||||
fn visit_path(&mut self, path: &'v Path, _id: NodeId) {
|
fn visit_path(&mut self, path: &'v Path, _id: NodeId) {
|
||||||
walk_path(self, path)
|
walk_path(self, path)
|
||||||
}
|
}
|
||||||
|
fn visit_path_list_item(&mut self, prefix: &'v Path, item: &'v PathListItem) {
|
||||||
|
walk_path_list_item(self, prefix, item)
|
||||||
|
}
|
||||||
fn visit_path_segment(&mut self, path_span: Span, path_segment: &'v PathSegment) {
|
fn visit_path_segment(&mut self, path_span: Span, path_segment: &'v PathSegment) {
|
||||||
walk_path_segment(self, path_span, path_segment)
|
walk_path_segment(self, path_span, path_segment)
|
||||||
}
|
}
|
||||||
@@ -203,27 +206,21 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) {
|
|||||||
ItemExternCrate(..) => {}
|
ItemExternCrate(..) => {}
|
||||||
ItemUse(ref vp) => {
|
ItemUse(ref vp) => {
|
||||||
match vp.node {
|
match vp.node {
|
||||||
ViewPathSimple(ident, ref path) => {
|
ViewPathSimple(_ident, ref path) => {
|
||||||
visitor.visit_ident(vp.span, ident);
|
|
||||||
visitor.visit_path(path, item.id);
|
visitor.visit_path(path, item.id);
|
||||||
}
|
}
|
||||||
ViewPathGlob(ref path) => {
|
ViewPathGlob(ref path) => {
|
||||||
visitor.visit_path(path, item.id);
|
visitor.visit_path(path, item.id);
|
||||||
}
|
}
|
||||||
ViewPathList(ref prefix, ref list) => {
|
ViewPathList(ref prefix, ref list) => {
|
||||||
for id in list {
|
if !list.is_empty() {
|
||||||
match id.node {
|
for item in list {
|
||||||
PathListIdent { name, .. } => {
|
visitor.visit_path_list_item(prefix, item)
|
||||||
visitor.visit_ident(id.span, name);
|
|
||||||
}
|
}
|
||||||
PathListMod { .. } => ()
|
} else {
|
||||||
|
visitor.visit_path(prefix, item.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note that the `prefix` here is not a complete
|
|
||||||
// path, so we don't use `visit_path`.
|
|
||||||
walk_path(visitor, prefix);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ItemStatic(ref typ, _, ref expr) |
|
ItemStatic(ref typ, _, ref expr) |
|
||||||
@@ -400,6 +397,17 @@ pub fn walk_path<'v, V: Visitor<'v>>(visitor: &mut V, path: &'v Path) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn walk_path_list_item<'v, V: Visitor<'v>>(visitor: &mut V, prefix: &'v Path,
|
||||||
|
item: &'v PathListItem) {
|
||||||
|
for segment in &prefix.segments {
|
||||||
|
visitor.visit_path_segment(prefix.span, segment);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let PathListIdent { name, .. } = item.node {
|
||||||
|
visitor.visit_ident(item.span, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn walk_path_segment<'v, V: Visitor<'v>>(visitor: &mut V,
|
pub fn walk_path_segment<'v, V: Visitor<'v>>(visitor: &mut V,
|
||||||
path_span: Span,
|
path_span: Span,
|
||||||
segment: &'v PathSegment) {
|
segment: &'v PathSegment) {
|
||||||
|
|||||||
@@ -1386,6 +1386,13 @@ impl LateLintPass for Stability {
|
|||||||
&stab.map(|s| hir_to_ast_stability(s)).as_ref()));
|
&stab.map(|s| hir_to_ast_stability(s)).as_ref()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn check_path_list_item(&mut self, cx: &LateContext, item: &hir::PathListItem) {
|
||||||
|
stability::check_path_list_item(cx.tcx, item,
|
||||||
|
&mut |id, sp, stab|
|
||||||
|
self.lint(cx, id, sp,
|
||||||
|
&stab.map(|s| hir_to_ast_stability(s)).as_ref()));
|
||||||
|
}
|
||||||
|
|
||||||
fn check_pat(&mut self, cx: &LateContext, pat: &hir::Pat) {
|
fn check_pat(&mut self, cx: &LateContext, pat: &hir::Pat) {
|
||||||
stability::check_pat(cx.tcx, pat,
|
stability::check_pat(cx.tcx, pat,
|
||||||
&mut |id, sp, stab|
|
&mut |id, sp, stab|
|
||||||
|
|||||||
@@ -859,23 +859,6 @@ impl<'a, 'tcx> PrivacyVisitor<'a, 'tcx> {
|
|||||||
|
|
||||||
impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
|
impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
|
||||||
fn visit_item(&mut self, item: &hir::Item) {
|
fn visit_item(&mut self, item: &hir::Item) {
|
||||||
if let hir::ItemUse(ref vpath) = item.node {
|
|
||||||
if let hir::ViewPathList(ref prefix, ref list) = vpath.node {
|
|
||||||
for pid in list {
|
|
||||||
match pid.node {
|
|
||||||
hir::PathListIdent { id, name, .. } => {
|
|
||||||
debug!("privacy - ident item {}", id);
|
|
||||||
self.check_path(pid.span, id, name.name);
|
|
||||||
}
|
|
||||||
hir::PathListMod { id, .. } => {
|
|
||||||
debug!("privacy - mod item {}", id);
|
|
||||||
let name = prefix.segments.last().unwrap().identifier.name;
|
|
||||||
self.check_path(pid.span, id, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let orig_curitem = replace(&mut self.curitem, item.id);
|
let orig_curitem = replace(&mut self.curitem, item.id);
|
||||||
visit::walk_item(self, item);
|
visit::walk_item(self, item);
|
||||||
self.curitem = orig_curitem;
|
self.curitem = orig_curitem;
|
||||||
@@ -997,11 +980,25 @@ impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_path(&mut self, path: &hir::Path, id: ast::NodeId) {
|
fn visit_path(&mut self, path: &hir::Path, id: ast::NodeId) {
|
||||||
|
if !path.segments.is_empty() {
|
||||||
self.check_path(path.span, id, path.segments.last().unwrap().identifier.name);
|
self.check_path(path.span, id, path.segments.last().unwrap().identifier.name);
|
||||||
visit::walk_path(self, path);
|
visit::walk_path(self, path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_path_list_item(&mut self, prefix: &hir::Path, item: &hir::PathListItem) {
|
||||||
|
let name = if let hir::PathListIdent { name, .. } = item.node {
|
||||||
|
name.name
|
||||||
|
} else if !prefix.segments.is_empty() {
|
||||||
|
prefix.segments.last().unwrap().identifier.name
|
||||||
|
} else {
|
||||||
|
self.tcx.sess.bug("`self` import in an import list with empty prefix");
|
||||||
|
};
|
||||||
|
self.check_path(item.span, item.node.id(), name);
|
||||||
|
visit::walk_path_list_item(self, prefix, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// The privacy sanity check visitor, ensures unnecessary visibility isn't here
|
/// The privacy sanity check visitor, ensures unnecessary visibility isn't here
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -2210,10 +2210,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||||||
|
|
||||||
ItemUse(ref view_path) => {
|
ItemUse(ref view_path) => {
|
||||||
// check for imports shadowing primitive types
|
// check for imports shadowing primitive types
|
||||||
let check_rename = |id, ident: Ident| {
|
let check_rename = |this: &Self, id, ident: Ident| {
|
||||||
match self.def_map.borrow().get(&id).map(|d| d.full_def()) {
|
match this.def_map.borrow().get(&id).map(|d| d.full_def()) {
|
||||||
Some(DefTy(..)) | Some(DefStruct(..)) | Some(DefTrait(..)) | None => {
|
Some(DefTy(..)) | Some(DefStruct(..)) | Some(DefTrait(..)) | None => {
|
||||||
self.check_if_primitive_type_name(ident.name, item.span);
|
this.check_if_primitive_type_name(ident.name, item.span);
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
@@ -2221,12 +2221,28 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||||||
|
|
||||||
match view_path.node {
|
match view_path.node {
|
||||||
hir::ViewPathSimple(ident, _) => {
|
hir::ViewPathSimple(ident, _) => {
|
||||||
check_rename(item.id, ident);
|
check_rename(self, item.id, ident);
|
||||||
}
|
}
|
||||||
hir::ViewPathList(_, ref items) => {
|
hir::ViewPathList(ref prefix, ref items) => {
|
||||||
for item in items {
|
for item in items {
|
||||||
if let Some(ident) = item.node.rename() {
|
if let Some(ident) = item.node.rename() {
|
||||||
check_rename(item.node.id(), ident);
|
check_rename(self, item.node.id(), ident);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resolve prefix of an import with empty braces (issue #28388)
|
||||||
|
if items.is_empty() && !prefix.segments.is_empty() {
|
||||||
|
match self.resolve_crate_relative_path(prefix.span,
|
||||||
|
&prefix.segments,
|
||||||
|
TypeNS) {
|
||||||
|
Some((def, lp)) => self.record_def(item.id,
|
||||||
|
PathResolution::new(def, lp, 0)),
|
||||||
|
None => {
|
||||||
|
resolve_error(self,
|
||||||
|
prefix.span,
|
||||||
|
ResolutionError::FailedToResolve(
|
||||||
|
&path_names_to_string(prefix, 0)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,6 +127,9 @@ pub trait Visitor<'v> : Sized {
|
|||||||
fn visit_path(&mut self, path: &'v Path, _id: ast::NodeId) {
|
fn visit_path(&mut self, path: &'v Path, _id: ast::NodeId) {
|
||||||
walk_path(self, path)
|
walk_path(self, path)
|
||||||
}
|
}
|
||||||
|
fn visit_path_list_item(&mut self, prefix: &'v Path, item: &'v PathListItem) {
|
||||||
|
walk_path_list_item(self, prefix, item)
|
||||||
|
}
|
||||||
fn visit_path_segment(&mut self, path_span: Span, path_segment: &'v PathSegment) {
|
fn visit_path_segment(&mut self, path_span: Span, path_segment: &'v PathSegment) {
|
||||||
walk_path_segment(self, path_span, path_segment)
|
walk_path_segment(self, path_span, path_segment)
|
||||||
}
|
}
|
||||||
@@ -209,33 +212,20 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) {
|
|||||||
ItemExternCrate(..) => {}
|
ItemExternCrate(..) => {}
|
||||||
ItemUse(ref vp) => {
|
ItemUse(ref vp) => {
|
||||||
match vp.node {
|
match vp.node {
|
||||||
ViewPathSimple(ident, ref path) => {
|
ViewPathSimple(_ident, ref path) => {
|
||||||
visitor.visit_ident(vp.span, ident);
|
|
||||||
visitor.visit_path(path, item.id);
|
visitor.visit_path(path, item.id);
|
||||||
}
|
}
|
||||||
ViewPathGlob(ref path) => {
|
ViewPathGlob(ref path) => {
|
||||||
visitor.visit_path(path, item.id);
|
visitor.visit_path(path, item.id);
|
||||||
}
|
}
|
||||||
ViewPathList(ref prefix, ref list) => {
|
ViewPathList(ref prefix, ref list) => {
|
||||||
for id in list {
|
if !list.is_empty() {
|
||||||
match id.node {
|
for item in list {
|
||||||
PathListIdent { name, rename, .. } => {
|
visitor.visit_path_list_item(prefix, item)
|
||||||
visitor.visit_ident(id.span, name);
|
|
||||||
if let Some(ident) = rename {
|
|
||||||
visitor.visit_ident(id.span, ident);
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
visitor.visit_path(prefix, item.id);
|
||||||
}
|
}
|
||||||
PathListMod { rename, .. } => {
|
|
||||||
if let Some(ident) = rename {
|
|
||||||
visitor.visit_ident(id.span, ident);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note that the `prefix` here is not a complete
|
|
||||||
// path, so we don't use `visit_path`.
|
|
||||||
walk_path(visitor, prefix);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -417,6 +407,17 @@ pub fn walk_path<'v, V: Visitor<'v>>(visitor: &mut V, path: &'v Path) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn walk_path_list_item<'v, V: Visitor<'v>>(visitor: &mut V, prefix: &'v Path,
|
||||||
|
item: &'v PathListItem) {
|
||||||
|
for segment in &prefix.segments {
|
||||||
|
visitor.visit_path_segment(prefix.span, segment);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let PathListIdent { name, .. } = item.node {
|
||||||
|
visitor.visit_ident(item.span, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn walk_path_segment<'v, V: Visitor<'v>>(visitor: &mut V,
|
pub fn walk_path_segment<'v, V: Visitor<'v>>(visitor: &mut V,
|
||||||
path_span: Span,
|
path_span: Span,
|
||||||
segment: &'v PathSegment) {
|
segment: &'v PathSegment) {
|
||||||
|
|||||||
25
src/test/compile-fail/issue-28075.rs
Normal file
25
src/test/compile-fail/issue-28075.rs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// Unstable entities should be caught in import lists
|
||||||
|
|
||||||
|
// aux-build:lint_stability.rs
|
||||||
|
|
||||||
|
#![allow(unused_imports)]
|
||||||
|
|
||||||
|
extern crate lint_stability;
|
||||||
|
|
||||||
|
use lint_stability::{unstable, deprecated}; //~ ERROR use of unstable library feature 'test_feature'
|
||||||
|
//~^ WARNING use of deprecated item
|
||||||
|
|
||||||
|
use lint_stability::unstable::{self as u}; //~ ERROR use of unstable library feature 'test_feature'
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
||||||
15
src/test/compile-fail/issue-28388-1.rs
Normal file
15
src/test/compile-fail/issue-28388-1.rs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// Prefix in imports with empty braces should be resolved and checked privacy, stability, etc.
|
||||||
|
|
||||||
|
use foo::{}; //~ ERROR failed to resolve. foo
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
19
src/test/compile-fail/issue-28388-2.rs
Normal file
19
src/test/compile-fail/issue-28388-2.rs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// Prefix in imports with empty braces should be resolved and checked privacy, stability, etc.
|
||||||
|
|
||||||
|
mod m {
|
||||||
|
mod n {}
|
||||||
|
}
|
||||||
|
|
||||||
|
use m::n::{}; //~ ERROR module `n` is private
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
20
src/test/compile-fail/issue-28388-3.rs
Normal file
20
src/test/compile-fail/issue-28388-3.rs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// Prefix in imports with empty braces should be resolved and checked privacy, stability, etc.
|
||||||
|
|
||||||
|
// aux-build:lint_stability.rs
|
||||||
|
|
||||||
|
extern crate lint_stability;
|
||||||
|
|
||||||
|
use lint_stability::UnstableStruct::{}; //~ ERROR use of unstable library feature 'test_feature'
|
||||||
|
use lint_stability::StableStruct::{}; // OK
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
@@ -14,7 +14,8 @@
|
|||||||
#![feature(foo)] //~ ERROR unused or unknown feature
|
#![feature(foo)] //~ ERROR unused or unknown feature
|
||||||
|
|
||||||
extern crate lint_output_format; //~ ERROR use of unstable library feature
|
extern crate lint_output_format; //~ ERROR use of unstable library feature
|
||||||
use lint_output_format::{foo, bar};
|
use lint_output_format::{foo, bar}; //~ ERROR use of unstable library feature
|
||||||
|
//~^ WARNING use of deprecated item,
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let _x = foo(); //~ WARNING #[warn(deprecated)] on by default
|
let _x = foo(); //~ WARNING #[warn(deprecated)] on by default
|
||||||
|
|||||||
Reference in New Issue
Block a user