Skip to content

Commit dc08fe1

Browse files
committed
Fix unset computed_expr_type for default arg and init list
1 parent 2bb3063 commit dc08fe1

2 files changed

Lines changed: 12 additions & 1 deletion

File tree

‎cpp2rust/converter/converter.cpp‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3604,7 +3604,8 @@ bool Converter::VisitInitListExpr(clang::InitListExpr *expr) {
36043604
bool Converter::VisitCompoundLiteralExpr(clang::CompoundLiteralExpr *expr) {
36053605
auto record = expr->getType()->getAsRecordDecl();
36063606
if (!record || !record->hasAttr<clang::TransparentUnionAttr>()) {
3607-
return true;
3607+
Convert(expr->getInitializer());
3608+
return false;
36083609
}
36093610
auto init = clang::cast<clang::InitListExpr>(expr->getInitializer());
36103611
assert(init->getNumInits() == 1);
@@ -3958,7 +3959,9 @@ bool Converter::VisitCXXDefaultArgExpr(clang::CXXDefaultArgExpr *expr) {
39583959
if (expr->getType()->isPointerType()) {
39593960
StrCat(token::kDefault);
39603961
computed_expr_type_ = ComputedExprType::FreshPointer;
3962+
return false;
39613963
}
3964+
Convert(expr->getExpr());
39623965
return false;
39633966
}
39643967

‎tests/unit/default_function_arguments.cpp‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ Bar global_bar(9);
2121

2222
int by_global_ref(const Bar &b = global_bar) { return b.v; }
2323

24+
template <typename T> int shifted(T x, int y = -1) { return x + y; }
25+
26+
template <typename R> int first(R &&r) { return r[0]; }
27+
2428
template <typename T> struct Holder {
2529
T v;
2630
explicit Holder(T v = 0) : v(v) {}
@@ -55,5 +59,9 @@ int main() {
5559
Holder<int> h(4);
5660
assert(h.v == 4);
5761

62+
assert(shifted(3) == 2);
63+
assert(shifted(3, 4) == 7);
64+
assert(first((int[]){4, 5, 6}) == 4);
65+
5866
return 0;
5967
}

0 commit comments

Comments
 (0)