Unnamed repository; edit this file 'description' to name the repository.
Remove format_args lowering for toolchains prior to 1.94.0
We don't support them now since https://github.com/rust-lang/rust-analyzer/pull/22784.
Chayim Refael Friedman 2 weeks ago
parent 1174734 · commit 363940d
-rw-r--r--crates/hir-def/src/expr_store/lower/format_args.rs564
-rw-r--r--crates/hir-def/src/expr_store/tests/body.rs187
-rw-r--r--crates/ide-diagnostics/src/handlers/missing_unsafe.rs11
-rw-r--r--crates/ide/src/references.rs2
-rw-r--r--crates/test-utils/src/minicore.rs106
5 files changed, 16 insertions, 854 deletions
diff --git a/crates/hir-def/src/expr_store/lower/format_args.rs b/crates/hir-def/src/expr_store/lower/format_args.rs
index 1ecd18fb53..5552213aba 100644
--- a/crates/hir-def/src/expr_store/lower/format_args.rs
+++ b/crates/hir-def/src/expr_store/lower/format_args.rs
@@ -5,18 +5,14 @@ use hir_expand::name::Name;
use intern::{Symbol, sym};
use span::SyntaxContext;
use syntax::{AstPtr, AstToken as _, ast};
-use thin_vec::ThinVec;
use crate::{
- builtin_type::BuiltinUint,
expr_store::{HygieneId, lower::ExprCollector, path::Path},
hir::{
- Array, BindingAnnotation, Expr, ExprId, Literal, Pat, RecordLitField, RecordSpread,
- Statement,
+ Array, BindingAnnotation, Expr, ExprId, Literal, Pat, Statement,
format_args::{
self, FormatAlignment, FormatArgs, FormatArgsPiece, FormatArgument, FormatArgumentKind,
- FormatArgumentsCollector, FormatCount, FormatDebugHex, FormatOptions,
- FormatPlaceholder, FormatSign, FormatTrait,
+ FormatArgumentsCollector, FormatCount, FormatDebugHex, FormatSign, FormatTrait,
},
},
lang_item::LangItemTarget,
@@ -96,11 +92,7 @@ impl<'db> ExprCollector<'db> {
),
};
- let idx = if self.lang_items().FormatCount.is_none() {
- self.collect_format_args_after_1_93_0_impl(syntax_ptr, fmt)
- } else {
- self.collect_format_args_before_1_93_0_impl(syntax_ptr, fmt)
- };
+ let idx = self.collect_format_args_impl(syntax_ptr, fmt);
self.store
.template_map
@@ -110,7 +102,9 @@ impl<'db> ExprCollector<'db> {
idx
}
- fn collect_format_args_after_1_93_0_impl(
+ // This is in separate functions because historically, changes in format_args lowering have forced us to change this
+ // function but not its caller, and for some time support both versions.
+ fn collect_format_args_impl(
&mut self,
syntax_ptr: AstPtr<ast::Expr>,
fmt: FormatArgs,
@@ -433,552 +427,6 @@ impl<'db> ExprCollector<'db> {
}
}
- fn collect_format_args_before_1_93_0_impl(
- &mut self,
- syntax_ptr: AstPtr<ast::Expr>,
- fmt: FormatArgs,
- ) -> ExprId {
- // Create a list of all _unique_ (argument, format trait) combinations.
- // E.g. "{0} {0:x} {0} {1}" -> [(0, Display), (0, LowerHex), (1, Display)]
- let mut argmap = FxIndexSet::default();
- for piece in fmt.template.iter() {
- let FormatArgsPiece::Placeholder(placeholder) = piece else { continue };
- if let Ok(index) = placeholder.argument.index {
- argmap.insert((index, ArgumentType::Format(placeholder.format_trait)));
- }
- }
-
- let lit_pieces = fmt
- .template
- .iter()
- .enumerate()
- .filter_map(|(i, piece)| {
- match piece {
- FormatArgsPiece::Literal(s) => {
- Some(self.alloc_expr_desugared(Expr::Literal(Literal::String(s.clone()))))
- }
- &FormatArgsPiece::Placeholder(_) => {
- // Inject empty string before placeholders when not already preceded by a literal piece.
- if i == 0 || matches!(fmt.template[i - 1], FormatArgsPiece::Placeholder(_))
- {
- Some(self.alloc_expr_desugared(Expr::Literal(Literal::String(
- Symbol::empty(),
- ))))
- } else {
- None
- }
- }
- }
- })
- .collect();
- let lit_pieces =
- self.alloc_expr_desugared(Expr::Array(Array::ElementList { elements: lit_pieces }));
- let lit_pieces = self.alloc_expr_desugared(Expr::Ref {
- expr: lit_pieces,
- rawness: Rawness::Ref,
- mutability: Mutability::Shared,
- });
- let format_options = {
- // Generate:
- // &[format_spec_0, format_spec_1, format_spec_2]
- let elements = fmt
- .template
- .iter()
- .filter_map(|piece| {
- let FormatArgsPiece::Placeholder(placeholder) = piece else { return None };
- Some(self.make_format_spec(placeholder, &mut argmap))
- })
- .collect();
- let array = self.alloc_expr_desugared(Expr::Array(Array::ElementList { elements }));
- self.alloc_expr_desugared(Expr::Ref {
- expr: array,
- rawness: Rawness::Ref,
- mutability: Mutability::Shared,
- })
- };
-
- // Assume that rustc version >= 1.89.0 iff lang item `format_arguments` exists
- // but `format_unsafe_arg` does not
- let lang_items = self.lang_items();
- let fmt_args = lang_items.FormatArguments;
- let fmt_unsafe_arg = lang_items.FormatUnsafeArg;
- let use_format_args_since_1_89_0 = fmt_args.is_some() && fmt_unsafe_arg.is_none();
-
- if use_format_args_since_1_89_0 {
- self.collect_format_args_after_1_89_0_impl(
- syntax_ptr,
- fmt,
- argmap,
- lit_pieces,
- format_options,
- )
- } else {
- self.collect_format_args_before_1_89_0_impl(
- syntax_ptr,
- fmt,
- argmap,
- lit_pieces,
- format_options,
- )
- }
- }
-
- /// `format_args!` expansion implementation for rustc versions < `1.89.0`
- fn collect_format_args_before_1_89_0_impl(
- &mut self,
- syntax_ptr: AstPtr<ast::Expr>,
- fmt: FormatArgs,
- argmap: FxIndexSet<(usize, ArgumentType)>,
- lit_pieces: ExprId,
- format_options: ExprId,
- ) -> ExprId {
- let arguments = &*fmt.arguments.arguments;
-
- let args = if arguments.is_empty() {
- let expr = self
- .alloc_expr_desugared(Expr::Array(Array::ElementList { elements: Box::default() }));
- self.alloc_expr_desugared(Expr::Ref {
- expr,
- rawness: Rawness::Ref,
- mutability: Mutability::Shared,
- })
- } else {
- // Generate:
- // &match (&arg0, &arg1, &…) {
- // args => [
- // <core::fmt::Argument>::new_display(args.0),
- // <core::fmt::Argument>::new_lower_hex(args.1),
- // <core::fmt::Argument>::new_debug(args.0),
- // …
- // ]
- // }
- let args = argmap
- .iter()
- .map(|&(arg_index, ty)| {
- let arg = self.alloc_expr_desugared(Expr::Ref {
- expr: arguments[arg_index].expr,
- rawness: Rawness::Ref,
- mutability: Mutability::Shared,
- });
- let arg_ptr = arguments.get(arg_index).and_then(|it| it.syntax);
- self.make_argument(arg_ptr, arg, ty)
- })
- .collect();
- let array =
- self.alloc_expr_desugared(Expr::Array(Array::ElementList { elements: args }));
- self.alloc_expr_desugared(Expr::Ref {
- expr: array,
- rawness: Rawness::Ref,
- mutability: Mutability::Shared,
- })
- };
-
- // Generate:
- // <core::fmt::Arguments>::new_v1_formatted(
- // lit_pieces,
- // args,
- // format_options,
- // unsafe { ::core::fmt::UnsafeArg::new() }
- // )
-
- let lang_items = self.lang_items();
- let new_v1_formatted =
- self.ty_rel_lang_path_desugared_expr(lang_items.FormatArguments, sym::new_v1_formatted);
- let unsafe_arg_new =
- self.ty_rel_lang_path_desugared_expr(lang_items.FormatUnsafeArg, sym::new);
- let unsafe_arg_new =
- self.alloc_expr_desugared(Expr::Call { callee: unsafe_arg_new, args: Box::default() });
- let mut unsafe_arg_new = self.alloc_expr_desugared(Expr::Unsafe {
- id: None,
- statements: Box::new([]),
- tail: Some(unsafe_arg_new),
- });
- if !fmt.orphans.is_empty() {
- unsafe_arg_new = self.alloc_expr_desugared(Expr::Block {
- id: None,
- // We collect the unused expressions here so that we still infer them instead of
- // dropping them out of the expression tree. We cannot store them in the `Unsafe`
- // block because then unsafe blocks within them will get a false "unused unsafe"
- // diagnostic (rustc has a notion of builtin unsafe blocks, but we don't).
- statements: fmt
- .orphans
- .into_iter()
- .map(|expr| Statement::Expr { expr, has_semi: true })
- .collect(),
- tail: Some(unsafe_arg_new),
- label: None,
- });
- }
-
- self.alloc_expr(
- Expr::Call {
- callee: new_v1_formatted,
- args: Box::new([lit_pieces, args, format_options, unsafe_arg_new]),
- },
- syntax_ptr,
- )
- }
-
- /// `format_args!` expansion implementation for rustc versions >= `1.89.0`,
- /// especially since [this PR](https://github.com/rust-lang/rust/pull/140748)
- fn collect_format_args_after_1_89_0_impl(
- &mut self,
- syntax_ptr: AstPtr<ast::Expr>,
- fmt: FormatArgs,
- argmap: FxIndexSet<(usize, ArgumentType)>,
- lit_pieces: ExprId,
- format_options: ExprId,
- ) -> ExprId {
- let arguments = &*fmt.arguments.arguments;
-
- let (let_stmts, args) = if arguments.is_empty() {
- (
- // Generate:
- // []
- vec![],
- self.alloc_expr_desugared(Expr::Array(Array::ElementList {
- elements: Box::default(),
- })),
- )
- } 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::Arguments>::new_display(&arg)];
- let args = argmap
- .iter()
- .map(|&(arg_index, ty)| {
- let ref_arg = self.alloc_expr_desugared(Expr::Ref {
- expr: arguments[arg_index].expr,
- rawness: Rawness::Ref,
- mutability: Mutability::Shared,
- });
- let arg_ptr = arguments.get(arg_index).and_then(|it| it.syntax);
- self.make_argument(arg_ptr, ref_arg, ty)
- })
- .collect();
- let args =
- self.alloc_expr_desugared(Expr::Array(Array::ElementList { elements: args }));
- let args_name = self.generate_new_name();
- let args_binding = self.alloc_binding(
- args_name.clone(),
- BindingAnnotation::Unannotated,
- HygieneId::ROOT,
- );
- let args_pat = self.alloc_pat_desugared(Pat::Bind { id: args_binding, subpat: None });
- self.add_definition_to_binding(args_binding, args_pat);
- // TODO: We don't have `super let` yet.
- let let_stmt = Statement::Let {
- pat: args_pat,
- type_ref: None,
- initializer: Some(args),
- else_branch: None,
- };
- (vec![let_stmt], self.alloc_expr_desugared(Expr::Path(args_name.into())))
- } else {
- // Generate:
- // super let args = (&arg0, &arg1, &...);
- let args_name = self.generate_new_name();
- let args_binding = self.alloc_binding(
- args_name.clone(),
- BindingAnnotation::Unannotated,
- HygieneId::ROOT,
- );
- let args_pat = self.alloc_pat_desugared(Pat::Bind { id: args_binding, subpat: None });
- self.add_definition_to_binding(args_binding, args_pat);
- let elements = arguments
- .iter()
- .map(|arg| {
- self.alloc_expr_desugared(Expr::Ref {
- expr: arg.expr,
- rawness: Rawness::Ref,
- mutability: Mutability::Shared,
- })
- })
- .collect();
- let args_tuple = self.alloc_expr_desugared(Expr::Tuple { exprs: elements });
- // TODO: We don't have `super let` yet
- let let_stmt1 = Statement::Let {
- pat: args_pat,
- type_ref: None,
- initializer: Some(args_tuple),
- else_branch: None,
- };
-
- // Generate:
- // super let args = [
- // <core::fmt::Argument>::new_display(args.0),
- // <core::fmt::Argument>::new_lower_hex(args.1),
- // <core::fmt::Argument>::new_debug(args.0),
- // …
- // ];
- let args = argmap
- .iter()
- .map(|&(arg_index, ty)| {
- let args_ident_expr =
- self.alloc_expr_desugared(Expr::Path(args_name.clone().into()));
- let arg = self.alloc_expr_desugared(Expr::Field {
- expr: args_ident_expr,
- name: Name::new_tuple_field(arg_index),
- });
- let arg_ptr = arguments.get(arg_index).and_then(|it| it.syntax);
- self.make_argument(arg_ptr, arg, ty)
- })
- .collect();
- let array =
- self.alloc_expr_desugared(Expr::Array(Array::ElementList { elements: args }));
- let args_binding = self.alloc_binding(
- args_name.clone(),
- BindingAnnotation::Unannotated,
- HygieneId::ROOT,
- );
- let args_pat = self.alloc_pat_desugared(Pat::Bind { id: args_binding, subpat: None });
- self.add_definition_to_binding(args_binding, args_pat);
- let let_stmt2 = Statement::Let {
- pat: args_pat,
- type_ref: None,
- initializer: Some(array),
- else_branch: None,
- };
- (vec![let_stmt1, let_stmt2], self.alloc_expr_desugared(Expr::Path(args_name.into())))
- };
-
- // Generate:
- // &args
- let args = self.alloc_expr_desugared(Expr::Ref {
- expr: args,
- rawness: Rawness::Ref,
- mutability: Mutability::Shared,
- });
-
- let call_block = {
- // Generate:
- // unsafe {
- // <core::fmt::Arguments>::new_v1_formatted(
- // lit_pieces,
- // args,
- // format_options,
- // )
- // }
-
- let new_v1_formatted = self.ty_rel_lang_path_desugared_expr(
- self.lang_items().FormatArguments,
- sym::new_v1_formatted,
- );
- let args = [lit_pieces, args, format_options];
- let call = self
- .alloc_expr_desugared(Expr::Call { callee: new_v1_formatted, args: args.into() });
-
- Expr::Unsafe { id: None, statements: Box::default(), tail: Some(call) }
- };
-
- if !let_stmts.is_empty() {
- // Generate:
- // {
- // super let …
- // super let …
- // <core::fmt::Arguments>::new_…(…)
- // }
- let call = self.alloc_expr_desugared(call_block);
- self.alloc_expr(
- Expr::Block {
- id: None,
- statements: let_stmts.into(),
- tail: Some(call),
- label: None,
- },
- syntax_ptr,
- )
- } else {
- self.alloc_expr(call_block, syntax_ptr)
- }
- }
-
- /// Generate a hir expression for a format_args placeholder specification.
- ///
- /// Generates
- ///
- /// ```text
- /// <core::fmt::rt::Placeholder::new(
- /// …usize, // position
- /// '…', // fill
- /// <core::fmt::rt::Alignment>::…, // alignment
- /// …u32, // flags
- /// <core::fmt::rt::Count::…>, // width
- /// <core::fmt::rt::Count::…>, // precision
- /// )
- /// ```
- fn make_format_spec(
- &mut self,
- placeholder: &FormatPlaceholder,
- argmap: &mut FxIndexSet<(usize, ArgumentType)>,
- ) -> ExprId {
- let lang_items = self.lang_items();
- let position = match placeholder.argument.index {
- Ok(arg_index) => {
- let (i, _) =
- argmap.insert_full((arg_index, ArgumentType::Format(placeholder.format_trait)));
- self.alloc_expr_desugared(Expr::Literal(Literal::Uint(
- i as u128,
- Some(BuiltinUint::Usize),
- )))
- }
- Err(_) => self.missing_expr(),
- };
- let &FormatOptions {
- ref width,
- ref precision,
- alignment,
- fill,
- sign,
- alternate,
- zero_pad,
- debug_hex,
- } = &placeholder.format_options;
-
- let precision_expr = self.make_count_before_1_93_0(precision, argmap);
- let width_expr = self.make_count_before_1_93_0(width, argmap);
-
- if self.krate.workspace_data(self.db).is_atleast_187() {
- // These need to match the constants in library/core/src/fmt/rt.rs.
- let align = match alignment {
- Some(FormatAlignment::Left) => 0,
- Some(FormatAlignment::Right) => 1,
- Some(FormatAlignment::Center) => 2,
- None => 3,
- };
- // This needs to match `Flag` in library/core/src/fmt/rt.rs.
- let flags = fill.unwrap_or(' ') as u32
- | ((sign == Some(FormatSign::Plus)) as u32) << 21
- | ((sign == Some(FormatSign::Minus)) as u32) << 22
- | (alternate as u32) << 23
- | (zero_pad as u32) << 24
- | ((debug_hex == Some(FormatDebugHex::Lower)) as u32) << 25
- | ((debug_hex == Some(FormatDebugHex::Upper)) as u32) << 26
- | (width.is_some() as u32) << 27
- | (precision.is_some() as u32) << 28
- | align << 29
- | 1 << 31; // Highest bit always set.
- let flags = self.alloc_expr_desugared(Expr::Literal(Literal::Uint(
- flags as u128,
- Some(BuiltinUint::U32),
- )));
-
- let position =
- RecordLitField { name: Name::new_symbol_root(sym::position), expr: position };
- let flags = RecordLitField { name: Name::new_symbol_root(sym::flags), expr: flags };
- let precision = RecordLitField {
- name: Name::new_symbol_root(sym::precision),
- expr: precision_expr,
- };
- let width =
- RecordLitField { name: Name::new_symbol_root(sym::width), expr: width_expr };
- match self.lang_path(lang_items.FormatPlaceholder) {
- Some(path) => self.alloc_expr_desugared(Expr::RecordLit {
- path,
- fields: {
- let mut fields = ThinVec::with_capacity(4);
- fields.extend([position, flags, precision, width]);
- fields
- },
- spread: RecordSpread::None,
- }),
- None => self.missing_expr(),
- }
- } else {
- let format_placeholder_new =
- self.ty_rel_lang_path_desugared_expr(lang_items.FormatPlaceholder, sym::new);
- // This needs to match `Flag` in library/core/src/fmt/rt.rs.
- let flags: u32 = ((sign == Some(FormatSign::Plus)) as u32)
- | (((sign == Some(FormatSign::Minus)) as u32) << 1)
- | ((alternate as u32) << 2)
- | ((zero_pad as u32) << 3)
- | (((debug_hex == Some(FormatDebugHex::Lower)) as u32) << 4)
- | (((debug_hex == Some(FormatDebugHex::Upper)) as u32) << 5);
- let flags = self.alloc_expr_desugared(Expr::Literal(Literal::Uint(
- flags as u128,
- Some(BuiltinUint::U32),
- )));
- let fill = self.alloc_expr_desugared(Expr::Literal(Literal::Char(fill.unwrap_or(' '))));
- let align = self.ty_rel_lang_path_desugared_expr(
- lang_items.FormatAlignment,
- match alignment {
- Some(FormatAlignment::Left) => sym::Left,
- Some(FormatAlignment::Right) => sym::Right,
- Some(FormatAlignment::Center) => sym::Center,
- None => sym::Unknown,
- },
- );
- self.alloc_expr_desugared(Expr::Call {
- callee: format_placeholder_new,
- args: Box::new([position, fill, align, flags, precision_expr, width_expr]),
- })
- }
- }
-
- /// Generate a hir expression for a format_args Count.
- ///
- /// Generates:
- ///
- /// ```text
- /// <core::fmt::rt::Count>::Is(…)
- /// ```
- ///
- /// or
- ///
- /// ```text
- /// <core::fmt::rt::Count>::Param(…)
- /// ```
- ///
- /// or
- ///
- /// ```text
- /// <core::fmt::rt::Count>::Implied
- /// ```
- fn make_count_before_1_93_0(
- &mut self,
- count: &Option<FormatCount>,
- argmap: &mut FxIndexSet<(usize, ArgumentType)>,
- ) -> ExprId {
- let lang_items = self.lang_items();
- match count {
- Some(FormatCount::Literal(n)) => {
- let args = self.alloc_expr_desugared(Expr::Literal(Literal::Uint(
- *n as u128,
- // FIXME: Change this to Some(BuiltinUint::U16) once we drop support for toolchains < 1.88
- None,
- )));
- let count_is =
- self.ty_rel_lang_path_desugared_expr(lang_items.FormatCount, sym::Is);
- self.alloc_expr_desugared(Expr::Call { callee: count_is, args: Box::new([args]) })
- }
- Some(FormatCount::Argument(arg)) => {
- if let Ok(arg_index) = arg.index {
- let (i, _) = argmap.insert_full((arg_index, ArgumentType::Usize));
-
- let args = self.alloc_expr_desugared(Expr::Literal(Literal::Uint(
- i as u128,
- Some(BuiltinUint::Usize),
- )));
- let count_param =
- self.ty_rel_lang_path_desugared_expr(lang_items.FormatCount, sym::Param);
- self.alloc_expr_desugared(Expr::Call {
- callee: count_param,
- args: Box::new([args]),
- })
- } else {
- // FIXME: This drops arg causing it to potentially not be resolved/type checked
- // when typing?
- self.missing_expr()
- }
- }
- None => match self.ty_rel_lang_path(lang_items.FormatCount, sym::Implied) {
- Some(count_param) => self.alloc_expr_desugared(Expr::Path(count_param)),
- None => self.missing_expr(),
- },
- }
- }
-
/// Generate a hir expression representing an argument to a format_args invocation.
///
/// Generates:
diff --git a/crates/hir-def/src/expr_store/tests/body.rs b/crates/hir-def/src/expr_store/tests/body.rs
index c7b9edf393..f199ef4f9f 100644
--- a/crates/hir-def/src/expr_store/tests/body.rs
+++ b/crates/hir-def/src/expr_store/tests/body.rs
@@ -194,168 +194,6 @@ fn main() {
}
#[test]
-fn desugar_builtin_format_args_before_1_89_0() {
- pretty_print(
- r#"
-//- minicore: fmt_before_1_89_0
-fn main() {
- let are = "are";
- let count = 10;
- builtin#format_args("\u{1b}hello {count:02} {} friends, we {are:?} {0}{last}", "fancy", orphan = (), last = "!");
-}
-"#,
- expect![[r#"
- fn main() {
- let are = "are";
- let count = 10;
- builtin#lang(Arguments::new_v1_formatted)(
- &[
- "\u{1b}hello ", " ", " friends, we ", " ", "",
- ],
- &[
- builtin#lang(Argument::new_display)(
- &count,
- ), builtin#lang(Argument::new_display)(
- &"fancy",
- ), builtin#lang(Argument::new_debug)(
- &are,
- ), builtin#lang(Argument::new_display)(
- &"!",
- ),
- ],
- &[
- builtin#lang(Placeholder::new)(
- 0usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 8u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Is)(
- 2,
- ),
- ), builtin#lang(Placeholder::new)(
- 1usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 0u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Implied),
- ), builtin#lang(Placeholder::new)(
- 2usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 0u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Implied),
- ), builtin#lang(Placeholder::new)(
- 1usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 0u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Implied),
- ), builtin#lang(Placeholder::new)(
- 3usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 0u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Implied),
- ),
- ],
- {
- ();
- unsafe {
- builtin#lang(UnsafeArg::new)()
- }
- },
- );
- }"#]],
- )
-}
-
-#[test]
-fn desugar_builtin_format_args_before_1_93_0() {
- pretty_print(
- r#"
-//- minicore: fmt_before_1_93_0
-fn main() {
- let are = "are";
- let count = 10;
- builtin#format_args("\u{1b}hello {count:02} {} friends, we {are:?} {0}{last}", "fancy", orphan = (), last = "!");
-}
-"#,
- expect![[r#"
- fn main() {
- let are = "are";
- let count = 10;
- {
- let <ra@gennew>0 = (&"fancy", &(), &"!", &count, &are, );
- let <ra@gennew>0 = [
- builtin#lang(Argument::new_display)(
- <ra@gennew>0.3,
- ), builtin#lang(Argument::new_display)(
- <ra@gennew>0.0,
- ), builtin#lang(Argument::new_debug)(
- <ra@gennew>0.4,
- ), builtin#lang(Argument::new_display)(
- <ra@gennew>0.2,
- ),
- ];
- unsafe {
- builtin#lang(Arguments::new_v1_formatted)(
- &[
- "\u{1b}hello ", " ", " friends, we ", " ", "",
- ],
- &<ra@gennew>0,
- &[
- builtin#lang(Placeholder::new)(
- 0usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 8u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Is)(
- 2,
- ),
- ), builtin#lang(Placeholder::new)(
- 1usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 0u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Implied),
- ), builtin#lang(Placeholder::new)(
- 2usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 0u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Implied),
- ), builtin#lang(Placeholder::new)(
- 1usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 0u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Implied),
- ), builtin#lang(Placeholder::new)(
- 3usize,
- ' ',
- builtin#lang(Alignment::Unknown),
- 0u32,
- builtin#lang(Count::Implied),
- builtin#lang(Count::Implied),
- ),
- ],
- )
- }
- };
- }"#]],
- )
-}
-
-#[test]
fn desugar_builtin_format_args() {
pretty_print(
r#"
@@ -464,7 +302,7 @@ impl SsrError {
fn regression_10300() {
pretty_print(
r#"
-//- minicore: concat, panic, fmt_before_1_89_0
+//- minicore: concat, panic, fmt
mod private {
pub use core::concat;
}
@@ -480,22 +318,15 @@ fn f(a: i32, b: u32) -> String {
}
"#,
expect![[r#"
- fn f(a, b) {
- {
- core::panicking::panic_fmt(
- builtin#lang(Arguments::new_v1_formatted)(
- &[
+ fn f(a, b) {
+ {
+ core::panicking::panic_fmt(
+ builtin#lang(Arguments::from_str)(
"cc",
- ],
- &[],
- &[],
- unsafe {
- builtin#lang(UnsafeArg::new)()
- },
- ),
- );
- };
- }"#]],
+ ),
+ );
+ };
+ }"#]],
)
}
diff --git a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
index 808b76e082..18859c0db1 100644
--- a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
+++ b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
@@ -676,17 +676,6 @@ fn main() {
// Checks that we don't place orphan arguments for formatting under an unsafe block.
check_diagnostics(
r#"
-//- minicore: fmt_before_1_89_0
-fn foo() {
- let p = 0xDEADBEEF as *const i32;
- format_args!("", *p);
- // ^^ error: dereference of raw pointer is unsafe and requires an unsafe function or block
-}
- "#,
- );
-
- check_diagnostics(
- r#"
//- minicore: fmt
fn foo() {
let p = 0xDEADBEEF as *const i32;
diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs
index d85e01af41..bb79fc2aa0 100644
--- a/crates/ide/src/references.rs
+++ b/crates/ide/src/references.rs
@@ -600,7 +600,7 @@ fn main() {
false,
false,
expect![[r#"
- Some Variant FileId(1) 6737..6769 6762..6766
+ Some Variant FileId(1) 6734..6766 6759..6763
FileId(0) 46..50
"#]],
diff --git a/crates/test-utils/src/minicore.rs b/crates/test-utils/src/minicore.rs
index f3a460b9ac..ca2d824f2c 100644
--- a/crates/test-utils/src/minicore.rs
+++ b/crates/test-utils/src/minicore.rs
@@ -37,8 +37,6 @@
//! error: fmt
//! float_consts:
//! fmt: option, result, transmute, coerce_unsized, copy, clone, derive
-//! fmt_before_1_93_0: fmt
-//! fmt_before_1_89_0: fmt_before_1_93_0
//! fn: sized, tuple
//! from: sized, result
//! future: pin
@@ -1428,111 +1426,8 @@ pub mod fmt {
Center,
Unknown,
}
-
- // region:fmt_before_1_93_0
- #[lang = "format_count"]
- pub enum Count {
- Is(usize),
- Param(usize),
- Implied,
- }
-
- #[lang = "format_placeholder"]
- pub struct Placeholder {
- pub position: usize,
- pub fill: char,
- pub align: Alignment,
- pub flags: u32,
- pub precision: Count,
- pub width: Count,
- }
-
- impl Placeholder {
- pub const fn new(
- position: usize,
- fill: char,
- align: Alignment,
- flags: u32,
- precision: Count,
- width: Count,
- ) -> Self {
- Placeholder { position, fill, align, flags, precision, width }
- }
- }
- // endregion:fmt_before_1_93_0
-
- // region:fmt_before_1_89_0
- #[lang = "format_unsafe_arg"]
- pub struct UnsafeArg {
- _private: (),
- }
-
- impl UnsafeArg {
- pub unsafe fn new() -> Self {
- UnsafeArg { _private: () }
- }
- }
- // endregion:fmt_before_1_89_0
- }
-
- // region:fmt_before_1_93_0
- #[derive(Copy, Clone)]
- #[lang = "format_arguments"]
- pub struct Arguments<'a> {
- pieces: &'a [&'static str],
- fmt: Option<&'a [rt::Placeholder]>,
- args: &'a [rt::Argument<'a>],
- }
-
- impl<'a> Arguments<'a> {
- pub const fn new_v1(pieces: &'a [&'static str], args: &'a [Argument<'a>]) -> Arguments<'a> {
- Arguments { pieces, fmt: None, args }
- }
-
- pub const fn new_const(pieces: &'a [&'static str]) -> Arguments<'a> {
- Arguments { pieces, fmt: None, args: &[] }
- }
-
- // region:fmt_before_1_89_0
- pub fn new_v1_formatted(
- pieces: &'a [&'static str],
- args: &'a [rt::Argument<'a>],
- fmt: &'a [rt::Placeholder],
- _unsafe_arg: rt::UnsafeArg,
- ) -> Arguments<'a> {
- Arguments { pieces, fmt: Some(fmt), args }
- }
- // endregion:fmt_before_1_89_0
-
- // region:!fmt_before_1_89_0
- pub unsafe fn new_v1_formatted(
- pieces: &'a [&'static str],
- args: &'a [rt::Argument<'a>],
- fmt: &'a [rt::Placeholder],
- ) -> Arguments<'a> {
- Arguments { pieces, fmt: Some(fmt), args }
- }
- // endregion:!fmt_before_1_89_0
-
- pub fn from_str_nonconst(s: &'static str) -> Arguments<'a> {
- Self::from_str(s)
- }
-
- pub const fn from_str(s: &'static str) -> Arguments<'a> {
- Arguments { pieces: &[s], fmt: None, args: &[] }
- }
-
- pub const fn as_str(&self) -> Option<&'static str> {
- match (self.pieces, self.args) {
- ([], []) => Some(""),
- ([s], []) => Some(s),
- _ => None,
- }
- }
}
- // endregion:fmt_before_1_93_0
- // region:!fmt_before_1_93_0
#[lang = "format_arguments"]
#[derive(Copy, Clone)]
pub struct Arguments<'a> {
@@ -1564,7 +1459,6 @@ pub mod fmt {
}
}
}
- // endregion:!fmt_before_1_93_0
// region:derive
pub(crate) mod derive {