https://gcc.gnu.org/g:7cd98512853df3cc8ffd0357fac0d69d820df631
commit r17-3119-g7cd98512853df3cc8ffd0357fac0d69d820df631 Author: Enes Cevik <[email protected]> Date: Tue Jul 14 14:46:03 2026 +0300 gccrs: lang: Add range_inclusive_new This patch introduces the 'range_inclusive_new' lang item to the compiler. When the compiler encounters an inclusive range expression, it now correctly desugars the operation into a function call targeting this lang item instead of lowering it directly into a static struct. gcc/rust/ChangeLog: * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Add desugaring for range_inclusive_new lang item. * util/rust-lang-item.cc (Rust::LangItem::lang_items): Add range_inclusive_new to the BiMap. * util/rust-lang-item.h (class LangItem): Add RANGE_INCLUSIVE_NEW to the Kind enum. gcc/testsuite/ChangeLog: * rust/compile/torture/range-lang-item1.rs: Update test to use the new lang item. Signed-off-by: Enes Cevik <[email protected]> Diff: --- gcc/rust/hir/rust-ast-lower-expr.cc | 26 ++++++++++++++++------ gcc/rust/util/rust-lang-item.cc | 1 + gcc/rust/util/rust-lang-item.h | 1 + .../rust/compile/torture/range-lang-item1.rs | 12 ++++++++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/gcc/rust/hir/rust-ast-lower-expr.cc b/gcc/rust/hir/rust-ast-lower-expr.cc index f41ba8bcf8cb..0e934307755d 100644 --- a/gcc/rust/hir/rust-ast-lower-expr.cc +++ b/gcc/rust/hir/rust-ast-lower-expr.cc @@ -796,18 +796,30 @@ void ASTLoweringExpr::visit (AST::RangeFromToInclExpr &expr) { auto crate_num = mappings.get_current_crate (); - Analysis::NodeMapping mapping (crate_num, expr.get_node_id (), - mappings.get_next_hir_id (crate_num), - UNKNOWN_LOCAL_DEFID); + Analysis::NodeMapping path_mapping (crate_num, mappings.get_next_node_id (), + mappings.get_next_hir_id (crate_num), + UNKNOWN_LOCAL_DEFID); + Analysis::NodeMapping call_mapping (crate_num, expr.get_node_id (), + mappings.get_next_hir_id (crate_num), + UNKNOWN_LOCAL_DEFID); + + HIR::Expr *func + = new HIR::PathInExpression (path_mapping, + LangItem::Kind::RANGE_INCLUSIVE_NEW, + expr.get_locus (), false); HIR::Expr *range_from = ASTLoweringExpr::translate (expr.get_from_expr ()); HIR::Expr *range_to = ASTLoweringExpr::translate (expr.get_to_expr ()); + std::vector<std::unique_ptr<HIR::Expr>> params; + params.reserve (2); + params.emplace_back (std::unique_ptr<HIR::Expr> (range_from)); + params.emplace_back (std::unique_ptr<HIR::Expr> (range_to)); + translated - = new HIR::RangeFromToInclExpr (mapping, - std::unique_ptr<HIR::Expr> (range_from), - std::unique_ptr<HIR::Expr> (range_to), - expr.get_locus ()); + = new HIR::CallExpr (call_mapping, std::unique_ptr<HIR::Expr> (func), + std::move (params), expr.get_outer_attrs (), + expr.get_locus ()); } void diff --git a/gcc/rust/util/rust-lang-item.cc b/gcc/rust/util/rust-lang-item.cc index 91284e27b088..731fd23f3148 100644 --- a/gcc/rust/util/rust-lang-item.cc +++ b/gcc/rust/util/rust-lang-item.cc @@ -55,6 +55,7 @@ const BiMap<std::string, LangItem::Kind> Rust::LangItem::lang_items = {{ {"RangeTo", Kind::RANGE_TO}, {"RangeInclusive", Kind::RANGE_INCLUSIVE}, {"RangeToInclusive", Kind::RANGE_TO_INCLUSIVE}, + {"range_inclusive_new", Kind::RANGE_INCLUSIVE_NEW}, {"phantom_data", Kind::PHANTOM_DATA}, {"fn", Kind::FN}, {"fn_mut", Kind::FN_MUT}, diff --git a/gcc/rust/util/rust-lang-item.h b/gcc/rust/util/rust-lang-item.h index d96fa9e6a789..9684148f7554 100644 --- a/gcc/rust/util/rust-lang-item.h +++ b/gcc/rust/util/rust-lang-item.h @@ -77,6 +77,7 @@ public: RANGE_TO, RANGE_INCLUSIVE, RANGE_TO_INCLUSIVE, + RANGE_INCLUSIVE_NEW, // https://github.com/rust-lang/rust/blob/master/library/core/src/marker.rs PHANTOM_DATA, diff --git a/gcc/testsuite/rust/compile/torture/range-lang-item1.rs b/gcc/testsuite/rust/compile/torture/range-lang-item1.rs index 8682e5a55ae4..328f0cfa72e8 100644 --- a/gcc/testsuite/rust/compile/torture/range-lang-item1.rs +++ b/gcc/testsuite/rust/compile/torture/range-lang-item1.rs @@ -29,6 +29,18 @@ pub struct RangeTo<Idx> { pub struct RangeInclusive<Idx> { pub start: Idx, pub end: Idx, + pub exhausted: bool, +} + +impl<Idx> RangeInclusive<Idx> { + #[lang = "range_inclusive_new"] + pub const fn new(start: Idx, end: Idx) -> Self { + Self { + start, + end, + exhausted: false, + } + } } fn test() {
