authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 01:54:51-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 01:55:15-04:00
log2655cf1bf7fc57d57572405f6e21b0b9a7986451
treead2eca645d96a08cb7558133f703c2898d553fae
parent5ac2cf9c28253a7b6144c9f5b19f68df1e26527c

parse-c: support c style cast


2 files changed, 22 insertions(+), 3 deletions(-)

src/parsec.cpp+12-3
......@@ -1837,6 +1837,16 @@ static AstNode *trans_array_subscript_expr(Context *c, AstNode *block, ArraySubs
18371837 return node;
18381838}
18391839
1840static AstNode *trans_c_style_cast_expr(Context *c, bool result_used, AstNode *block,
1841 CStyleCastExpr *stmt, TransLRValue lrvalue)
1842{
1843 AstNode *sub_expr_node = trans_expr(c, result_used, block, stmt->getSubExpr(), lrvalue);
1844 if (sub_expr_node == nullptr)
1845 return nullptr;
1846
1847 return trans_c_cast(c, stmt->getLocStart(), stmt->getType(), sub_expr_node);
1848}
1849
18401850static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
18411851 Stmt::StmtClass sc = stmt->getStmtClass();
18421852 switch (sc) {
......@@ -1872,6 +1882,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
18721882 return trans_member_expr(c, block, (MemberExpr *)stmt);
18731883 case Stmt::ArraySubscriptExprClass:
18741884 return trans_array_subscript_expr(c, block, (ArraySubscriptExpr *)stmt);
1885 case Stmt::CStyleCastExprClass:
1886 return trans_c_style_cast_expr(c, result_used, block, (CStyleCastExpr *)stmt, lrvalue);
18751887 case Stmt::CaseStmtClass:
18761888 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
18771889 return nullptr;
......@@ -2020,9 +2032,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
20202032 case Stmt::UserDefinedLiteralClass:
20212033 emit_warning(c, stmt->getLocStart(), "TODO handle C UserDefinedLiteralClass");
20222034 return nullptr;
2023 case Stmt::CStyleCastExprClass:
2024 emit_warning(c, stmt->getLocStart(), "TODO handle C CStyleCastExprClass");
2025 return nullptr;
20262035 case Stmt::CXXFunctionalCastExprClass:
20272036 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXFunctionalCastExprClass");
20282037 return nullptr;
test/parsec.zig+10
......@@ -548,4 +548,14 @@ pub fn addCases(cases: &tests.ParseCContext) {
548548 \\}
549549 );
550550
551
552 cases.add("c style cast",
553 \\int float_to_int(float a) {
554 \\ return (int)a;
555 \\}
556 ,
557 \\export fn float_to_int(a: f32) -> c_int {
558 \\ return c_int(a);
559 \\}
560 );
551561}