diff options
| author | Cameron Steffen <cam.steffen94@gmail.com> | 2021-11-01 11:56:38 -0500 |
|---|---|---|
| committer | Cameron Steffen <cam.steffen94@gmail.com> | 2021-11-06 14:28:08 -0500 |
| commit | a9a24d510698c3aafd6f7e1b974b70ac94e0a18b (patch) | |
| tree | c57ada179e9470f96659f023e355957bb75a9f18 | |
| parent | 3326f19e8982ce033e04c163ddc520a76e42c737 (diff) | |
| download | rust-a9a24d510698c3aafd6f7e1b974b70ac94e0a18b.tar.gz rust-a9a24d510698c3aafd6f7e1b974b70ac94e0a18b.zip | |
Don't destructure args tuple in format_args!
| -rw-r--r-- | compiler/rustc_builtin_macros/src/format.rs | 20 | ||||
| -rw-r--r-- | compiler/rustc_span/src/symbol.rs | 1 | ||||
| -rw-r--r-- | src/test/pretty/dollar-crate.pp | 2 | ||||
| -rw-r--r-- | src/test/pretty/issue-4264.pp | 2 | ||||
| -rw-r--r-- | src/test/ui/attributes/key-value-expansion.stderr | 4 | ||||
| -rw-r--r-- | src/test/ui/closures/print/closure-print-generic-trim-off-verbose-2.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/closures/print/closure-print-generic-verbose-2.stderr | 2 |
7 files changed, 13 insertions, 20 deletions
diff --git a/compiler/rustc_builtin_macros/src/format.rs b/compiler/rustc_builtin_macros/src/format.rs index f0056cb7976..580c3724058 100644 --- a/compiler/rustc_builtin_macros/src/format.rs +++ b/compiler/rustc_builtin_macros/src/format.rs @@ -763,13 +763,8 @@ impl<'a, 'b> Context<'a, 'b> { let mut locals = Vec::with_capacity((0..self.args.len()).map(|i| self.arg_unique_types[i].len()).sum()); let mut counts = Vec::with_capacity(self.count_args.len()); - let mut pats = Vec::with_capacity(self.args.len()); let mut heads = Vec::with_capacity(self.args.len()); - let names_pos: Vec<_> = (0..self.args.len()) - .map(|i| Ident::from_str_and_span(&format!("arg{}", i), self.macsp)) - .collect(); - // First, build up the static array which will become our precompiled // format "string" let pieces = self.ecx.expr_vec_slice(self.fmtsp, self.str_pieces); @@ -787,11 +782,8 @@ impl<'a, 'b> Context<'a, 'b> { // of each variable because we don't want to move out of the arguments // passed to this function. for (i, e) in self.args.into_iter().enumerate() { - let name = names_pos[i]; - let span = self.ecx.with_def_site_ctxt(e.span); - pats.push(self.ecx.pat_ident(span, name)); for arg_ty in self.arg_unique_types[i].iter() { - locals.push(Context::format_arg(self.ecx, self.macsp, e.span, arg_ty, name)); + locals.push(Context::format_arg(self.ecx, self.macsp, e.span, arg_ty, i)); } heads.push(self.ecx.expr_addr_of(e.span, e)); } @@ -800,9 +792,8 @@ impl<'a, 'b> Context<'a, 'b> { Exact(i) => i, _ => panic!("should never happen"), }; - let name = names_pos[index]; let span = spans_pos[index]; - counts.push(Context::format_arg(self.ecx, self.macsp, span, &Count, name)); + counts.push(Context::format_arg(self.ecx, self.macsp, span, &Count, index)); } // Now create a vector containing all the arguments @@ -838,7 +829,7 @@ impl<'a, 'b> Context<'a, 'b> { // But the nested match expression is proved to perform not as well // as series of let's; the first approach does. let args_match = { - let pat = self.ecx.pat_tuple(self.macsp, pats); + let pat = self.ecx.pat_ident(self.macsp, Ident::new(sym::_args, self.macsp)); let arm = self.ecx.arm(self.macsp, pat, args_array); let head = self.ecx.expr(self.macsp, ast::ExprKind::Tup(heads)); self.ecx.expr_match(self.macsp, head, vec![arm]) @@ -877,10 +868,11 @@ impl<'a, 'b> Context<'a, 'b> { macsp: Span, mut sp: Span, ty: &ArgumentType, - arg: Ident, + arg_index: usize, ) -> P<ast::Expr> { sp = ecx.with_def_site_ctxt(sp); - let arg = ecx.expr_ident(sp, arg); + let arg = ecx.expr_ident(sp, Ident::new(sym::_args, sp)); + let arg = ecx.expr(sp, ast::ExprKind::Field(arg, Ident::new(sym::integer(arg_index), sp))); let trait_ = match *ty { Placeholder(trait_) if trait_ == "<invalid>" => return DummyResult::raw_expr(sp, true), Placeholder(trait_) => trait_, diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index 52e2a8f48e2..7bffe4f74d2 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -271,6 +271,7 @@ symbols! { __S, __next, __try_var, + _args, _d, _e, _task_context, diff --git a/src/test/pretty/dollar-crate.pp b/src/test/pretty/dollar-crate.pp index f4be3c1c63a..84eda08d203 100644 --- a/src/test/pretty/dollar-crate.pp +++ b/src/test/pretty/dollar-crate.pp @@ -12,7 +12,7 @@ fn main() { { ::std::io::_print(::core::fmt::Arguments::new_v1(&["rust\n"], &match () { - () => [], + _args => [], })); }; } diff --git a/src/test/pretty/issue-4264.pp b/src/test/pretty/issue-4264.pp index 199aee05622..529daab9038 100644 --- a/src/test/pretty/issue-4264.pp +++ b/src/test/pretty/issue-4264.pp @@ -45,7 +45,7 @@ pub fn bar() ({ as ()) { - () + _args => ([] as diff --git a/src/test/ui/attributes/key-value-expansion.stderr b/src/test/ui/attributes/key-value-expansion.stderr index ef59381f5f2..e59216fe902 100644 --- a/src/test/ui/attributes/key-value-expansion.stderr +++ b/src/test/ui/attributes/key-value-expansion.stderr @@ -19,8 +19,8 @@ error: unexpected token: `{ let res = ::alloc::fmt::format(::core::fmt::Arguments::new_v1(&[""], &match (&"u8",) { - (arg0,) => - [::core::fmt::ArgumentV1::new(arg0, + _args => + [::core::fmt::ArgumentV1::new(_args.0, ::core::fmt::Display::fmt)], })); res diff --git a/src/test/ui/closures/print/closure-print-generic-trim-off-verbose-2.stderr b/src/test/ui/closures/print/closure-print-generic-trim-off-verbose-2.stderr index 36d6450c9a2..ee394d64a1d 100644 --- a/src/test/ui/closures/print/closure-print-generic-trim-off-verbose-2.stderr +++ b/src/test/ui/closures/print/closure-print-generic-trim-off-verbose-2.stderr @@ -9,7 +9,7 @@ LL | let c1 : () = c; | expected due to this | = note: expected unit type `()` - found closure `[mod1::f<T>::{closure#0} closure_substs=(unavailable) substs=[T, _#25t, extern "rust-call" fn(()), _#26t]]` + found closure `[mod1::f<T>::{closure#0} closure_substs=(unavailable) substs=[T, _#22t, extern "rust-call" fn(()), _#23t]]` help: use parentheses to call this closure | LL | let c1 : () = c(); diff --git a/src/test/ui/closures/print/closure-print-generic-verbose-2.stderr b/src/test/ui/closures/print/closure-print-generic-verbose-2.stderr index 91926f233d3..11b9fa7e40c 100644 --- a/src/test/ui/closures/print/closure-print-generic-verbose-2.stderr +++ b/src/test/ui/closures/print/closure-print-generic-verbose-2.stderr @@ -9,7 +9,7 @@ LL | let c1 : () = c; | expected due to this | = note: expected unit type `()` - found closure `[f<T>::{closure#0} closure_substs=(unavailable) substs=[T, _#25t, extern "rust-call" fn(()), _#26t]]` + found closure `[f<T>::{closure#0} closure_substs=(unavailable) substs=[T, _#22t, extern "rust-call" fn(()), _#23t]]` help: use parentheses to call this closure | LL | let c1 : () = c(); |
