Skip to content

Commit f220866

Browse files
committed
Create core::fmt::ArgumentV1 with generics instead of fn pointer
1 parent db062de commit f220866

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

compiler/rustc_builtin_macros/src/format.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -889,11 +889,21 @@ impl<'a, 'b> Context<'a, 'b> {
889889
return ecx.expr_call_global(macsp, path, vec![arg]);
890890
}
891891
};
892+
let new_fn_name = match trait_ {
893+
"Display" => "new_display",
894+
"Debug" => "new_debug",
895+
"LowerExp" => "new_lower_exp",
896+
"UpperExp" => "new_upper_exp",
897+
"Octal" => "new_octal",
898+
"Pointer" => "new_pointer",
899+
"Binary" => "new_binary",
900+
"LowerHex" => "new_lower_hex",
901+
"UpperHex" => "new_upper_hex",
902+
_ => unreachable!(),
903+
};
892904

893-
let path = ecx.std_path(&[sym::fmt, Symbol::intern(trait_), sym::fmt]);
894-
let format_fn = ecx.path_global(sp, path);
895-
let path = ecx.std_path(&[sym::fmt, sym::ArgumentV1, sym::new]);
896-
ecx.expr_call_global(macsp, path, vec![arg, ecx.expr_path(format_fn)])
905+
let path = ecx.std_path(&[sym::fmt, sym::ArgumentV1, Symbol::intern(new_fn_name)]);
906+
ecx.expr_call_global(macsp, path, vec![arg])
897907
}
898908
}
899909

library/core/src/fmt/mod.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,16 @@ static USIZE_MARKER: fn(&usize, &mut Formatter<'_>) -> Result = |ptr, _| {
308308
loop {}
309309
};
310310

311+
macro_rules! arg_new {
312+
($f: ident, $t: ident) => {
313+
#[doc(hidden)]
314+
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
315+
pub fn $f<'b, T: $t>(x: &'b T) -> ArgumentV1<'_> {
316+
Self::new(x, $t::fmt)
317+
}
318+
};
319+
}
320+
311321
impl<'a> ArgumentV1<'a> {
312322
#[doc(hidden)]
313323
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
@@ -323,6 +333,16 @@ impl<'a> ArgumentV1<'a> {
323333
unsafe { ArgumentV1 { formatter: mem::transmute(f), value: mem::transmute(x) } }
324334
}
325335

336+
arg_new!(new_display, Display);
337+
arg_new!(new_debug, Debug);
338+
arg_new!(new_octal, Octal);
339+
arg_new!(new_lower_hex, LowerHex);
340+
arg_new!(new_upper_hex, UpperHex);
341+
arg_new!(new_pointer, Pointer);
342+
arg_new!(new_binary, Binary);
343+
arg_new!(new_lower_exp, LowerExp);
344+
arg_new!(new_upper_exp, UpperExp);
345+
326346
#[doc(hidden)]
327347
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
328348
pub fn from_usize(x: &usize) -> ArgumentV1<'_> {

0 commit comments

Comments
 (0)