From 8c3dff6770a8aab9401654cec3716a057cf381b3 Mon Sep 17 00:00:00 2001 From: Xiangfei Ding Date: Mon, 23 Jun 2025 19:45:36 +0000 Subject: [PATCH] first draft of init array syntax This patch allows parsing of the syntax `init [ v1, v2, v3, .. ]` and certain level of type checking on HIR level. Signed-off-by: Xiangfei Ding --- compiler/rustc_ast/src/ast.rs | 20 ++ compiler/rustc_ast/src/util/classify.rs | 4 + compiler/rustc_ast/src/visit.rs | 13 + compiler/rustc_ast_lowering/src/block.rs | 112 ++++--- compiler/rustc_ast_lowering/src/expr.rs | 36 +++ compiler/rustc_ast_lowering/src/init.rs | 60 ++++ compiler/rustc_ast_lowering/src/lib.rs | 34 ++- .../rustc_ast_pretty/src/pprust/state/expr.rs | 8 + compiler/rustc_borrowck/messages.ftl | 24 ++ .../src/diagnostics/conflict_errors.rs | 20 ++ .../rustc_borrowck/src/diagnostics/mod.rs | 6 + .../src/diagnostics/region_name.rs | 1 + compiler/rustc_borrowck/src/lib.rs | 4 +- .../rustc_borrowck/src/session_diagnostics.rs | 35 +++ .../src/assert/context.rs | 2 + .../src/debuginfo/type_names.rs | 3 +- .../src/const_eval/valtrees.rs | 3 +- .../rustc_const_eval/src/interpret/call.rs | 1 + .../src/interpret/intrinsics.rs | 1 + .../rustc_const_eval/src/interpret/stack.rs | 1 + .../src/interpret/validity.rs | 1 + .../rustc_const_eval/src/util/type_name.rs | 1 + compiler/rustc_hir/src/def.rs | 7 +- compiler/rustc_hir/src/hir.rs | 41 ++- compiler/rustc_hir/src/intravisit.rs | 21 +- compiler/rustc_hir/src/lang_items.rs | 5 + .../rustc_hir_analysis/src/check/wfcheck.rs | 1 + .../src/coherence/inherent_impls.rs | 1 + .../src/coherence/orphan.rs | 3 +- .../src/collect/generics_of.rs | 4 +- .../src/hir_ty_lowering/mod.rs | 3 +- .../src/variance/constraints.rs | 6 +- compiler/rustc_hir_pretty/src/lib.rs | 18 +- compiler/rustc_hir_typeck/src/cast.rs | 1 + compiler/rustc_hir_typeck/src/closure.rs | 275 +++++++++++++----- compiler/rustc_hir_typeck/src/expr.rs | 4 + .../rustc_hir_typeck/src/expr_use_visitor.rs | 15 +- .../rustc_hir_typeck/src/fn_ctxt/checks.rs | 2 +- compiler/rustc_hir_typeck/src/init.rs | 125 ++++++++ compiler/rustc_hir_typeck/src/lib.rs | 1 + .../rustc_hir_typeck/src/naked_functions.rs | 2 + compiler/rustc_hir_typeck/src/upvar.rs | 16 +- .../src/infer/canonical/canonicalizer.rs | 1 + compiler/rustc_infer/src/infer/mod.rs | 2 +- compiler/rustc_lint/src/dangling.rs | 3 + compiler/rustc_lint/src/types.rs | 1 + compiler/rustc_metadata/src/rmeta/encoder.rs | 12 +- compiler/rustc_metadata/src/rmeta/table.rs | 1 + compiler/rustc_middle/src/hir/map.rs | 4 +- .../rustc_middle/src/middle/lang_items.rs | 2 +- compiler/rustc_middle/src/mir/mono.rs | 1 + compiler/rustc_middle/src/mir/pretty.rs | 8 +- compiler/rustc_middle/src/mir/visit.rs | 1 + compiler/rustc_middle/src/ty/context.rs | 2 + compiler/rustc_middle/src/ty/error.rs | 1 + compiler/rustc_middle/src/ty/instance.rs | 9 + compiler/rustc_middle/src/ty/layout.rs | 2 +- compiler/rustc_middle/src/ty/mod.rs | 6 + compiler/rustc_middle/src/ty/print/mod.rs | 1 + compiler/rustc_middle/src/ty/print/pretty.rs | 3 +- .../src/ty/significant_drop_order.rs | 1 + .../rustc_middle/src/ty/structural_impls.rs | 4 +- compiler/rustc_middle/src/ty/sty.rs | 18 +- compiler/rustc_middle/src/ty/util.rs | 15 +- compiler/rustc_mir_build/src/thir/cx/expr.rs | 4 + .../src/move_paths/builder.rs | 4 +- .../src/dataflow_const_prop.rs | 1 + compiler/rustc_mir_transform/src/inline.rs | 2 + .../rustc_mir_transform/src/inline/cycle.rs | 1 + compiler/rustc_mir_transform/src/shim.rs | 1 + compiler/rustc_monomorphize/src/collector.rs | 3 +- .../rustc_monomorphize/src/partitioning.rs | 2 + .../src/canonicalizer.rs | 1 + .../rustc_next_trait_solver/src/coherence.rs | 2 +- .../src/solve/assembly/mod.rs | 3 + .../src/solve/assembly/structural_traits.rs | 14 +- .../src/solve/normalizes_to/mod.rs | 2 + .../src/solve/trait_goals.rs | 2 + compiler/rustc_parse/src/parser/expr.rs | 78 ++++- compiler/rustc_parse/src/parser/mod.rs | 5 + compiler/rustc_parse/src/parser/stmt.rs | 8 + compiler/rustc_parse/src/parser/token_type.rs | 2 + compiler/rustc_passes/src/check_export.rs | 1 + compiler/rustc_passes/src/input_stats.rs | 4 +- compiler/rustc_passes/src/liveness.rs | 44 ++- compiler/rustc_pattern_analysis/src/rustc.rs | 1 + compiler/rustc_privacy/src/lib.rs | 4 +- .../rustc_resolve/src/build_reduced_graph.rs | 1 + compiler/rustc_resolve/src/def_collector.rs | 1 + .../src/cfi/typeid/itanium_cxx_abi/encode.rs | 2 +- .../cfi/typeid/itanium_cxx_abi/transform.rs | 3 +- compiler/rustc_smir/src/rustc_smir/bridge.rs | 1 + compiler/rustc_smir/src/rustc_smir/mod.rs | 5 + .../src/stable_mir/compiler_interface.rs | 1 + compiler/rustc_smir/src/stable_mir/mod.rs | 1 + compiler/rustc_smir/src/stable_mir/ty.rs | 14 + .../stable_mir/unstable/convert/internal.rs | 3 + .../stable_mir/unstable/convert/stable/ty.rs | 5 + .../rustc_smir/src/stable_mir/unstable/mod.rs | 8 +- compiler/rustc_smir/src/stable_mir/visitor.rs | 1 + compiler/rustc_span/src/symbol.rs | 6 + compiler/rustc_symbol_mangling/src/export.rs | 1 + compiler/rustc_symbol_mangling/src/v0.rs | 3 +- .../traits/fulfillment_errors.rs | 2 + .../src/traits/effects.rs | 4 +- .../src/traits/project.rs | 2 + .../src/traits/query/dropck_outlives.rs | 23 +- .../src/traits/select/candidate_assembly.rs | 5 + .../src/traits/select/confirmation.rs | 1 + .../src/traits/select/mod.rs | 5 +- .../rustc_trait_selection/src/traits/wf.rs | 2 +- compiler/rustc_ty_utils/src/implied_bounds.rs | 1 + compiler/rustc_ty_utils/src/layout.rs | 4 +- compiler/rustc_ty_utils/src/needs_drop.rs | 2 +- compiler/rustc_ty_utils/src/opaque_types.rs | 7 +- compiler/rustc_ty_utils/src/sig_types.rs | 2 +- compiler/rustc_ty_utils/src/ty.rs | 2 + compiler/rustc_type_ir/src/fast_reject.rs | 9 + compiler/rustc_type_ir/src/flags.rs | 1 + compiler/rustc_type_ir/src/inherent.rs | 1 + compiler/rustc_type_ir/src/outlives.rs | 4 + compiler/rustc_type_ir/src/ty_kind.rs | 11 + compiler/rustc_type_ir/src/walk.rs | 1 + library/core/src/init.rs | 93 ++++++ library/core/src/lib.rs | 4 + library/std/src/lib.rs | 2 + src/librustdoc/clean/mod.rs | 1 + src/librustdoc/formats/item_type.rs | 1 + .../passes/collect_intra_doc_links.rs | 2 + .../clippy/clippy_lints/src/dereference.rs | 1 + .../clippy_lints/src/loops/never_loop.rs | 2 + .../clippy_lints/src/manual_float_methods.rs | 1 + .../clippy/clippy_lints/src/utils/author.rs | 12 +- .../clippy/clippy_utils/src/eager_or_lazy.rs | 2 + .../clippy/clippy_utils/src/hir_utils.rs | 38 ++- src/tools/clippy/clippy_utils/src/sugg.rs | 4 + src/tools/clippy/clippy_utils/src/visitors.rs | 2 + src/tools/rustfmt/src/expr.rs | 7 +- src/tools/rustfmt/src/lib.rs | 1 + src/tools/rustfmt/src/utils.rs | 5 + tests/ui/symbol-names/basic.legacy.stderr | 4 +- .../ui/symbol-names/issue-60925.legacy.stderr | 4 +- 142 files changed, 1342 insertions(+), 217 deletions(-) create mode 100644 compiler/rustc_ast_lowering/src/init.rs create mode 100644 compiler/rustc_hir_typeck/src/init.rs create mode 100644 library/core/src/init.rs diff --git a/compiler/rustc_ast/src/ast.rs b/compiler/rustc_ast/src/ast.rs index 491a9bbda79b1..dd7f2e44f98f7 100644 --- a/compiler/rustc_ast/src/ast.rs +++ b/compiler/rustc_ast/src/ast.rs @@ -1474,6 +1474,9 @@ impl Expr { } } + ExprKind::InitBlock(..) => ExprPrecedence::Jump, + ExprKind::InitTail(..) => ExprPrecedence::Jump, + ExprKind::Break(_ /*label*/, value) | ExprKind::Ret(value) | ExprKind::Yield(YieldKind::Prefix(value)) @@ -1595,6 +1598,19 @@ pub struct Closure { pub fn_arg_span: Span, } +#[derive(Clone, Encodable, Decodable, Debug)] +pub struct InitBlock { + pub init_kw_span: Span, + pub expr: P, + pub fn_decl: P, +} + +#[derive(Clone, Encodable, Decodable, Debug)] +pub enum InitKind { + Free(P), + Array(ThinVec>), +} + /// Limit types of a range (inclusive or exclusive). #[derive(Copy, Clone, PartialEq, Encodable, Decodable, Debug)] pub enum RangeLimits { @@ -1712,6 +1728,10 @@ pub enum ExprKind { Match(P, ThinVec, MatchKind), /// A closure (e.g., `move |a, b, c| a + b + c`). Closure(Box), + /// An `init` block + InitBlock(P), + /// An in-place initialization at the tail position of an `init` block + InitTail(P), /// A block (`'label: { ... }`). Block(P, Option