return when expr has error
fmt add a comment
This commit is contained in:
parent
c0e9c86b3f
commit
5c7278a364
3 changed files with 75 additions and 5 deletions
|
@ -636,13 +636,34 @@ trait UnusedDelimLint {
|
||||||
left_pos: Option<BytePos>,
|
left_pos: Option<BytePos>,
|
||||||
right_pos: Option<BytePos>,
|
right_pos: Option<BytePos>,
|
||||||
) {
|
) {
|
||||||
|
// If `value` has `ExprKind::Err`, unused delim lint can be broken.
|
||||||
|
// For example, the following code caused ICE.
|
||||||
|
// This is because the `ExprKind::Call` in `value` has `ExprKind::Err` as its argument
|
||||||
|
// and this leads to wrong spans. #104897
|
||||||
|
//
|
||||||
|
// ```
|
||||||
|
// fn f(){(print!(á
|
||||||
|
// ```
|
||||||
|
use rustc_ast::visit::{walk_expr, Visitor};
|
||||||
|
struct ErrExprVisitor {
|
||||||
|
has_error: bool,
|
||||||
|
}
|
||||||
|
impl<'ast> Visitor<'ast> for ErrExprVisitor {
|
||||||
|
fn visit_expr(&mut self, expr: &'ast ast::Expr) {
|
||||||
|
if let ExprKind::Err = expr.kind {
|
||||||
|
self.has_error = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
walk_expr(self, expr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut visitor = ErrExprVisitor { has_error: false };
|
||||||
|
visitor.visit_expr(value);
|
||||||
|
if visitor.has_error {
|
||||||
|
return;
|
||||||
|
}
|
||||||
let spans = match value.kind {
|
let spans = match value.kind {
|
||||||
ast::ExprKind::Block(ref block, None) if block.stmts.len() == 1 => {
|
ast::ExprKind::Block(ref block, None) if block.stmts.len() == 1 => {
|
||||||
if let StmtKind::Expr(expr) = &block.stmts[0].kind
|
|
||||||
&& let ExprKind::Err = expr.kind
|
|
||||||
{
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if let Some(span) = block.stmts[0].span.find_ancestor_inside(value.span) {
|
if let Some(span) = block.stmts[0].span.find_ancestor_inside(value.span) {
|
||||||
Some((value.span.with_hi(span.lo()), value.span.with_lo(span.hi())))
|
Some((value.span.with_hi(span.lo()), value.span.with_lo(span.hi())))
|
||||||
} else {
|
} else {
|
||||||
|
|
6
src/test/ui/lint/issue-104897.rs
Normal file
6
src/test/ui/lint/issue-104897.rs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
// error-pattern: this file contains an unclosed delimiter
|
||||||
|
// error-pattern: this file contains an unclosed delimiter
|
||||||
|
// error-pattern: this file contains an unclosed delimiter
|
||||||
|
// error-pattern: format argument must be a string literal
|
||||||
|
|
||||||
|
fn f(){(print!(á
|
43
src/test/ui/lint/issue-104897.stderr
Normal file
43
src/test/ui/lint/issue-104897.stderr
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
error: this file contains an unclosed delimiter
|
||||||
|
--> $DIR/issue-104897.rs:6:18
|
||||||
|
|
|
||||||
|
LL | fn f(){(print!(á
|
||||||
|
| -- - ^
|
||||||
|
| || |
|
||||||
|
| || unclosed delimiter
|
||||||
|
| |unclosed delimiter
|
||||||
|
| unclosed delimiter
|
||||||
|
|
||||||
|
error: this file contains an unclosed delimiter
|
||||||
|
--> $DIR/issue-104897.rs:6:18
|
||||||
|
|
|
||||||
|
LL | fn f(){(print!(á
|
||||||
|
| -- - ^
|
||||||
|
| || |
|
||||||
|
| || unclosed delimiter
|
||||||
|
| |unclosed delimiter
|
||||||
|
| unclosed delimiter
|
||||||
|
|
||||||
|
error: this file contains an unclosed delimiter
|
||||||
|
--> $DIR/issue-104897.rs:6:18
|
||||||
|
|
|
||||||
|
LL | fn f(){(print!(á
|
||||||
|
| -- - ^
|
||||||
|
| || |
|
||||||
|
| || unclosed delimiter
|
||||||
|
| |unclosed delimiter
|
||||||
|
| unclosed delimiter
|
||||||
|
|
||||||
|
error: format argument must be a string literal
|
||||||
|
--> $DIR/issue-104897.rs:6:16
|
||||||
|
|
|
||||||
|
LL | fn f(){(print!(á
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
help: you might be missing a string literal to format with
|
||||||
|
|
|
||||||
|
LL | fn f(){(print!("{}", á
|
||||||
|
| +++++
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue