Skip to content

Commit 8c361aa

Browse files
authored
Rollup merge of rust-lang#75319 - estebank:format-ice, r=eddyb
Fix ICE rust-lang#75307 in `format` Remove usages of `unwrap` (even when some are safe today). Fix rust-lang#75307.
2 parents 5b5eec7 + 0a4f4e8 commit 8c361aa

File tree

3 files changed

+26
-20
lines changed

3 files changed

+26
-20
lines changed

src/librustc_builtin_macros/format.rs

+13-20
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ fn parse_args<'a>(
149149
return Err(err);
150150
} else {
151151
// ...after that delegate to `expect` to also include the other expected tokens.
152-
return Err(p.expect(&token::Comma).err().unwrap());
152+
let _ = p.expect(&token::Comma)?;
153153
}
154154
}
155155
first = false;
@@ -359,24 +359,18 @@ impl<'a, 'b> Context<'a, 'b> {
359359
// for `println!("{7:7$}", 1);`
360360
refs.sort();
361361
refs.dedup();
362-
let (arg_list, mut sp) = if refs.len() == 1 {
363-
let spans: Vec<_> = spans.into_iter().filter_map(|sp| sp.copied()).collect();
364-
(
365-
format!("argument {}", refs[0]),
366-
if spans.is_empty() {
367-
MultiSpan::from_span(self.fmtsp)
368-
} else {
369-
MultiSpan::from_spans(spans)
370-
},
371-
)
362+
let spans: Vec<_> = spans.into_iter().filter_map(|sp| sp.copied()).collect();
363+
let sp = if self.arg_spans.is_empty() || spans.is_empty() {
364+
MultiSpan::from_span(self.fmtsp)
365+
} else {
366+
MultiSpan::from_spans(spans)
367+
};
368+
let arg_list = if refs.len() == 1 {
369+
format!("argument {}", refs[0])
372370
} else {
373-
let pos = MultiSpan::from_spans(spans.into_iter().map(|s| *s.unwrap()).collect());
374371
let reg = refs.pop().unwrap();
375-
(format!("arguments {head} and {tail}", head = refs.join(", "), tail = reg,), pos)
372+
format!("arguments {head} and {tail}", head = refs.join(", "), tail = reg)
376373
};
377-
if self.arg_spans.is_empty() {
378-
sp = MultiSpan::from_span(self.fmtsp);
379-
}
380374

381375
e = self.ecx.struct_span_err(
382376
sp,
@@ -1067,10 +1061,9 @@ pub fn expand_preparsed_format_args(
10671061
let args_unused = errs_len;
10681062

10691063
let mut diag = {
1070-
if errs_len == 1 {
1071-
let (sp, msg) = errs.into_iter().next().unwrap();
1072-
let mut diag = cx.ecx.struct_span_err(sp, msg);
1073-
diag.span_label(sp, msg);
1064+
if let [(sp, msg)] = &errs[..] {
1065+
let mut diag = cx.ecx.struct_span_err(*sp, *msg);
1066+
diag.span_label(*sp, *msg);
10741067
diag
10751068
} else {
10761069
let mut diag = cx.ecx.struct_span_err(

src/test/ui/issues/issue-75307.rs

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
format!(r"{}{}{}", named_arg=1); //~ ERROR invalid reference to positional arguments 1 and 2
3+
}

src/test/ui/issues/issue-75307.stderr

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
error: invalid reference to positional arguments 1 and 2 (there is 1 argument)
2+
--> $DIR/issue-75307.rs:2:13
3+
|
4+
LL | format!(r"{}{}{}", named_arg=1);
5+
| ^^^^^^^^^
6+
|
7+
= note: positional arguments are zero-based
8+
9+
error: aborting due to previous error
10+

0 commit comments

Comments
 (0)