Turn format arguments types into lang items.

This commit is contained in:
Mara Bos 2023-01-11 21:36:46 +01:00
parent 3c45176592
commit bebf9fe063
4 changed files with 21 additions and 1 deletions

View File

@ -244,6 +244,14 @@ language_item_table! {
/// libstd panic entry point. Necessary for const eval to be able to catch it /// libstd panic entry point. Necessary for const eval to be able to catch it
BeginPanic, sym::begin_panic, begin_panic_fn, Target::Fn, GenericRequirement::None; BeginPanic, sym::begin_panic, begin_panic_fn, Target::Fn, GenericRequirement::None;
// Lang items needed for `format_args!()`.
FormatAlignment, sym::format_alignment, format_alignment, Target::Enum, GenericRequirement::None;
FormatArgument, sym::format_argument, format_argument, Target::Struct, GenericRequirement::None;
FormatArguments, sym::format_arguments, format_arguments, Target::Struct, GenericRequirement::None;
FormatCount, sym::format_count, format_count, Target::Enum, GenericRequirement::None;
FormatPlaceholder, sym::format_placeholder, format_placeholder, Target::Struct, GenericRequirement::None;
FormatUnsafeArg, sym::format_unsafe_arg, format_unsafe_arg, Target::Struct, GenericRequirement::None;
ExchangeMalloc, sym::exchange_malloc, exchange_malloc_fn, Target::Fn, GenericRequirement::None; ExchangeMalloc, sym::exchange_malloc, exchange_malloc_fn, Target::Fn, GenericRequirement::None;
BoxFree, sym::box_free, box_free_fn, Target::Fn, GenericRequirement::Minimum(1); BoxFree, sym::box_free, box_free_fn, Target::Fn, GenericRequirement::Minimum(1);
DropInPlace, sym::drop_in_place, drop_in_place_fn, Target::Fn, GenericRequirement::Minimum(1); DropInPlace, sym::drop_in_place, drop_in_place_fn, Target::Fn, GenericRequirement::Minimum(1);

View File

@ -721,11 +721,17 @@ symbols! {
forbid, forbid,
forget, forget,
format, format,
format_alignment,
format_args, format_args,
format_args_capture, format_args_capture,
format_args_macro, format_args_macro,
format_args_nl, format_args_nl,
format_argument,
format_arguments,
format_count,
format_macro, format_macro,
format_placeholder,
format_unsafe_arg,
freeze, freeze,
freg, freg,
frem_fast, frem_fast,

View File

@ -262,6 +262,7 @@ extern "C" {
/// family of functions. It contains a function to format the given value. At /// family of functions. It contains a function to format the given value. At
/// compile time it is ensured that the function and the value have the correct /// compile time it is ensured that the function and the value have the correct
/// types, and then this struct is used to canonicalize arguments to one type. /// types, and then this struct is used to canonicalize arguments to one type.
#[cfg_attr(not(bootstrap), lang = "format_argument")]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
@ -274,6 +275,7 @@ pub struct ArgumentV1<'a> {
/// This struct represents the unsafety of constructing an `Arguments`. /// This struct represents the unsafety of constructing an `Arguments`.
/// It exists, rather than an unsafe function, in order to simplify the expansion /// It exists, rather than an unsafe function, in order to simplify the expansion
/// of `format_args!(..)` and reduce the scope of the `unsafe` block. /// of `format_args!(..)` and reduce the scope of the `unsafe` block.
#[cfg_attr(not(bootstrap), lang = "format_unsafe_arg")]
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
#[doc(hidden)] #[doc(hidden)]
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")] #[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
@ -468,8 +470,8 @@ impl<'a> Arguments<'a> {
/// ``` /// ```
/// ///
/// [`format()`]: ../../std/fmt/fn.format.html /// [`format()`]: ../../std/fmt/fn.format.html
#[cfg_attr(not(bootstrap), lang = "format_arguments")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "Arguments")]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct Arguments<'a> { pub struct Arguments<'a> {
// Format string pieces to print. // Format string pieces to print.

View File

@ -5,7 +5,9 @@
//! these can be statically allocated and are slightly optimized for the runtime //! these can be statically allocated and are slightly optimized for the runtime
#![allow(missing_debug_implementations)] #![allow(missing_debug_implementations)]
#[cfg_attr(not(bootstrap), lang = "format_placeholder")]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
// FIXME: Rename this to Placeholder
pub struct Argument { pub struct Argument {
pub position: usize, pub position: usize,
pub format: FormatSpec, pub format: FormatSpec,
@ -21,6 +23,7 @@ pub struct FormatSpec {
} }
/// Possible alignments that can be requested as part of a formatting directive. /// Possible alignments that can be requested as part of a formatting directive.
#[cfg_attr(not(bootstrap), lang = "format_alignment")]
#[derive(Copy, Clone, PartialEq, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
pub enum Alignment { pub enum Alignment {
/// Indication that contents should be left-aligned. /// Indication that contents should be left-aligned.
@ -34,6 +37,7 @@ pub enum Alignment {
} }
/// Used by [width](https://doc.rust-lang.org/std/fmt/#width) and [precision](https://doc.rust-lang.org/std/fmt/#precision) specifiers. /// Used by [width](https://doc.rust-lang.org/std/fmt/#width) and [precision](https://doc.rust-lang.org/std/fmt/#precision) specifiers.
#[cfg_attr(not(bootstrap), lang = "format_count")]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub enum Count { pub enum Count {
/// Specified with a literal number, stores the value /// Specified with a literal number, stores the value