Skip to content

Commit

Permalink
add ptr to int and int to ptr type cast rules
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
nobel-sh authored and philberty committed Dec 23, 2024
1 parent b5c354d commit d28cae5
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 2 deletions.
27 changes: 25 additions & 2 deletions gcc/rust/typecheck/rust-casts.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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 ();
}
Expand Down
18 changes: 18 additions & 0 deletions gcc/testsuite/rust/compile/ptr_int_cast.rs
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit d28cae5

Please sign in to comment.