Skip to content

Commit 46a6af1

Browse files
committed
Change < interpreted as generic arg start warning
``` warning: `<` is interpreted as a start of generic arguments for `usize`, not a comparison --> $DIR/issue-22644.rs:16:33 | 16 | println!("{}", a as usize < b); | - ^ interpreted as generic argument | | | not interpreted as comparison | help: if you want to compare the casted value then write: | println!("{}", (a as usize) < b); ```
1 parent 5fcfa08 commit 46a6af1

File tree

2 files changed

+39
-27
lines changed

2 files changed

+39
-27
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use ast::RangeEnd;
4242
use {ast, attr};
4343
use codemap::{self, CodeMap, Spanned, respan};
4444
use syntax_pos::{self, Span, BytePos};
45-
use errors::{self, DiagnosticBuilder, Level};
45+
use errors::{self, DiagnosticBuilder};
4646
use parse::{self, classify, token};
4747
use parse::common::SeqSep;
4848
use parse::lexer::TokenAndSpan;
@@ -441,7 +441,14 @@ fn dummy_arg(span: Span) -> Arg {
441441
Arg { ty: P(ty), pat: pat, id: ast::DUMMY_NODE_ID }
442442
}
443443

444-
type RewindPoint = (token::Token, Span, Option<Span>, Span, TokenCursor, Vec<TokenType>);
444+
struct RewindPoint {
445+
token: token::Token,
446+
span: Span,
447+
meta_var_span: Option<Span>,
448+
prev_span: Span,
449+
token_cursor: TokenCursor,
450+
expected_tokens: Vec<TokenType>,
451+
}
445452

446453
impl<'a> Parser<'a> {
447454
pub fn new(sess: &'a ParseSess,
@@ -2835,11 +2842,13 @@ impl<'a> Parser<'a> {
28352842
// Rewind to before attempting to parse the type with generics, to get
28362843
// arround #22644.
28372844
let rp_err = self.get_rewind_point();
2845+
let sp = rp_err.span.clone();
28382846
self.rewind(rp);
28392847
let lo = self.span;
28402848
let path = match self.parse_path_without_generics(PathStyle::Type) {
28412849
Ok(path) => {
28422850
// Successfully parsed the type leaving a `<` yet to parse
2851+
err.cancel();
28432852
let codemap = self.sess.codemap();
28442853
let suggestion_span = lhs_span.to(self.prev_span);
28452854
let suggestion = match codemap.span_to_snippet(suggestion_span) {
@@ -2850,15 +2859,17 @@ impl<'a> Parser<'a> {
28502859
Ok(lstring) => format!("`{}`", lstring),
28512860
_ => "a type".to_string(),
28522861
};
2853-
err.span_suggestion(suggestion_span,
2862+
let msg = format!("`<` is interpreted as a start of generic \
2863+
arguments for {}, not a comparison",
2864+
warn_message);
2865+
let mut warn = self.sess.span_diagnostic.struct_span_warn(sp, &msg);
2866+
warn.span_label(sp, "interpreted as generic argument");
2867+
warn.span_label(self.span, "not interpreted as comparison");
2868+
warn.span_suggestion(suggestion_span,
28542869
"if you want to compare the casted value \
28552870
then write:",
28562871
suggestion);
2857-
err.level = Level::Warning;
2858-
err.set_message(&format!("`<` is interpreted as a start of generic \
2859-
arguments for {}, not a comparison",
2860-
warn_message));
2861-
err.emit();
2872+
warn.emit();
28622873
path
28632874
}
28642875
Err(mut path_err) => {
@@ -6255,23 +6266,22 @@ impl<'a> Parser<'a> {
62556266
}
62566267

62576268
fn get_rewind_point(&mut self) -> RewindPoint {
6258-
(
6259-
self.token.clone(),
6260-
self.span,
6261-
self.meta_var_span,
6262-
self.prev_span,
6263-
self.token_cursor.clone(),
6264-
self.expected_tokens.clone(),
6265-
)
6269+
RewindPoint {
6270+
token: self.token.clone(),
6271+
span: self.span,
6272+
meta_var_span: self.meta_var_span,
6273+
prev_span: self.prev_span,
6274+
token_cursor: self.token_cursor.clone(),
6275+
expected_tokens: self.expected_tokens.clone(),
6276+
}
62666277
}
62676278

62686279
fn rewind(&mut self, rp: RewindPoint) {
6269-
let (token, span, meta_var_span, prev_span, token_cursor, expected_tokens,) = rp;
6270-
self.token = token;
6271-
self.span = span;
6272-
self.meta_var_span = meta_var_span;
6273-
self.prev_span = prev_span;
6274-
self.token_cursor = token_cursor;
6275-
self.expected_tokens = expected_tokens;
6280+
self.token = rp.token;
6281+
self.span = rp.span;
6282+
self.meta_var_span = rp.meta_var_span;
6283+
self.prev_span = rp.prev_span;
6284+
self.token_cursor = rp.token_cursor;
6285+
self.expected_tokens = rp.expected_tokens;
62766286
}
62776287
}

src/test/ui/issue-22644.stderr

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ warning: `<` is interpreted as a start of generic arguments for `usize`, not a c
22
--> $DIR/issue-22644.rs:16:33
33
|
44
16 | println!("{}", a as usize < b);
5-
| ^ expected one of `!`, `(`, `+`, `,`, `::`, or `>` here
5+
| - ^ interpreted as generic argument
6+
| |
7+
| not interpreted as comparison
68
|
79
help: if you want to compare the casted value then write:
810
| println!("{}", (a as usize) < b);
@@ -11,9 +13,9 @@ warning: `<` is interpreted as a start of generic arguments for `usize`, not a c
1113
--> $DIR/issue-22644.rs:17:33
1214
|
1315
17 | println!("{}", a as usize < 4);
14-
| -^ unexpected token
15-
| |
16-
| expected one of `>`, identifier, lifetime, or type here
16+
| - ^ interpreted as generic argument
17+
| |
18+
| not interpreted as comparison
1719
|
1820
help: if you want to compare the casted value then write:
1921
| println!("{}", (a as usize) < 4);

0 commit comments

Comments
 (0)