Rollup merge of #95859 - rainy-me:unterminated-nested-block-comment, r=petrochenkov
Improve diagnostics for unterminated nested block comment close #95283 (This is my first time try to messing around with rust compiler and might get a lot of things wrong... 🙇 )
This commit is contained in:
commit
946d76ec0e
3 changed files with 75 additions and 10 deletions
|
@ -182,16 +182,7 @@ impl<'a> StringReader<'a> {
|
||||||
}
|
}
|
||||||
rustc_lexer::TokenKind::BlockComment { doc_style, terminated } => {
|
rustc_lexer::TokenKind::BlockComment { doc_style, terminated } => {
|
||||||
if !terminated {
|
if !terminated {
|
||||||
let msg = match doc_style {
|
self.report_unterminated_block_comment(start, doc_style);
|
||||||
Some(_) => "unterminated block doc-comment",
|
|
||||||
None => "unterminated block comment",
|
|
||||||
};
|
|
||||||
let last_bpos = self.pos;
|
|
||||||
self.sess.span_diagnostic.span_fatal_with_code(
|
|
||||||
self.mk_sp(start, last_bpos),
|
|
||||||
msg,
|
|
||||||
error_code!(E0758),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip non-doc comments
|
// Skip non-doc comments
|
||||||
|
@ -553,6 +544,55 @@ impl<'a> StringReader<'a> {
|
||||||
err.emit()
|
err.emit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn report_unterminated_block_comment(&self, start: BytePos, doc_style: Option<DocStyle>) {
|
||||||
|
let msg = match doc_style {
|
||||||
|
Some(_) => "unterminated block doc-comment",
|
||||||
|
None => "unterminated block comment",
|
||||||
|
};
|
||||||
|
let last_bpos = self.pos;
|
||||||
|
let mut err = self.sess.span_diagnostic.struct_span_fatal_with_code(
|
||||||
|
self.mk_sp(start, last_bpos),
|
||||||
|
msg,
|
||||||
|
error_code!(E0758),
|
||||||
|
);
|
||||||
|
let mut nested_block_comment_open_idxs = vec![];
|
||||||
|
let mut last_nested_block_comment_idxs = None;
|
||||||
|
let mut content_chars = self.str_from(start).char_indices().peekable();
|
||||||
|
|
||||||
|
while let Some((idx, current_char)) = content_chars.next() {
|
||||||
|
match content_chars.peek() {
|
||||||
|
Some((_, '*')) if current_char == '/' => {
|
||||||
|
nested_block_comment_open_idxs.push(idx);
|
||||||
|
}
|
||||||
|
Some((_, '/')) if current_char == '*' => {
|
||||||
|
last_nested_block_comment_idxs =
|
||||||
|
nested_block_comment_open_idxs.pop().map(|open_idx| (open_idx, idx));
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some((nested_open_idx, nested_close_idx)) = last_nested_block_comment_idxs {
|
||||||
|
err.span_label(self.mk_sp(start, start + BytePos(2)), msg)
|
||||||
|
.span_label(
|
||||||
|
self.mk_sp(
|
||||||
|
start + BytePos(nested_open_idx as u32),
|
||||||
|
start + BytePos(nested_open_idx as u32 + 2),
|
||||||
|
),
|
||||||
|
"...as last nested comment starts here, maybe you want to close this instead?",
|
||||||
|
)
|
||||||
|
.span_label(
|
||||||
|
self.mk_sp(
|
||||||
|
start + BytePos(nested_close_idx as u32),
|
||||||
|
start + BytePos(nested_close_idx as u32 + 2),
|
||||||
|
),
|
||||||
|
"...and last nested comment terminates here.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
err.emit();
|
||||||
|
}
|
||||||
|
|
||||||
// RFC 3101 introduced the idea of (reserved) prefixes. As of Rust 2021,
|
// RFC 3101 introduced the idea of (reserved) prefixes. As of Rust 2021,
|
||||||
// using a (unknown) prefix is an error. In earlier editions, however, they
|
// using a (unknown) prefix is an error. In earlier editions, however, they
|
||||||
// only result in a (allowed by default) lint, and are treated as regular
|
// only result in a (allowed by default) lint, and are treated as regular
|
||||||
|
|
4
src/test/ui/unterminated-nested-comment.rs
Normal file
4
src/test/ui/unterminated-nested-comment.rs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/* //~ ERROR E0758
|
||||||
|
/* */
|
||||||
|
/*
|
||||||
|
*/
|
21
src/test/ui/unterminated-nested-comment.stderr
Normal file
21
src/test/ui/unterminated-nested-comment.stderr
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
error[E0758]: unterminated block comment
|
||||||
|
--> $DIR/unterminated-nested-comment.rs:1:1
|
||||||
|
|
|
||||||
|
LL | /*
|
||||||
|
| ^-
|
||||||
|
| |
|
||||||
|
| _unterminated block comment
|
||||||
|
| |
|
||||||
|
LL | | /* */
|
||||||
|
LL | | /*
|
||||||
|
| | --
|
||||||
|
| | |
|
||||||
|
| | ...as last nested comment starts here, maybe you want to close this instead?
|
||||||
|
LL | | */
|
||||||
|
| |_--^
|
||||||
|
| |
|
||||||
|
| ...and last nested comment terminates here.
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0758`.
|
Loading…
Add table
Add a link
Reference in a new issue