Skip to content

Commit 40ace17

Browse files
committed
Auto merge of #145882 - m-ou-se:format-args-extend-1-arg, r=petrochenkov
Extended temporary argument to format_args!() in all cases Fixes #145880 by removing the special case.
2 parents b733736 + 663ca24 commit 40ace17

File tree

11 files changed

+140
-147
lines changed

11 files changed

+140
-147
lines changed

compiler/rustc_ast_lowering/src/format.rs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -487,26 +487,6 @@ fn expand_format_args<'hir>(
487487
// Generate:
488488
// []
489489
(vec![], ctx.arena.alloc(ctx.expr(macsp, hir::ExprKind::Array(&[]))))
490-
} else if argmap.len() == 1 && arguments.len() == 1 {
491-
// Only one argument, so we don't need to make the `args` tuple.
492-
//
493-
// Generate:
494-
// super let args = [<core::fmt::Argument>::new_display(&arg)];
495-
let args = ctx.arena.alloc_from_iter(argmap.iter().map(
496-
|(&(arg_index, ty), &placeholder_span)| {
497-
let arg = &arguments[arg_index];
498-
let placeholder_span =
499-
placeholder_span.unwrap_or(arg.expr.span).with_ctxt(macsp.ctxt());
500-
let arg = ctx.lower_expr(&arg.expr);
501-
let ref_arg = ctx.arena.alloc(ctx.expr_ref(arg.span.with_ctxt(macsp.ctxt()), arg));
502-
make_argument(ctx, placeholder_span, ref_arg, ty)
503-
},
504-
));
505-
let args = ctx.arena.alloc(ctx.expr(macsp, hir::ExprKind::Array(args)));
506-
let args_ident = Ident::new(sym::args, macsp);
507-
let (args_pat, args_hir_id) = ctx.pat_ident(macsp, args_ident);
508-
let let_statement = ctx.stmt_super_let_pat(macsp, args_pat, Some(args));
509-
(vec![let_statement], ctx.arena.alloc(ctx.expr_ident_mut(macsp, args_ident, args_hir_id)))
510490
} else {
511491
// Generate:
512492
// super let args = (&arg0, &arg1, &…);

library/coretests/tests/fmt/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ fn test_lifetime() {
1212
let a = format_args!("hello {a} {a:?}");
1313
assert_eq!(a.to_string(), "hello hello hello hello hello hello hello");
1414

15+
// Check that temporaries as arguments are extended.
16+
let b = format_args!("{}", String::new());
17+
let c = format_args!("{}{}", String::new(), String::new());
18+
assert_eq!(b.to_string(), "");
19+
assert_eq!(c.to_string(), "");
20+
1521
// Without arguments, it should also work in consts.
1622
const A: std::fmt::Arguments<'static> = format_args!("hello");
1723
assert_eq!(A.to_string(), "hello");

src/tools/clippy/tests/ui/author/macro_in_closure.stdout

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,42 @@ if let StmtKind::Let(local) = stmt.kind
1010
&& paths::STD_IO_STDIO__PRINT.matches_path(cx, func) // Add the path to `clippy_utils::paths` if needed
1111
&& args.len() == 1
1212
&& let ExprKind::Block(block1, None) = args[0].kind
13-
&& block1.stmts.len() == 1
13+
&& block1.stmts.len() == 2
1414
&& let StmtKind::Let(local1) = block1.stmts[0].kind
1515
&& let Some(init1) = local1.init
16-
&& let ExprKind::Array(elements) = init1.kind
16+
&& let ExprKind::Tup(elements) = init1.kind
1717
&& elements.len() == 1
18-
&& let ExprKind::Call(func1, args1) = elements[0].kind
19-
&& paths::CORE_FMT_RT_ARGUMENT_NEW_DISPLAY.matches_path(cx, func1) // Add the path to `clippy_utils::paths` if needed
20-
&& args1.len() == 1
21-
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = args1[0].kind
18+
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = elements[0].kind
2219
&& let PatKind::Binding(BindingMode::NONE, _, name, None) = local1.pat.kind
2320
&& name.as_str() == "args"
21+
&& let StmtKind::Let(local2) = block1.stmts[1].kind
22+
&& let Some(init2) = local2.init
23+
&& let ExprKind::Array(elements1) = init2.kind
24+
&& elements1.len() == 1
25+
&& let ExprKind::Call(func1, args1) = elements1[0].kind
26+
&& paths::CORE_FMT_RT_ARGUMENT_NEW_DISPLAY.matches_path(cx, func1) // Add the path to `clippy_utils::paths` if needed
27+
&& args1.len() == 1
28+
&& let ExprKind::Field(object, field_name) = args1[0].kind
29+
&& field_name.as_str() == "0"
30+
&& let PatKind::Binding(BindingMode::NONE, _, name1, None) = local2.pat.kind
31+
&& name1.as_str() == "args"
2432
&& let Some(trailing_expr) = block1.expr
2533
&& let ExprKind::Call(func2, args2) = trailing_expr.kind
2634
&& paths::CORE_FMT_RT_NEW_V1.matches_path(cx, func2) // Add the path to `clippy_utils::paths` if needed
2735
&& args2.len() == 2
2836
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner1) = args2[0].kind
29-
&& let ExprKind::Array(elements1) = inner1.kind
30-
&& elements1.len() == 2
31-
&& let ExprKind::Lit(ref lit) = elements1[0].kind
37+
&& let ExprKind::Array(elements2) = inner1.kind
38+
&& elements2.len() == 2
39+
&& let ExprKind::Lit(ref lit) = elements2[0].kind
3240
&& let LitKind::Str(s, _) = lit.node
3341
&& s.as_str() == ""
34-
&& let ExprKind::Lit(ref lit1) = elements1[1].kind
42+
&& let ExprKind::Lit(ref lit1) = elements2[1].kind
3543
&& let LitKind::Str(s1, _) = lit1.node
3644
&& s1.as_str() == "\n"
3745
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner2) = args2[1].kind
3846
&& block.expr.is_none()
39-
&& let PatKind::Binding(BindingMode::NONE, _, name1, None) = local.pat.kind
40-
&& name1.as_str() == "print_text"
47+
&& let PatKind::Binding(BindingMode::NONE, _, name2, None) = local.pat.kind
48+
&& name2.as_str() == "print_text"
4149
{
4250
// report your lint here
4351
}

src/tools/clippy/tests/ui/author/macro_in_loop.stdout

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,36 @@ if let Some(higher::ForLoop { pat: pat, arg: arg, body: body, .. }) = higher::Fo
2020
&& paths::STD_IO_STDIO__PRINT.matches_path(cx, func) // Add the path to `clippy_utils::paths` if needed
2121
&& args.len() == 1
2222
&& let ExprKind::Block(block2, None) = args[0].kind
23-
&& block2.stmts.len() == 1
23+
&& block2.stmts.len() == 2
2424
&& let StmtKind::Let(local) = block2.stmts[0].kind
2525
&& let Some(init) = local.init
26-
&& let ExprKind::Array(elements) = init.kind
26+
&& let ExprKind::Tup(elements) = init.kind
2727
&& elements.len() == 1
28-
&& let ExprKind::Call(func1, args1) = elements[0].kind
29-
&& paths::CORE_FMT_RT_ARGUMENT_NEW_DISPLAY.matches_path(cx, func1) // Add the path to `clippy_utils::paths` if needed
30-
&& args1.len() == 1
31-
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = args1[0].kind
28+
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = elements[0].kind
3229
&& let PatKind::Binding(BindingMode::NONE, _, name1, None) = local.pat.kind
3330
&& name1.as_str() == "args"
31+
&& let StmtKind::Let(local1) = block2.stmts[1].kind
32+
&& let Some(init1) = local1.init
33+
&& let ExprKind::Array(elements1) = init1.kind
34+
&& elements1.len() == 1
35+
&& let ExprKind::Call(func1, args1) = elements1[0].kind
36+
&& paths::CORE_FMT_RT_ARGUMENT_NEW_DISPLAY.matches_path(cx, func1) // Add the path to `clippy_utils::paths` if needed
37+
&& args1.len() == 1
38+
&& let ExprKind::Field(object, field_name) = args1[0].kind
39+
&& field_name.as_str() == "0"
40+
&& let PatKind::Binding(BindingMode::NONE, _, name2, None) = local1.pat.kind
41+
&& name2.as_str() == "args"
3442
&& let Some(trailing_expr) = block2.expr
3543
&& let ExprKind::Call(func2, args2) = trailing_expr.kind
3644
&& paths::CORE_FMT_RT_NEW_V1.matches_path(cx, func2) // Add the path to `clippy_utils::paths` if needed
3745
&& args2.len() == 2
3846
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner1) = args2[0].kind
39-
&& let ExprKind::Array(elements1) = inner1.kind
40-
&& elements1.len() == 2
41-
&& let ExprKind::Lit(ref lit2) = elements1[0].kind
47+
&& let ExprKind::Array(elements2) = inner1.kind
48+
&& elements2.len() == 2
49+
&& let ExprKind::Lit(ref lit2) = elements2[0].kind
4250
&& let LitKind::Str(s, _) = lit2.node
4351
&& s.as_str() == ""
44-
&& let ExprKind::Lit(ref lit3) = elements1[1].kind
52+
&& let ExprKind::Lit(ref lit3) = elements2[1].kind
4553
&& let LitKind::Str(s1, _) = lit3.node
4654
&& s1.as_str() == "\n"
4755
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner2) = args2[1].kind

tests/coverage/issue-83601.cov-map

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,22 @@
11
Function name: issue_83601::main
2-
Raw bytes (76): 0x[01, 01, 01, 05, 09, 0e, 01, 06, 01, 00, 0a, 01, 01, 09, 00, 0c, 01, 00, 0f, 00, 15, 01, 01, 05, 00, 0f, 05, 01, 09, 00, 0c, 05, 00, 0f, 00, 15, 05, 01, 05, 00, 0f, 02, 01, 05, 00, 0d, 02, 00, 0e, 00, 14, 02, 01, 05, 00, 0d, 02, 00, 0e, 00, 14, 02, 01, 05, 00, 0d, 02, 00, 0e, 00, 14, 02, 01, 01, 00, 02]
2+
Raw bytes (74): 0x[01, 01, 00, 0e, 01, 06, 01, 00, 0a, 01, 01, 09, 00, 0c, 01, 00, 0f, 00, 15, 01, 01, 05, 00, 0f, 01, 01, 09, 00, 0c, 01, 00, 0f, 00, 15, 01, 01, 05, 00, 0f, 01, 01, 05, 00, 0d, 01, 00, 0e, 00, 14, 01, 01, 05, 00, 0d, 01, 00, 0e, 00, 14, 01, 01, 05, 00, 0d, 01, 00, 0e, 00, 14, 01, 01, 01, 00, 02]
33
Number of files: 1
44
- file 0 => $DIR/issue-83601.rs
5-
Number of expressions: 1
6-
- expression 0 operands: lhs = Counter(1), rhs = Counter(2)
5+
Number of expressions: 0
76
Number of file 0 mappings: 14
87
- Code(Counter(0)) at (prev + 6, 1) to (start + 0, 10)
98
- Code(Counter(0)) at (prev + 1, 9) to (start + 0, 12)
109
- Code(Counter(0)) at (prev + 0, 15) to (start + 0, 21)
1110
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 15)
12-
- Code(Counter(1)) at (prev + 1, 9) to (start + 0, 12)
13-
- Code(Counter(1)) at (prev + 0, 15) to (start + 0, 21)
14-
- Code(Counter(1)) at (prev + 1, 5) to (start + 0, 15)
15-
- Code(Expression(0, Sub)) at (prev + 1, 5) to (start + 0, 13)
16-
= (c1 - c2)
17-
- Code(Expression(0, Sub)) at (prev + 0, 14) to (start + 0, 20)
18-
= (c1 - c2)
19-
- Code(Expression(0, Sub)) at (prev + 1, 5) to (start + 0, 13)
20-
= (c1 - c2)
21-
- Code(Expression(0, Sub)) at (prev + 0, 14) to (start + 0, 20)
22-
= (c1 - c2)
23-
- Code(Expression(0, Sub)) at (prev + 1, 5) to (start + 0, 13)
24-
= (c1 - c2)
25-
- Code(Expression(0, Sub)) at (prev + 0, 14) to (start + 0, 20)
26-
= (c1 - c2)
27-
- Code(Expression(0, Sub)) at (prev + 1, 1) to (start + 0, 2)
28-
= (c1 - c2)
29-
Highest counter ID seen: c1
11+
- Code(Counter(0)) at (prev + 1, 9) to (start + 0, 12)
12+
- Code(Counter(0)) at (prev + 0, 15) to (start + 0, 21)
13+
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 15)
14+
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 13)
15+
- Code(Counter(0)) at (prev + 0, 14) to (start + 0, 20)
16+
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 13)
17+
- Code(Counter(0)) at (prev + 0, 14) to (start + 0, 20)
18+
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 13)
19+
- Code(Counter(0)) at (prev + 0, 14) to (start + 0, 20)
20+
- Code(Counter(0)) at (prev + 1, 1) to (start + 0, 2)
21+
Highest counter ID seen: c0
3022

0 commit comments

Comments
 (0)