Skip to content

Commit 3aa79d8

Browse files
committed
Use default on empty initializer list
1 parent edba359 commit 3aa79d8

18 files changed

Lines changed: 53 additions & 113 deletions

‎cpp2rust/converter/converter.cpp‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3388,6 +3388,7 @@ bool Converter::VisitArrayInitLoopExpr(clang::ArrayInitLoopExpr *expr) {
33883388
}
33893389

33903390
bool Converter::VisitInitListExpr(clang::InitListExpr *expr) {
3391+
auto *syntactic = expr->isSyntacticForm() ? expr : expr->getSyntacticForm();
33913392
if (auto form = expr->getSemanticForm())
33923393
expr = form;
33933394

@@ -3413,6 +3414,12 @@ bool Converter::VisitInitListExpr(clang::InitListExpr *expr) {
34133414
return false;
34143415
}
34153416

3417+
if (syntactic->getNumInits() == 0) {
3418+
StrCat(GetDefaultAsString(qual_type));
3419+
SetFreshType(qual_type);
3420+
return false;
3421+
}
3422+
34163423
StrCat(GetUnsafeTypeAsString(qual_type));
34173424
PushBrace brace(*this);
34183425
int i = 0;

‎cpp2rust/converter/models/converter_refcount.cpp‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,6 +1598,7 @@ void ConverterRefCount::ConvertBinaryOperator(clang::BinaryOperator *expr) {
15981598
}
15991599

16001600
bool ConverterRefCount::VisitInitListExpr(clang::InitListExpr *expr) {
1601+
auto *syntactic = expr->isSyntacticForm() ? expr : expr->getSyntacticForm();
16011602
if (auto form = expr->getSemanticForm())
16021603
expr = form;
16031604

@@ -1623,6 +1624,15 @@ bool ConverterRefCount::VisitInitListExpr(clang::InitListExpr *expr) {
16231624
return false;
16241625
}
16251626

1627+
if (syntactic->getNumInits() == 0) {
1628+
{
1629+
PushConversionKind push(*this, ConversionKind::Unboxed);
1630+
StrCat(GetDefaultAsString(qual_type));
1631+
}
1632+
computed_expr_type_ = ComputedExprType::FreshValue;
1633+
return false;
1634+
}
1635+
16261636
StrCat(GetUnsafeTypeAsString(qual_type));
16271637
{
16281638
PushBrace brace(*this);

‎tests/unit/out/refcount/anonymous-struct.rs‎

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -259,33 +259,7 @@ pub fn main() {
259259
std::process::exit(main_0());
260260
}
261261
fn main_0() -> i32 {
262-
let o: Value<Outer> = Rc::new(RefCell::new(Outer {
263-
named: Rc::new(RefCell::new(Outer_Named {
264-
a: Rc::new(RefCell::new(0_i32)),
265-
b: Rc::new(RefCell::new(0_i32)),
266-
})),
267-
anonymous_named_0: Rc::new(RefCell::new(anon_0 {
268-
c: Rc::new(RefCell::new(0_i32)),
269-
d: Rc::new(RefCell::new(0_i32)),
270-
})),
271-
anonymous_named_1: Rc::new(RefCell::new(anon_1 {
272-
g: Rc::new(RefCell::new(0_i32)),
273-
h: Rc::new(RefCell::new(0_i32)),
274-
})),
275-
anon_2: Rc::new(RefCell::new(anon_2 {
276-
e: Rc::new(RefCell::new(0_i32)),
277-
f: Rc::new(RefCell::new(0_i32)),
278-
})),
279-
anon_3: Rc::new(RefCell::new(anon_3 {
280-
i: Rc::new(RefCell::new(0_i32)),
281-
inner_named: Rc::new(RefCell::new(anon_4 {
282-
j: Rc::new(RefCell::new(0_i32)),
283-
})),
284-
anon_5: Rc::new(RefCell::new(anon_5 {
285-
k: Rc::new(RefCell::new(0_i32)),
286-
})),
287-
})),
288-
}));
262+
let o: Value<Outer> = Rc::new(RefCell::new(<Outer>::default()));
289263
(*(*(*o.borrow()).named.borrow()).a.borrow_mut()) = 1;
290264
(*(*(*o.borrow()).named.borrow()).b.borrow_mut()) = 2;
291265
(*(*(*o.borrow()).anonymous_named_0.borrow()).c.borrow_mut()) = 3;

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

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -311,53 +311,39 @@ pub fn main() {
311311
}
312312
fn main_0() -> i32 {
313313
{
314-
let s: Value<S> = Rc::new(RefCell::new(S {}));
314+
let s: Value<S> = Rc::new(RefCell::new(<S>::default()));
315315
let _dtor_s = ScopedDestructor::new(&s, |__p| __p.destructor());
316316
}
317317
assert!((global_0.with(|rc| *rc.borrow()) == 1));
318318
{
319-
let s: Value<S> = Rc::new(RefCell::new(S {}));
319+
let s: Value<S> = Rc::new(RefCell::new(<S>::default()));
320320
let _dtor_s = ScopedDestructor::new(&s, |__p| __p.destructor());
321321
}
322322
assert!((global_0.with(|rc| *rc.borrow()) == 2));
323323
{
324-
let d: Value<Defaulted> = Rc::new(RefCell::new(Defaulted {
325-
s: Rc::new(RefCell::new(S {})),
326-
}));
324+
let d: Value<Defaulted> = Rc::new(RefCell::new(<Defaulted>::default()));
327325
let _dtor_d = ScopedDestructor::new(&d, |__p| __p.destructor());
328326
}
329327
assert!((global_0.with(|rc| *rc.borrow()) == 3));
330328
{
331-
let o: Value<Outer> = Rc::new(RefCell::new(Outer {
332-
m: Rc::new(RefCell::new(Middle {
333-
s: Rc::new(RefCell::new(S {})),
334-
})),
335-
}));
329+
let o: Value<Outer> = Rc::new(RefCell::new(<Outer>::default()));
336330
let _dtor_o = ScopedDestructor::new(&o, |__p| __p.destructor());
337331
}
338332
assert!((global_0.with(|rc| *rc.borrow()) == 4));
339333
{
340-
let am: Value<ArrayMember> = Rc::new(RefCell::new(ArrayMember {
341-
items: Rc::new(RefCell::new(Box::new([S {}, S {}, S {}]))),
342-
}));
334+
let am: Value<ArrayMember> = Rc::new(RefCell::new(<ArrayMember>::default()));
343335
let _dtor_am = ScopedDestructor::new(&am, |__p| __p.destructor());
344336
}
345337
assert!((global_0.with(|rc| *rc.borrow()) == 7));
346338
{
347-
let e: Value<EmptyBody> = Rc::new(RefCell::new(EmptyBody {
348-
s: Rc::new(RefCell::new(S {})),
349-
}));
339+
let e: Value<EmptyBody> = Rc::new(RefCell::new(<EmptyBody>::default()));
350340
let _dtor_e = ScopedDestructor::new(&e, |__p| __p.destructor());
351341
}
352342
assert!((global_0.with(|rc| *rc.borrow()) == 8));
353343
{
354-
let tc: Value<Templated_char_> = Rc::new(RefCell::new(Templated_char_ {
355-
v: Rc::new(RefCell::new(0_u8)),
356-
}));
344+
let tc: Value<Templated_char_> = Rc::new(RefCell::new(<Templated_char_>::default()));
357345
let _dtor_tc = ScopedDestructor::new(&tc, |__p| __p.destructor());
358-
let ti: Value<Templated_int_> = Rc::new(RefCell::new(Templated_int_ {
359-
v: Rc::new(RefCell::new(0_i32)),
360-
}));
346+
let ti: Value<Templated_int_> = Rc::new(RefCell::new(<Templated_int_>::default()));
361347
let _dtor_ti = ScopedDestructor::new(&ti, |__p| __p.destructor());
362348
}
363349
assert!((global_0.with(|rc| *rc.borrow()) == 13));

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ fn main_0() -> i32 {
6969
});
7070
let bar: Value<i32> = Rc::new(RefCell::new(5));
7171
(*out.borrow_mut()) += (((*bar.borrow()) + ({ foo_0(0) })) + ({ foo_1((x.as_pointer())) }));
72-
let foo1: Value<Foo> = Rc::new(RefCell::new(Foo {}));
73-
let foo2: Value<Foo> = Rc::new(RefCell::new(Foo {}));
72+
let foo1: Value<Foo> = Rc::new(RefCell::new(<Foo>::default()));
73+
let foo2: Value<Foo> = Rc::new(RefCell::new(<Foo>::default()));
7474
({ FooImpl::foo(&foo1.as_pointer()) });
7575
({ FooImpl::method_i32(&foo1.as_pointer(), 1) });
7676
({ FooImpl::foo_const(&foo2.as_pointer()) });

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,7 @@ impl Default for S {
6868
S {
6969
a: Rc::new(RefCell::new(1)),
7070
b: Rc::new(RefCell::new(2_u8)),
71-
c: Rc::new(RefCell::new(Inner {
72-
x: Rc::new(RefCell::new(3)),
73-
y: Rc::new(RefCell::new(4)),
74-
})),
71+
c: Rc::new(RefCell::new(<Inner>::default())),
7572
d: <Value<Inner>>::default(),
7673
}
7774
}

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,7 @@ fn main_0() -> i32 {
8888
let t: Value<Triple> = Rc::new(RefCell::new(Triple {
8989
a: Rc::new(RefCell::new(1)),
9090
b: Rc::new(RefCell::new(0_i32)),
91-
p: Rc::new(RefCell::new(Pair {
92-
x: Rc::new(RefCell::new(0_i32)),
93-
y: Rc::new(RefCell::new(0_i32)),
94-
})),
91+
p: Rc::new(RefCell::new(<Pair>::default())),
9592
}));
9693
assert!(((*(*t.borrow()).a.borrow()) == 1));
9794
assert!(((*(*t.borrow()).b.borrow()) == 0));
@@ -102,10 +99,7 @@ fn main_0() -> i32 {
10299
let q: Value<Ptr<Triple>> = Rc::new(RefCell::new(Ptr::alloc(Triple {
103100
a: Rc::new(RefCell::new(2)),
104101
b: Rc::new(RefCell::new(3)),
105-
p: Rc::new(RefCell::new(Pair {
106-
x: Rc::new(RefCell::new(0_i32)),
107-
y: Rc::new(RefCell::new(0_i32)),
108-
})),
102+
p: Rc::new(RefCell::new(<Pair>::default())),
109103
})));
110104
assert!(((*(*(*q.borrow()).upgrade().deref()).a.borrow()) == 2));
111105
assert!(((*(*(*q.borrow()).upgrade().deref()).b.borrow()) == 3));

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,7 @@ pub fn main() {
4343
std::process::exit(main_0());
4444
}
4545
fn main_0() -> i32 {
46-
let a: Value<Wrapper_Probe_> = Rc::new(RefCell::new(Wrapper_Probe_ {
47-
base_: Rc::new(RefCell::new(Probe {})),
48-
tag: Rc::new(RefCell::new(0_i32)),
49-
}));
46+
let a: Value<Wrapper_Probe_> = Rc::new(RefCell::new(<Wrapper_Probe_>::default()));
5047
(*(*a.borrow()).tag.borrow_mut()) = 3;
5148
let b: Value<Wrapper_Probe_> = Rc::new(RefCell::new((*a.borrow()).clone()));
5249
assert!(((*(*b.borrow()).tag.borrow()) == 3));

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,8 +275,8 @@ fn main_0() -> i32 {
275275
.borrow()),
276276
)
277277
});
278-
let x: Value<X1> = Rc::new(RefCell::new(X1 {}));
279-
let y: Value<X1> = Rc::new(RefCell::new(X1 {}));
278+
let x: Value<X1> = Rc::new(RefCell::new(<X1>::default()));
279+
let y: Value<X1> = Rc::new(RefCell::new(<X1>::default()));
280280
(*x1.borrow_mut()) = (({ zero_0() }) + (*(*y1.borrow()).x.borrow()));
281281
(*(*y1.borrow()).x.borrow_mut()) = (({ zero_0() }) + 5);
282282
let ptr2ptr_1: Value<Ptr<Ptr<i32>>> = Rc::new(RefCell::new((px1.as_pointer())));

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,7 @@ pub fn main() {
5050
}
5151
fn main_0() -> i32 {
5252
let arr: Value<Box<[i64]>> = Rc::new(RefCell::new(Box::new([0_i64, 0_i64, 0_i64, 0_i64])));
53-
let s: Value<S> = Rc::new(RefCell::new(S {
54-
c: Rc::new(RefCell::new(0_u8)),
55-
x: Rc::new(RefCell::new(0_i64)),
56-
}));
53+
let s: Value<S> = Rc::new(RefCell::new(<S>::default()));
5754
assert!((::std::mem::size_of::<i32>() == 4_usize));
5855
assert!((::std::mem::size_of::<[i64; 4]>() == 32_usize));
5956
assert!((16usize == 16_usize));

0 commit comments

Comments
 (0)