Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow ptr to int and int to ptr type casting #3321

Merged
merged 1 commit into from
Dec 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
}
Loading