Skip to content

Commit 9490952

Browse files
committed
Handle UETT alignof
1 parent 24703cc commit 9490952

2 files changed

Lines changed: 24 additions & 3 deletions

File tree

‎cpp2rust/converter/converter.cpp‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3400,6 +3400,15 @@ bool Converter::VisitUnaryExprOrTypeTraitExpr(
34003400
: expr->getArgumentExpr()->getType())));
34013401
computed_expr_type_ = ComputedExprType::FreshValue;
34023402
break;
3403+
case clang::UnaryExprOrTypeTrait::UETT_AlignOf:
3404+
case clang::UnaryExprOrTypeTrait::UETT_PreferredAlignOf:
3405+
StrCat(std::format(
3406+
"::std::mem::align_of::<{}>()",
3407+
GetUnsafeTypeAsString(expr->isArgumentType()
3408+
? expr->getArgumentType()
3409+
: expr->getArgumentExpr()->getType())));
3410+
computed_expr_type_ = ComputedExprType::FreshValue;
3411+
break;
34033412
default:
34043413
// FIXME: improve error handling
34053414
log() << "unsupported unary expr or type trait expr\n";

‎cpp2rust/converter/models/converter_refcount.cpp‎

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,14 +1402,26 @@ bool ConverterRefCount::VisitExplicitCastExpr(clang::ExplicitCastExpr *expr) {
14021402

14031403
bool ConverterRefCount::VisitUnaryExprOrTypeTraitExpr(
14041404
clang::UnaryExprOrTypeTraitExpr *expr) {
1405-
if (expr->getKind() == clang::UnaryExprOrTypeTrait::UETT_SizeOf) {
1406-
auto arg_type = expr->isArgumentType() ? expr->getArgumentType()
1407-
: expr->getArgumentExpr()->getType();
1405+
auto arg_type = expr->isArgumentType() ? expr->getArgumentType()
1406+
: expr->getArgumentExpr()->getType();
1407+
switch (expr->getKind()) {
1408+
case clang::UnaryExprOrTypeTrait::UETT_SizeOf:
14081409
if (RustSizeDivergesFromC(arg_type)) {
14091410
StrCat(std::format("{}usize", ctx_.getTypeSize(arg_type) / 8));
14101411
computed_expr_type_ = ComputedExprType::FreshValue;
14111412
return false;
14121413
}
1414+
break;
1415+
case clang::UnaryExprOrTypeTrait::UETT_AlignOf:
1416+
case clang::UnaryExprOrTypeTrait::UETT_PreferredAlignOf:
1417+
if (RustSizeDivergesFromC(arg_type)) {
1418+
StrCat(std::format("{}usize", ctx_.getTypeAlign(arg_type) / 8));
1419+
computed_expr_type_ = ComputedExprType::FreshValue;
1420+
return false;
1421+
}
1422+
break;
1423+
default:
1424+
break;
14131425
}
14141426
return Converter::VisitUnaryExprOrTypeTraitExpr(expr);
14151427
}

0 commit comments

Comments
 (0)