Skip to content

Commit dcd70c0

Browse files
committed
return when captured argument is not a struct field
1 parent a0a2ec3 commit dcd70c0

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-20
lines changed

compiler/rustc_builtin_macros/src/format.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -1279,19 +1279,20 @@ pub fn expand_preparsed_format_args(
12791279
let captured_arg_span =
12801280
fmt_span.from_inner(InnerSpan::new(err.span.start, err.span.end));
12811281
let positional_args = args.iter().filter(|arg| !arg.named).collect::<Vec<_>>();
1282-
let mut suggestions = vec![(captured_arg_span, positional_args.len().to_string())];
12831282
if let Ok(arg) = ecx.source_map().span_to_snippet(captured_arg_span) {
12841283
let span = match positional_args.last() {
12851284
Some(arg) => arg.expr.span,
12861285
None => fmt_sp,
12871286
};
1288-
suggestions.push((span.shrink_to_hi(), format!(", {}", arg)))
1287+
e.multipart_suggestion_verbose(
1288+
"consider using a positional formatting argument instead",
1289+
vec![
1290+
(captured_arg_span, positional_args.len().to_string()),
1291+
(span.shrink_to_hi(), format!(", {}", arg)),
1292+
],
1293+
Applicability::MachineApplicable,
1294+
);
12891295
}
1290-
e.multipart_suggestion_verbose(
1291-
"consider using a positional formatting argument instead",
1292-
suggestions,
1293-
Applicability::MachineApplicable,
1294-
);
12951296
}
12961297
e.emit();
12971298
return DummyResult::raw_expr(sp, true);

compiler/rustc_parse_format/src/lib.rs

+12-13
Original file line numberDiff line numberDiff line change
@@ -229,20 +229,16 @@ impl<'a> Iterator for Parser<'a> {
229229
Some(String(self.string(pos + 1)))
230230
} else {
231231
let arg = self.argument(lbrace_end);
232-
match self.must_consume('}') {
233-
Some(rbrace_byte_idx) => {
234-
let lbrace_inner_offset = self.to_span_index(pos);
235-
let rbrace_inner_offset = self.to_span_index(rbrace_byte_idx);
236-
if self.is_literal {
237-
self.arg_places.push(
238-
lbrace_inner_offset
239-
.to(InnerOffset(rbrace_inner_offset.0 + 1)),
240-
);
241-
}
242-
}
243-
None => {
244-
self.suggest_positional_arg_instead_of_captured_arg(arg);
232+
if let Some(rbrace_byte_idx) = self.must_consume('}') {
233+
let lbrace_inner_offset = self.to_span_index(pos);
234+
let rbrace_inner_offset = self.to_span_index(rbrace_byte_idx);
235+
if self.is_literal {
236+
self.arg_places.push(
237+
lbrace_inner_offset.to(InnerOffset(rbrace_inner_offset.0 + 1)),
238+
);
245239
}
240+
} else {
241+
self.suggest_positional_arg_instead_of_captured_arg(arg);
246242
}
247243
Some(NextArgument(arg))
248244
}
@@ -767,6 +763,9 @@ impl<'a> Parser<'a> {
767763
let byte_pos = self.to_span_index(end);
768764
let start = InnerOffset(byte_pos.0 + 1);
769765
let field = self.argument(start);
766+
if !self.consume('}') {
767+
return;
768+
}
770769
if let ArgumentNamed(_) = arg.position {
771770
if let ArgumentNamed(_) = field.position {
772771
self.errors.insert(

0 commit comments

Comments
 (0)