Skip to content

Commit

Permalink
Simplify and fix byte skipping in format! string parser
Browse files Browse the repository at this point in the history
Fixes '\\' handling in format strings.

Fixes #83340
  • Loading branch information
osa1 committed Mar 21, 2021
1 parent bbf07c0 commit ae8ef70
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 14 deletions.
23 changes: 9 additions & 14 deletions compiler/rustc_parse_format/src/lib.rs
Expand Up @@ -735,25 +735,24 @@ fn find_skips_from_snippet(
};

fn find_skips(snippet: &str, is_raw: bool) -> Vec<usize> {
let mut eat_ws = false;
let mut s = snippet.char_indices().peekable();
let mut skips = vec![];
while let Some((pos, c)) = s.next() {
match (c, s.peek()) {
// skip whitespace and empty lines ending in '\\'
('\\', Some((next_pos, '\n'))) if !is_raw => {
eat_ws = true;
skips.push(pos);
skips.push(*next_pos);
let _ = s.next();
}
('\\', Some((next_pos, '\n' | 'n' | 't'))) if eat_ws => {
skips.push(pos);
skips.push(*next_pos);
let _ = s.next();
}
(' ' | '\n' | '\t', _) if eat_ws => {
skips.push(pos);

while let Some((pos, c)) = s.peek() {
if matches!(c, ' ' | '\n' | '\t') {
skips.push(*pos);
let _ = s.next();
} else {
break;
}
}
}
('\\', Some((next_pos, 'n' | 't' | 'r' | '0' | '\\' | '\'' | '\"'))) => {
skips.push(*next_pos);
Expand Down Expand Up @@ -804,10 +803,6 @@ fn find_skips_from_snippet(
}
}
}
_ if eat_ws => {
// `take_while(|c| c.is_whitespace())`
eat_ws = false;
}
_ => {}
}
}
Expand Down
8 changes: 8 additions & 0 deletions src/test/ui/macros/issue-83340.rs
@@ -0,0 +1,8 @@
// check-fail

fn main() {
println!(
"\
\n {} │", //~ ERROR: 1 positional argument in format string, but no arguments were given
);
}
8 changes: 8 additions & 0 deletions src/test/ui/macros/issue-83340.stderr
@@ -0,0 +1,8 @@
error: 1 positional argument in format string, but no arguments were given
--> $DIR/issue-83340.rs:6:4
|
LL | \n {} │",
| ^^

error: aborting due to previous error

0 comments on commit ae8ef70

Please sign in to comment.