Skip to content

Commit cf12479

Browse files
committed
Translate transparent init list
1 parent f467a98 commit cf12479

3 files changed

Lines changed: 32 additions & 0 deletions

File tree

‎cpp2rust/converter/converter.cpp‎

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

3467+
if (expr->isTransparent()) {
3468+
Convert(expr->getInit(0));
3469+
return false;
3470+
}
3471+
34673472
auto qual_type = expr->getType();
34683473
if (qual_type->isScalarType()) {
34693474
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
}

0 commit comments

Comments
 (0)