Skip to content

Commit 73a154f

Browse files
committed
Add void pointer implicit conversion
1 parent 22edd84 commit 73a154f

4 files changed

Lines changed: 88 additions & 0 deletions

File tree

cpp2rust/converter/models/converter_refcount.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,12 @@ bool ConverterRefCount::VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) {
11601160
ToString(sub_expr->getType())));
11611161
}
11621162
computed_expr_type_ = ComputedExprType::FreshPointer;
1163+
} else if (sub_expr->getType()->isVoidPointerType() &&
1164+
expr->getType()->isPointerType()) {
1165+
Convert(sub_expr);
1166+
PushConversionKind push(*this, ConversionKind::Unboxed);
1167+
StrCat(std::format(".reinterpret_cast::<{}>()",
1168+
ConvertPointeeType(expr->getType())));
11631169
} else {
11641170
Convert(sub_expr);
11651171
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
extern crate libcc2rs;
2+
use libcc2rs::*;
3+
use std::cell::RefCell;
4+
use std::collections::BTreeMap;
5+
use std::io::prelude::*;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::AsFd;
8+
use std::rc::{Rc, Weak};
9+
pub fn bump_0(arg: AnyPtr) -> i32 {
10+
let arg: Value<AnyPtr> = Rc::new(RefCell::new(arg));
11+
let value: Value<Ptr<i32>> = Rc::new(RefCell::new(
12+
((*arg.borrow()).reinterpret_cast::<i32>()).clone(),
13+
));
14+
{
15+
let _ptr = (*value.borrow()).clone();
16+
_ptr.write(_ptr.read() + 1)
17+
};
18+
return ((*value.borrow()).read());
19+
}
20+
pub fn main() {
21+
std::process::exit(main_0());
22+
}
23+
fn main_0() -> i32 {
24+
let value: Value<i32> = Rc::new(RefCell::new(41));
25+
let opaque: Value<AnyPtr> = Rc::new(RefCell::new(((value.as_pointer()) as Ptr<i32>).to_any()));
26+
let typed: Value<Ptr<i32>> = Rc::new(RefCell::new(
27+
((*opaque.borrow()).reinterpret_cast::<i32>()).clone(),
28+
));
29+
assert!((((({ bump_0((*opaque.borrow()).clone(),) }) == 42) as i32) != 0));
30+
assert!((((((*typed.borrow()).read()) == 42) as i32) != 0));
31+
(*typed.borrow()).write(7);
32+
assert!(((((*value.borrow()) == 7) as i32) != 0));
33+
return 0;
34+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
extern crate libc;
2+
use libc::*;
3+
extern crate libcc2rs;
4+
use libcc2rs::*;
5+
use std::collections::BTreeMap;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::{AsFd, FromRawFd, IntoRawFd};
8+
use std::rc::Rc;
9+
pub unsafe fn bump_0(mut arg: *mut ::libc::c_void) -> i32 {
10+
let mut value: *mut i32 = (arg as *mut i32);
11+
(*value) += 1;
12+
return (*value);
13+
}
14+
pub fn main() {
15+
unsafe {
16+
std::process::exit(main_0() as i32);
17+
}
18+
}
19+
unsafe fn main_0() -> i32 {
20+
let mut value: i32 = 41;
21+
let mut opaque: *mut ::libc::c_void =
22+
((&mut value as *mut i32) as *mut i32 as *mut ::libc::c_void);
23+
let mut typed: *mut i32 = (opaque as *mut i32);
24+
assert!(((((unsafe { bump_0(opaque,) }) == (42)) as i32) != 0));
25+
assert!(((((*typed) == (42)) as i32) != 0));
26+
(*typed) = 7;
27+
assert!(((((value) == (7)) as i32) != 0));
28+
return 0;
29+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include <assert.h>
2+
#include <stdint.h>
3+
4+
static int32_t bump(void *arg) {
5+
int32_t *value = arg;
6+
*value += 1;
7+
return *value;
8+
}
9+
10+
int main() {
11+
int32_t value = 41;
12+
void *opaque = &value;
13+
int32_t *typed = opaque;
14+
assert(bump(opaque) == 42);
15+
assert(*typed == 42);
16+
*typed = 7;
17+
assert(value == 7);
18+
return 0;
19+
}

0 commit comments

Comments
 (0)