mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-25 06:03:16 +00:00
Issue warnings for unnecessary path disambiguators
This commit is contained in:
parent
7d21f21f71
commit
804459bdca
@ -599,9 +599,7 @@ fn parse_nt<'a>(p: &mut Parser<'a>, sp: Span, name: &str) -> Nonterminal {
|
|||||||
panic!(FatalError)
|
panic!(FatalError)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"path" => {
|
"path" => token::NtPath(panictry!(p.parse_path_common(PathStyle::Type, false))),
|
||||||
token::NtPath(panictry!(p.parse_path(PathStyle::Type)))
|
|
||||||
},
|
|
||||||
"meta" => token::NtMeta(panictry!(p.parse_meta_item())),
|
"meta" => token::NtMeta(panictry!(p.parse_meta_item())),
|
||||||
"vis" => token::NtVis(panictry!(p.parse_visibility(true))),
|
"vis" => token::NtVis(panictry!(p.parse_visibility(true))),
|
||||||
// this is not supposed to happen, since it has been checked
|
// this is not supposed to happen, since it has been checked
|
||||||
|
@ -1755,7 +1755,7 @@ impl<'a> Parser<'a> {
|
|||||||
self.expect(&token::ModSep)?;
|
self.expect(&token::ModSep)?;
|
||||||
|
|
||||||
let qself = QSelf { ty, position: path.segments.len() };
|
let qself = QSelf { ty, position: path.segments.len() };
|
||||||
self.parse_path_segments(&mut path.segments, style)?;
|
self.parse_path_segments(&mut path.segments, style, true)?;
|
||||||
|
|
||||||
Ok((qself, ast::Path { segments: path.segments, span: lo.to(self.prev_span) }))
|
Ok((qself, ast::Path { segments: path.segments, span: lo.to(self.prev_span) }))
|
||||||
}
|
}
|
||||||
@ -1770,8 +1770,12 @@ impl<'a> Parser<'a> {
|
|||||||
/// `a::b::C::<D>` (with disambiguator)
|
/// `a::b::C::<D>` (with disambiguator)
|
||||||
/// `Fn(Args)` (without disambiguator)
|
/// `Fn(Args)` (without disambiguator)
|
||||||
/// `Fn::(Args)` (with disambiguator)
|
/// `Fn::(Args)` (with disambiguator)
|
||||||
pub fn parse_path(&mut self, style: PathStyle) -> PResult<'a, ast::Path>
|
pub fn parse_path(&mut self, style: PathStyle) -> PResult<'a, ast::Path> {
|
||||||
{
|
self.parse_path_common(style, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn parse_path_common(&mut self, style: PathStyle, enable_warning: bool)
|
||||||
|
-> PResult<'a, ast::Path> {
|
||||||
maybe_whole!(self, NtPath, |x| x);
|
maybe_whole!(self, NtPath, |x| x);
|
||||||
|
|
||||||
let lo = self.meta_var_span.unwrap_or(self.span);
|
let lo = self.meta_var_span.unwrap_or(self.span);
|
||||||
@ -1779,7 +1783,7 @@ impl<'a> Parser<'a> {
|
|||||||
if self.eat(&token::ModSep) {
|
if self.eat(&token::ModSep) {
|
||||||
segments.push(PathSegment::crate_root(lo));
|
segments.push(PathSegment::crate_root(lo));
|
||||||
}
|
}
|
||||||
self.parse_path_segments(&mut segments, style)?;
|
self.parse_path_segments(&mut segments, style, enable_warning)?;
|
||||||
|
|
||||||
Ok(ast::Path { segments, span: lo.to(self.prev_span) })
|
Ok(ast::Path { segments, span: lo.to(self.prev_span) })
|
||||||
}
|
}
|
||||||
@ -1804,10 +1808,10 @@ impl<'a> Parser<'a> {
|
|||||||
self.parse_path(style)
|
self.parse_path(style)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_path_segments(&mut self, segments: &mut Vec<PathSegment>, style: PathStyle)
|
fn parse_path_segments(&mut self, segments: &mut Vec<PathSegment>, style: PathStyle,
|
||||||
-> PResult<'a, ()> {
|
enable_warning: bool) -> PResult<'a, ()> {
|
||||||
loop {
|
loop {
|
||||||
segments.push(self.parse_path_segment(style)?);
|
segments.push(self.parse_path_segment(style, enable_warning)?);
|
||||||
|
|
||||||
if self.is_import_coupler() || !self.eat(&token::ModSep) {
|
if self.is_import_coupler() || !self.eat(&token::ModSep) {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@ -1815,7 +1819,8 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_path_segment(&mut self, style: PathStyle) -> PResult<'a, PathSegment> {
|
fn parse_path_segment(&mut self, style: PathStyle, enable_warning: bool)
|
||||||
|
-> PResult<'a, PathSegment> {
|
||||||
let ident_span = self.span;
|
let ident_span = self.span;
|
||||||
let ident = self.parse_path_segment_ident()?;
|
let ident = self.parse_path_segment_ident()?;
|
||||||
|
|
||||||
@ -1835,7 +1840,10 @@ impl<'a> Parser<'a> {
|
|||||||
&& self.look_ahead(1, |t| is_args_start(t)) {
|
&& self.look_ahead(1, |t| is_args_start(t)) {
|
||||||
// Generic arguments are found - `<`, `(`, `::<` or `::(`.
|
// Generic arguments are found - `<`, `(`, `::<` or `::(`.
|
||||||
let lo = self.span;
|
let lo = self.span;
|
||||||
self.eat(&token::ModSep);
|
if self.eat(&token::ModSep) && style == PathStyle::Type && enable_warning {
|
||||||
|
self.diagnostic().struct_span_warn(self.prev_span, "unnecessary path disambiguator")
|
||||||
|
.span_label(self.prev_span, "try removing `::`").emit();
|
||||||
|
}
|
||||||
|
|
||||||
let parameters = if self.eat_lt() {
|
let parameters = if self.eat_lt() {
|
||||||
// `<'a, T, A = U>`
|
// `<'a, T, A = U>`
|
||||||
@ -2371,7 +2379,7 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
// Assuming we have just parsed `.`, continue parsing into an expression.
|
// Assuming we have just parsed `.`, continue parsing into an expression.
|
||||||
fn parse_dot_suffix(&mut self, self_arg: P<Expr>, lo: Span) -> PResult<'a, P<Expr>> {
|
fn parse_dot_suffix(&mut self, self_arg: P<Expr>, lo: Span) -> PResult<'a, P<Expr>> {
|
||||||
let segment = self.parse_path_segment(PathStyle::Expr)?;
|
let segment = self.parse_path_segment(PathStyle::Expr, true)?;
|
||||||
Ok(match self.token {
|
Ok(match self.token {
|
||||||
token::OpenDelim(token::Paren) => {
|
token::OpenDelim(token::Paren) => {
|
||||||
// Method call `expr.f()`
|
// Method call `expr.f()`
|
||||||
|
@ -13,13 +13,24 @@
|
|||||||
#![feature(rustc_attrs)]
|
#![feature(rustc_attrs)]
|
||||||
#![allow(unused)]
|
#![allow(unused)]
|
||||||
|
|
||||||
|
macro_rules! m {
|
||||||
|
($p: path) => {
|
||||||
|
let _ = $p(0);
|
||||||
|
let _: $p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct Foo<T> {
|
struct Foo<T> {
|
||||||
_a: T,
|
_a: T,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct S<T>(T);
|
||||||
|
|
||||||
fn f() {
|
fn f() {
|
||||||
let f = Some(Foo { _a: 42 }).map(|a| a as Foo::<i32>);
|
let f = Some(Foo { _a: 42 }).map(|a| a as Foo::<i32>); //~ WARN unnecessary path disambiguator
|
||||||
let g: Foo::<i32> = Foo { _a: 42 };
|
let g: Foo::<i32> = Foo { _a: 42 }; //~ WARN unnecessary path disambiguator
|
||||||
|
|
||||||
|
m!(S::<u8>); // OK, no warning
|
||||||
}
|
}
|
||||||
|
|
||||||
#[rustc_error]
|
#[rustc_error]
|
||||||
|
Loading…
Reference in New Issue
Block a user