Skip to content

Commit 6be81d0

Browse files
authored
Translate sizeof pack (#328)
1 parent 4b05f90 commit 6be81d0

5 files changed

Lines changed: 74 additions & 0 deletions

File tree

‎cpp2rust/converter/converter.cpp‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3205,6 +3205,14 @@ bool Converter::VisitTypeTraitExpr(clang::TypeTraitExpr *expr) {
32053205
return false;
32063206
}
32073207

3208+
bool Converter::VisitSizeOfPackExpr(clang::SizeOfPackExpr *expr) {
3209+
clang::Expr::EvalResult result;
3210+
ENSURE(expr->EvaluateAsInt(result, ctx_));
3211+
StrCat(std::to_string(result.Val.getInt().getExtValue()));
3212+
computed_expr_type_ = ComputedExprType::FreshValue;
3213+
return false;
3214+
}
3215+
32083216
bool Converter::VisitOffsetOfExpr(clang::OffsetOfExpr *expr) {
32093217
std::string member_path;
32103218
for (unsigned i = 0; i < expr->getNumComponents(); ++i) {

‎cpp2rust/converter/converter.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ class Converter : public clang::RecursiveASTVisitor<Converter> {
369369
VisitUnaryExprOrTypeTraitExpr(clang::UnaryExprOrTypeTraitExpr *expr);
370370

371371
virtual bool VisitTypeTraitExpr(clang::TypeTraitExpr *expr);
372+
virtual bool VisitSizeOfPackExpr(clang::SizeOfPackExpr *expr);
372373

373374
virtual bool VisitOffsetOfExpr(clang::OffsetOfExpr *expr);
374375

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,31 @@ pub fn first_4(x: i32, args: i32) -> i32 {
3232
let args: Value<i32> = Rc::new(RefCell::new(args));
3333
return ((*x.borrow()) + ({ sum_2((*args.borrow())) }));
3434
}
35+
pub fn sizeof_pack_5() -> i32 {
36+
return (0 as i32);
37+
}
38+
pub fn sizeof_pack_6(args: i32) -> i32 {
39+
let args: Value<i32> = Rc::new(RefCell::new(args));
40+
return (1 as i32);
41+
}
42+
pub fn sizeof_pack_7(args_0: i32, args_1: i32) -> i32 {
43+
let args_0: Value<i32> = Rc::new(RefCell::new(args_0));
44+
let args_1: Value<i32> = Rc::new(RefCell::new(args_1));
45+
return (2 as i32);
46+
}
47+
pub fn sizeof_pack_8(args_0: i32, args_1: i32, args_2: i32) -> i32 {
48+
let args_0: Value<i32> = Rc::new(RefCell::new(args_0));
49+
let args_1: Value<i32> = Rc::new(RefCell::new(args_1));
50+
let args_2: Value<i32> = Rc::new(RefCell::new(args_2));
51+
return (3 as i32);
52+
}
53+
pub fn sizeof_pack_9(args_0: i32, args_1: i32, args_2: i32, args_3: i32) -> i32 {
54+
let args_0: Value<i32> = Rc::new(RefCell::new(args_0));
55+
let args_1: Value<i32> = Rc::new(RefCell::new(args_1));
56+
let args_2: Value<i32> = Rc::new(RefCell::new(args_2));
57+
let args_3: Value<i32> = Rc::new(RefCell::new(args_3));
58+
return (4 as i32);
59+
}
3560
pub fn main() {
3661
std::process::exit(main_0());
3762
}
@@ -40,5 +65,10 @@ fn main_0() -> i32 {
4065
assert!((({ sum_1(4, 5,) }) == 9));
4166
assert!((({ first_3(10, 1, 2,) }) == 13));
4267
assert!((({ first_4(10, 0,) }) == 10));
68+
assert!((({ sizeof_pack_5() }) == 0));
69+
assert!((({ sizeof_pack_6(1,) }) == 1));
70+
assert!((({ sizeof_pack_7(1, 2,) }) == 2));
71+
assert!((({ sizeof_pack_8(1, 2, 3,) }) == 3));
72+
assert!((({ sizeof_pack_9(1, 2, 3, 4,) }) == 4));
4373
return 0;
4474
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,26 @@ pub unsafe fn first_3(mut x: i32, mut args_1: i32, mut args_2: i32) -> i32 {
2121
pub unsafe fn first_4(mut x: i32, mut args: i32) -> i32 {
2222
return ((x) + (unsafe { sum_2(args) }));
2323
}
24+
pub unsafe fn sizeof_pack_5() -> i32 {
25+
return (0 as i32);
26+
}
27+
pub unsafe fn sizeof_pack_6(mut args: i32) -> i32 {
28+
return (1 as i32);
29+
}
30+
pub unsafe fn sizeof_pack_7(mut args_0: i32, mut args_1: i32) -> i32 {
31+
return (2 as i32);
32+
}
33+
pub unsafe fn sizeof_pack_8(mut args_0: i32, mut args_1: i32, mut args_2: i32) -> i32 {
34+
return (3 as i32);
35+
}
36+
pub unsafe fn sizeof_pack_9(
37+
mut args_0: i32,
38+
mut args_1: i32,
39+
mut args_2: i32,
40+
mut args_3: i32,
41+
) -> i32 {
42+
return (4 as i32);
43+
}
2444
pub fn main() {
2545
unsafe {
2646
std::process::exit(main_0() as i32);
@@ -31,5 +51,10 @@ unsafe fn main_0() -> i32 {
3151
assert!(((unsafe { sum_1(4, 5,) }) == (9)));
3252
assert!(((unsafe { first_3(10, 1, 2,) }) == (13)));
3353
assert!(((unsafe { first_4(10, 0,) }) == (10)));
54+
assert!(((unsafe { sizeof_pack_5() }) == (0)));
55+
assert!(((unsafe { sizeof_pack_6(1,) }) == (1)));
56+
assert!(((unsafe { sizeof_pack_7(1, 2,) }) == (2)));
57+
assert!(((unsafe { sizeof_pack_8(1, 2, 3,) }) == (3)));
58+
assert!(((unsafe { sizeof_pack_9(1, 2, 3, 4,) }) == (4)));
3459
return 0;
3560
}

‎tests/unit/template_pack.cpp‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,20 @@ template <typename T, typename... Args> T first(T x, Args... args) {
66
return x + sum(args...);
77
}
88

9+
template <typename... Args> int sizeof_pack(Args... args) {
10+
return sizeof...(Args);
11+
}
12+
913
int main() {
1014
assert(sum(1, 2, 3) == 6);
1115
assert(sum(4, 5) == 9);
1216
assert(first(10, 1, 2) == 13);
1317
assert(first(10, 0) == 10);
18+
19+
assert(sizeof_pack() == 0);
20+
assert(sizeof_pack(1) == 1);
21+
assert(sizeof_pack(1, 2) == 2);
22+
assert(sizeof_pack(1, 2, 3) == 3);
23+
assert(sizeof_pack(1, 2, 3, 4) == 4);
1424
return 0;
1525
}

0 commit comments

Comments
 (0)