Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 0 additions & 20 deletions compiler/rustc_ast_lowering/src/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -487,26 +487,6 @@ fn expand_format_args<'hir>(
// Generate:
// []
(vec![], ctx.arena.alloc(ctx.expr(macsp, hir::ExprKind::Array(&[]))))
} else if argmap.len() == 1 && arguments.len() == 1 {
// Only one argument, so we don't need to make the `args` tuple.
//
// Generate:
// super let args = [<core::fmt::Argument>::new_display(&arg)];
let args = ctx.arena.alloc_from_iter(argmap.iter().map(
|(&(arg_index, ty), &placeholder_span)| {
let arg = &arguments[arg_index];
let placeholder_span =
placeholder_span.unwrap_or(arg.expr.span).with_ctxt(macsp.ctxt());
let arg = ctx.lower_expr(&arg.expr);
let ref_arg = ctx.arena.alloc(ctx.expr_ref(arg.span.with_ctxt(macsp.ctxt()), arg));
make_argument(ctx, placeholder_span, ref_arg, ty)
},
));
let args = ctx.arena.alloc(ctx.expr(macsp, hir::ExprKind::Array(args)));
let args_ident = Ident::new(sym::args, macsp);
let (args_pat, args_hir_id) = ctx.pat_ident(macsp, args_ident);
let let_statement = ctx.stmt_super_let_pat(macsp, args_pat, Some(args));
(vec![let_statement], ctx.arena.alloc(ctx.expr_ident_mut(macsp, args_ident, args_hir_id)))
} else {
// Generate:
// super let args = (&arg0, &arg1, &…);
Expand Down
6 changes: 6 additions & 0 deletions library/coretests/tests/fmt/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ fn test_lifetime() {
let a = format_args!("hello {a} {a:?}");
assert_eq!(a.to_string(), "hello hello hello hello hello hello hello");

// Check that temporaries as arguments are extended.
let b = format_args!("{}", String::new());
let c = format_args!("{}{}", String::new(), String::new());
assert_eq!(b.to_string(), "");
assert_eq!(c.to_string(), "");

// Without arguments, it should also work in consts.
const A: std::fmt::Arguments<'static> = format_args!("hello");
assert_eq!(A.to_string(), "hello");
Expand Down
32 changes: 20 additions & 12 deletions src/tools/clippy/tests/ui/author/macro_in_closure.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -10,34 +10,42 @@ if let StmtKind::Let(local) = stmt.kind
&& paths::STD_IO_STDIO__PRINT.matches_path(cx, func) // Add the path to `clippy_utils::paths` if needed
&& args.len() == 1
&& let ExprKind::Block(block1, None) = args[0].kind
&& block1.stmts.len() == 1
&& block1.stmts.len() == 2
&& let StmtKind::Let(local1) = block1.stmts[0].kind
&& let Some(init1) = local1.init
&& let ExprKind::Array(elements) = init1.kind
&& let ExprKind::Tup(elements) = init1.kind
&& elements.len() == 1
&& let ExprKind::Call(func1, args1) = elements[0].kind
&& paths::CORE_FMT_RT_ARGUMENT_NEW_DISPLAY.matches_path(cx, func1) // Add the path to `clippy_utils::paths` if needed
&& args1.len() == 1
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = args1[0].kind
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = elements[0].kind
&& let PatKind::Binding(BindingMode::NONE, _, name, None) = local1.pat.kind
&& name.as_str() == "args"
&& let StmtKind::Let(local2) = block1.stmts[1].kind
&& let Some(init2) = local2.init
&& let ExprKind::Array(elements1) = init2.kind
&& elements1.len() == 1
&& let ExprKind::Call(func1, args1) = elements1[0].kind
&& paths::CORE_FMT_RT_ARGUMENT_NEW_DISPLAY.matches_path(cx, func1) // Add the path to `clippy_utils::paths` if needed
&& args1.len() == 1
&& let ExprKind::Field(object, field_name) = args1[0].kind
&& field_name.as_str() == "0"
&& let PatKind::Binding(BindingMode::NONE, _, name1, None) = local2.pat.kind
&& name1.as_str() == "args"
&& let Some(trailing_expr) = block1.expr
&& let ExprKind::Call(func2, args2) = trailing_expr.kind
&& paths::CORE_FMT_RT_NEW_V1.matches_path(cx, func2) // Add the path to `clippy_utils::paths` if needed
&& args2.len() == 2
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner1) = args2[0].kind
&& let ExprKind::Array(elements1) = inner1.kind
&& elements1.len() == 2
&& let ExprKind::Lit(ref lit) = elements1[0].kind
&& let ExprKind::Array(elements2) = inner1.kind
&& elements2.len() == 2
&& let ExprKind::Lit(ref lit) = elements2[0].kind
&& let LitKind::Str(s, _) = lit.node
&& s.as_str() == ""
&& let ExprKind::Lit(ref lit1) = elements1[1].kind
&& let ExprKind::Lit(ref lit1) = elements2[1].kind
&& let LitKind::Str(s1, _) = lit1.node
&& s1.as_str() == "\n"
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner2) = args2[1].kind
&& block.expr.is_none()
&& let PatKind::Binding(BindingMode::NONE, _, name1, None) = local.pat.kind
&& name1.as_str() == "print_text"
&& let PatKind::Binding(BindingMode::NONE, _, name2, None) = local.pat.kind
&& name2.as_str() == "print_text"
{
// report your lint here
}
28 changes: 18 additions & 10 deletions src/tools/clippy/tests/ui/author/macro_in_loop.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,36 @@ if let Some(higher::ForLoop { pat: pat, arg: arg, body: body, .. }) = higher::Fo
&& paths::STD_IO_STDIO__PRINT.matches_path(cx, func) // Add the path to `clippy_utils::paths` if needed
&& args.len() == 1
&& let ExprKind::Block(block2, None) = args[0].kind
&& block2.stmts.len() == 1
&& block2.stmts.len() == 2
&& let StmtKind::Let(local) = block2.stmts[0].kind
&& let Some(init) = local.init
&& let ExprKind::Array(elements) = init.kind
&& let ExprKind::Tup(elements) = init.kind
&& elements.len() == 1
&& let ExprKind::Call(func1, args1) = elements[0].kind
&& paths::CORE_FMT_RT_ARGUMENT_NEW_DISPLAY.matches_path(cx, func1) // Add the path to `clippy_utils::paths` if needed
&& args1.len() == 1
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = args1[0].kind
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = elements[0].kind
&& let PatKind::Binding(BindingMode::NONE, _, name1, None) = local.pat.kind
&& name1.as_str() == "args"
&& let StmtKind::Let(local1) = block2.stmts[1].kind
&& let Some(init1) = local1.init
&& let ExprKind::Array(elements1) = init1.kind
&& elements1.len() == 1
&& let ExprKind::Call(func1, args1) = elements1[0].kind
&& paths::CORE_FMT_RT_ARGUMENT_NEW_DISPLAY.matches_path(cx, func1) // Add the path to `clippy_utils::paths` if needed
&& args1.len() == 1
&& let ExprKind::Field(object, field_name) = args1[0].kind
&& field_name.as_str() == "0"
&& let PatKind::Binding(BindingMode::NONE, _, name2, None) = local1.pat.kind
&& name2.as_str() == "args"
&& let Some(trailing_expr) = block2.expr
&& let ExprKind::Call(func2, args2) = trailing_expr.kind
&& paths::CORE_FMT_RT_NEW_V1.matches_path(cx, func2) // Add the path to `clippy_utils::paths` if needed
&& args2.len() == 2
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner1) = args2[0].kind
&& let ExprKind::Array(elements1) = inner1.kind
&& elements1.len() == 2
&& let ExprKind::Lit(ref lit2) = elements1[0].kind
&& let ExprKind::Array(elements2) = inner1.kind
&& elements2.len() == 2
&& let ExprKind::Lit(ref lit2) = elements2[0].kind
&& let LitKind::Str(s, _) = lit2.node
&& s.as_str() == ""
&& let ExprKind::Lit(ref lit3) = elements1[1].kind
&& let ExprKind::Lit(ref lit3) = elements2[1].kind
&& let LitKind::Str(s1, _) = lit3.node
&& s1.as_str() == "\n"
&& let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner2) = args2[1].kind
Expand Down
34 changes: 13 additions & 21 deletions tests/coverage/issue-83601.cov-map
Original file line number Diff line number Diff line change
@@ -1,30 +1,22 @@
Function name: issue_83601::main
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]
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]
Number of files: 1
- file 0 => $DIR/issue-83601.rs
Number of expressions: 1
- expression 0 operands: lhs = Counter(1), rhs = Counter(2)
Number of expressions: 0
Number of file 0 mappings: 14
- Code(Counter(0)) at (prev + 6, 1) to (start + 0, 10)
- Code(Counter(0)) at (prev + 1, 9) to (start + 0, 12)
- Code(Counter(0)) at (prev + 0, 15) to (start + 0, 21)
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 15)
- Code(Counter(1)) at (prev + 1, 9) to (start + 0, 12)
- Code(Counter(1)) at (prev + 0, 15) to (start + 0, 21)
- Code(Counter(1)) at (prev + 1, 5) to (start + 0, 15)
- Code(Expression(0, Sub)) at (prev + 1, 5) to (start + 0, 13)
= (c1 - c2)
- Code(Expression(0, Sub)) at (prev + 0, 14) to (start + 0, 20)
= (c1 - c2)
- Code(Expression(0, Sub)) at (prev + 1, 5) to (start + 0, 13)
= (c1 - c2)
- Code(Expression(0, Sub)) at (prev + 0, 14) to (start + 0, 20)
= (c1 - c2)
- Code(Expression(0, Sub)) at (prev + 1, 5) to (start + 0, 13)
= (c1 - c2)
- Code(Expression(0, Sub)) at (prev + 0, 14) to (start + 0, 20)
= (c1 - c2)
- Code(Expression(0, Sub)) at (prev + 1, 1) to (start + 0, 2)
= (c1 - c2)
Highest counter ID seen: c1
- Code(Counter(0)) at (prev + 1, 9) to (start + 0, 12)
- Code(Counter(0)) at (prev + 0, 15) to (start + 0, 21)
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 15)
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 13)
- Code(Counter(0)) at (prev + 0, 14) to (start + 0, 20)
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 13)
- Code(Counter(0)) at (prev + 0, 14) to (start + 0, 20)
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 13)
- Code(Counter(0)) at (prev + 0, 14) to (start + 0, 20)
- Code(Counter(0)) at (prev + 1, 1) to (start + 0, 2)
Highest counter ID seen: c0

Loading
Loading