[gcc r17-3119] gccrs: lang: Add range_inclusive_new

Arthur Cohen via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
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() {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.