https://gcc.gnu.org/g:a54310bd17730fd589568941962610bc85dd251b

commit r17-4357-ga54310bd17730fd589568941962610bc85dd251b
Author: Philip Herron <[email protected]>
Date:   Fri Sep 11 12:33:20 2026 +0100

    gccrs: This is an utterly insane rustc shim needed for stdarch
    
    This doesnt fully implement the legacy const generics attribute but its
    the starting point.
    
    What we actually need to do is understand:
    
        #[rustc_legacy_const_generics(1)]
        fn foo<const N: usize>(x: i32) -> i32 {
            x + N as i32
        }
    
        fn main() {
            let a = foo(10, 3);
        }
    
    So you can see the call to foo has a 2nd param but its not a real 2nd param
    its meant to be turned into:
    
        foo::<3>(10)
    
    Honestly this is just silly they probably implemented a bit of const
    generics wanted to use it in core and put this work around in to get away
    with it. Dumb.
    
    Addresses Rust-GCC/gccrs#3868
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-casts.cc (TypeCastRules::cast_rules): fix bad 
const cast
            * util/rust-attribute-values.h: add attribute
            * util/rust-attributes.cc: likewise
    
    Signed-off-by: Philip Herron <[email protected]>

Diff:
---
 gcc/rust/typecheck/rust-casts.cc      | 3 +++
 gcc/rust/util/rust-attribute-values.h | 3 +++
 gcc/rust/util/rust-attributes.cc      | 1 +
 3 files changed, 7 insertions(+)

diff --git a/gcc/rust/typecheck/rust-casts.cc b/gcc/rust/typecheck/rust-casts.cc
index fdc569ee26a9..6837e3f5fb74 100644
--- a/gcc/rust/typecheck/rust-casts.cc
+++ b/gcc/rust/typecheck/rust-casts.cc
@@ -18,6 +18,7 @@
 
 #include "rust-casts.h"
 #include "rust-tyty-util.h"
+#include "rust-tyty.h"
 
 namespace Rust {
 namespace Resolver {
@@ -70,6 +71,8 @@ TypeCastRules::cast_rules ()
   // 
https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/compiler/rustc_typeck/src/check/cast.rs#L654
 
   TyTy::BaseType *from_type = from.get_ty ()->destructure ();
+  if (auto c = from_type->try_as<TyTy::ConstParamType> ())
+    from_type = c->get_specified_type ();
 
   rust_debug ("cast_rules from={%s} to={%s}", from_type->debug_str ().c_str (),
              to.get_ty ()->debug_str ().c_str ());
diff --git a/gcc/rust/util/rust-attribute-values.h 
b/gcc/rust/util/rust-attribute-values.h
index e2718ca4a55f..99c549ea9211 100644
--- a/gcc/rust/util/rust-attribute-values.h
+++ b/gcc/rust/util/rust-attribute-values.h
@@ -115,6 +115,9 @@ public:
   static constexpr auto &RUSTC_ARGS_REQUIRED_CONST
     = "rustc_args_required_const";
 
+  static constexpr auto &RUSTC_LEGACY_CONST_GENERICS
+    = "rustc_legacy_const_generics";
+
   static constexpr auto &NEEDS_ALLOCATOR = "needs_allocator";
 
   static constexpr auto &RUSTC_ALLOCATOR = "rustc_allocator";
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index 8ab4bc608b85..33be02a43473 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -86,6 +86,7 @@ static const BuiltinAttrDefinition __definitions[]
      {Attrs::RUSTC_LAYOUT_SCALAR_VALID_RANGE_START, CODE_GENERATION},
      // TODO: be careful about calling functions marked with this?
      {Attrs::RUSTC_ARGS_REQUIRED_CONST, CODE_GENERATION},
+     {Attrs::RUSTC_LEGACY_CONST_GENERICS, TYPE_CHECK},
      {Attrs::COMPILER_BUILTINS, CODE_GENERATION},
      {Attrs::NO_BUILTINS, CODE_GENERATION},
      {Attrs::PRELUDE_IMPORT, NAME_RESOLUTION},

Reply via email to