]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: add ptr to int and int to ptr type cast rules
authorNobel <nobel2073@gmail.com>
Sun, 22 Dec 2024 22:19:44 +0000 (04:04 +0545)
committerArthur Cohen <arthur.cohen@embecosm.com>
Fri, 21 Mar 2025 11:55:43 +0000 (12:55 +0100)
Added rules to allow type casting pointer as integer types (u*,i*)
and integer types to be casted as pointer.

gcc/rust/ChangeLog:

* typecheck/rust-casts.cc (TypeCastRules::cast_rules): Add rule.

gcc/testsuite/ChangeLog:

* rust/compile/ptr_int_cast.rs: New test.

Signed-off-by: Nobel Singh <nobel2073@gmail.com>
gcc/rust/typecheck/rust-casts.cc
gcc/testsuite/rust/compile/ptr_int_cast.rs [new file with mode: 0644]

index cf4de4b33205bcc666283aaf3a5f0a704addbbe0..694cbaa5db6085761fc372b2e3ef11e81d928069 100644 (file)
@@ -210,6 +210,16 @@ TypeCastRules::cast_rules ()
          }
          break;
 
+         case TyTy::TypeKind::POINTER: {
+           // char can't be casted as a ptr
+           bool from_char
+             = from.get_ty ()->get_kind () == TyTy::TypeKind::CHAR;
+           if (!from_char)
+             return TypeCoercionRules::CoercionResult{{},
+                                                      to.get_ty ()->clone ()};
+         }
+         break;
+
        case TyTy::TypeKind::INFER:
        case TyTy::TypeKind::USIZE:
        case TyTy::TypeKind::ISIZE:
@@ -254,12 +264,25 @@ TypeCastRules::cast_rules ()
     case TyTy::TypeKind::POINTER:
       switch (to.get_ty ()->get_kind ())
        {
+       case TyTy::TypeKind::USIZE:
+       case TyTy::TypeKind::ISIZE:
+       case TyTy::TypeKind::UINT:
+         case TyTy::TypeKind::INT: {
+           // refs should not cast to numeric type
+           bool from_ptr
+             = from.get_ty ()->get_kind () == TyTy::TypeKind::POINTER;
+           if (from_ptr)
+             {
+               return TypeCoercionRules::CoercionResult{
+                 {}, to.get_ty ()->clone ()};
+             }
+         }
+         break;
+
        case TyTy::TypeKind::REF:
        case TyTy::TypeKind::POINTER:
          return check_ptr_ptr_cast ();
 
-         // FIXME can you cast a pointer to a integral type?
-
        default:
          return TypeCoercionRules::CoercionResult::get_error ();
        }
diff --git a/gcc/testsuite/rust/compile/ptr_int_cast.rs b/gcc/testsuite/rust/compile/ptr_int_cast.rs
new file mode 100644 (file)
index 0000000..3a2a5d5
--- /dev/null
@@ -0,0 +1,18 @@
+fn main(){
+    let foo = 1337;
+    let bar_ptr = &foo as *const i32;
+
+    let bar_ptr_usize = bar_ptr as usize;
+    let bar_ptr_isize = bar_ptr as isize;
+    let bar_ptr_u64 = bar_ptr as u64;
+    let bar_ptr_i64 = bar_ptr as i64;
+    let bar_ptr_i8 = bar_ptr as i8;
+    let bar_ptr_u8 = bar_ptr as u8;
+
+    let _ = bar_ptr_usize as *const i32;
+    let _ = bar_ptr_isize as *const i32;
+    let _ = bar_ptr_u64 as *const i32;
+    let _ = bar_ptr_i64 as *const i32;
+    let _ = bar_ptr_i8 as *const i32;
+    let _ = bar_ptr_u8 as *const i32;
+}