diff --git a/src/parsec.cpp b/src/parsec.cpp index 30d256ecc6..b9328a8ba0 100644 --- a/src/parsec.cpp +++ b/src/parsec.cpp @@ -1857,6 +1857,16 @@ static AstNode *trans_c_style_cast_expr(Context *c, bool result_used, AstNode *b return trans_c_cast(c, stmt->getLocStart(), stmt->getType(), sub_expr_node); } +static AstNode *trans_unary_expr_or_type_trait_expr(Context *c, AstNode *block, UnaryExprOrTypeTraitExpr *stmt) { + AstNode *type_node = trans_qual_type(c, stmt->getTypeOfArgument(), stmt->getLocStart()); + if (type_node == nullptr) + return nullptr; + + AstNode *node = trans_create_node_builtin_fn_call_str(c, "sizeOf"); + node->data.fn_call_expr.params.append(type_node); + return node; +} + static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { Stmt::StmtClass sc = stmt->getStmtClass(); switch (sc) { @@ -1894,6 +1904,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s return trans_array_subscript_expr(c, block, (ArraySubscriptExpr *)stmt); case Stmt::CStyleCastExprClass: return trans_c_style_cast_expr(c, result_used, block, (CStyleCastExpr *)stmt, lrvalue); + case Stmt::UnaryExprOrTypeTraitExprClass: + return trans_unary_expr_or_type_trait_expr(c, block, (UnaryExprOrTypeTraitExpr *)stmt); case Stmt::CaseStmtClass: emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); return nullptr; @@ -2233,9 +2245,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s case Stmt::TypoExprClass: emit_warning(c, stmt->getLocStart(), "TODO handle C TypoExprClass"); return nullptr; - case Stmt::UnaryExprOrTypeTraitExprClass: - emit_warning(c, stmt->getLocStart(), "TODO handle C UnaryExprOrTypeTraitExprClass"); - return nullptr; case Stmt::VAArgExprClass: emit_warning(c, stmt->getLocStart(), "TODO handle C VAArgExprClass"); return nullptr; diff --git a/test/parsec.zig b/test/parsec.zig index 77a63a8798..814abbd52e 100644 --- a/test/parsec.zig +++ b/test/parsec.zig @@ -568,6 +568,17 @@ pub fn addCases(cases: &tests.ParseCContext) { \\ return @ptrCast(?&c_void, x); \\} ); + + cases.add("sizeof", + \\#include + \\size_t size_of(void) { + \\ return sizeof(int); + \\} + , + \\export fn size_of() -> usize { + \\ return @sizeOf(c_int); + \\} + ); }