Skip to content

Commit 4810320

Browse files
authored
Translate transparent init lists (#484)
1 parent 6083dcc commit 4810320

5 files changed

Lines changed: 103 additions & 0 deletions

File tree

‎cpp2rust/converter/converter.cpp‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3470,6 +3470,11 @@ bool Converter::VisitInitListExpr(clang::InitListExpr *expr) {
34703470
if (auto form = expr->getSemanticForm())
34713471
expr = form;
34723472

3473+
if (expr->isTransparent()) {
3474+
Convert(expr->getInit(0));
3475+
return false;
3476+
}
3477+
34733478
auto qual_type = expr->getType();
34743479
if (qual_type->isScalarType()) {
34753480
assert(expr->getNumInits() < 2 && "Excess elements in scalar initializer");

‎cpp2rust/converter/models/converter_refcount.cpp‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1840,6 +1840,11 @@ bool ConverterRefCount::VisitInitListExpr(clang::InitListExpr *expr) {
18401840
if (auto form = expr->getSemanticForm())
18411841
expr = form;
18421842

1843+
if (expr->isTransparent()) {
1844+
Convert(expr->getInit(0));
1845+
return false;
1846+
}
1847+
18431848
auto qual_type = expr->getType();
18441849
if (qual_type->isScalarType()) {
18451850
PushConversionKind push(*this, ConversionKind::Unboxed);

‎tests/unit/init_list.cpp‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,25 @@
11
#include <array>
2+
#include <cassert>
23
#include <initializer_list>
34
#include <vector>
45

56
void f(std::initializer_list<int> list) {}
67

8+
struct Pair {
9+
int a;
10+
int b;
11+
};
12+
13+
struct Holder {
14+
Pair p{0, 0};
15+
Holder &operator=(Pair &&o) {
16+
p = o;
17+
return *this;
18+
}
19+
};
20+
21+
int sum(const Pair &p) { return p.a + p.b; }
22+
723
int main() {
824
int i1{3};
925
int i2{};
@@ -13,5 +29,11 @@ int main() {
1329
std::vector<int> vec = {1, 2, 3};
1430
f({1, 2, 3, 4});
1531

32+
Pair p{1, 2};
33+
Holder h;
34+
h = {std::move(p)};
35+
assert(h.p.a == 1 && h.p.b == 2);
36+
assert(sum({p}) == 3);
37+
1638
return 0;
1739
}

‎tests/unit/out/refcount/init_list.rs‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,31 @@ use std::rc::{Rc, Weak};
99
pub fn f_0(list: Vec<i32>) {
1010
let list: Value<Vec<i32>> = Rc::new(RefCell::new(list));
1111
}
12+
#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg, Default)]
13+
#[byte_size(8)]
14+
pub struct Pair {
15+
#[offset(0)]
16+
pub a: i32,
17+
#[offset(4)]
18+
pub b: i32,
19+
}
20+
#[derive(Clone, Record, ByteRepr, VaArg, FnPtrArg)]
21+
#[byte_size(8)]
22+
pub struct Holder {
23+
#[offset(0)]
24+
#[byte_size(8)]
25+
pub p: Pair,
26+
}
27+
impl Default for Holder {
28+
fn default() -> Self {
29+
Holder {
30+
p: Pair { a: 0, b: 0 },
31+
}
32+
}
33+
}
34+
pub fn sum_1(p: Ptr<Pair>) -> i32 {
35+
return ({ p.with(|__s| __s.a) } + { p.with(|__s| __s.b) });
36+
}
1237
pub fn main() {
1338
__cpp2rust_init_globals();
1439
std::process::exit(main_0());
@@ -21,6 +46,20 @@ fn main_0() -> i32 {
2146
let arr: Value<Vec<i32>> = Rc::new(RefCell::new(vec![1, 2, 3]));
2247
let mut vec_: Vec<i32> = vec![1, 2, 3];
2348
({ f_0(vec![1, 2, 3, 4]) });
49+
let p: Value<Pair> = Rc::new(RefCell::new(Pair { a: 1, b: 2 }));
50+
let h: Value<Holder> = Rc::new(RefCell::new(<Holder>::default()));
51+
({ HolderImpl::operator_assign_1(&h.as_pointer(), p.as_pointer()) });
52+
assert!(({ (*h.borrow()).p.a } == 1) && ({ (*h.borrow()).p.b } == 2));
53+
assert!((({ sum_1(p.as_pointer(),) }) == 3));
2454
return 0;
2555
}
56+
pub trait HolderImpl {
57+
fn operator_assign_1(&self, o: Ptr<Pair>) -> Ptr<Holder>;
58+
}
59+
impl HolderImpl for Ptr<Holder> {
60+
fn operator_assign_1(&self, o: Ptr<Pair>) -> Ptr<Holder> {
61+
field!((*self), p).write({ (*o.upgrade().deref()).clone() });
62+
return (*self).clone();
63+
}
64+
}
2665
pub fn __cpp2rust_init_globals() {}

‎tests/unit/out/unsafe/init_list.rs‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,33 @@ use std::io::{Read, Seek, Write};
77
use std::os::fd::{AsFd, FromRawFd, IntoRawFd};
88
use std::rc::Rc;
99
pub unsafe fn f_0(mut list: Vec<i32>) {}
10+
#[repr(C)]
11+
#[derive(Copy, Clone, VaArg, FnPtrArg, Default)]
12+
pub struct Pair {
13+
pub a: i32,
14+
pub b: i32,
15+
}
16+
#[repr(C)]
17+
#[derive(Copy, Clone, VaArg, FnPtrArg)]
18+
pub struct Holder {
19+
pub p: Pair,
20+
}
21+
impl Holder {
22+
pub unsafe fn operator_assign_1(&mut self, o: *mut Pair) -> *mut Holder {
23+
self.p = (*o);
24+
return &mut (*(self as *mut Holder));
25+
}
26+
}
27+
impl Default for Holder {
28+
fn default() -> Self {
29+
Holder {
30+
p: Pair { a: 0, b: 0 },
31+
}
32+
}
33+
}
34+
pub unsafe fn sum_1(p: *const Pair) -> i32 {
35+
return (((*p).a) + ((*p).b));
36+
}
1037
pub fn main() {
1138
unsafe {
1239
__cpp2rust_init_globals();
@@ -21,6 +48,11 @@ unsafe fn main_0() -> i32 {
2148
let mut arr: Vec<i32> = vec![1, 2, 3];
2249
let mut vec_: Vec<i32> = vec![1, 2, 3];
2350
(unsafe { f_0(vec![1, 2, 3, 4]) });
51+
let mut p: Pair = Pair { a: 1, b: 2 };
52+
let mut h: Holder = <Holder>::default();
53+
(unsafe { Holder::operator_assign_1(&mut h, &mut p) });
54+
assert!(((h.p.a) == (1)) && ((h.p.b) == (2)));
55+
assert!(((unsafe { sum_1(&p,) }) == (3)));
2456
return 0;
2557
}
2658
pub unsafe fn __cpp2rust_init_globals() {}

0 commit comments

Comments
 (0)