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...@@ -1837,6 +1837,16 @@ static AstNode *trans_array_subscript_expr(Context *c, AstNode *block, ArraySubs
1837 return node;1837 return node;
1838}1838}
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
1840static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {1850static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
1841 Stmt::StmtClass sc = stmt->getStmtClass();1851 Stmt::StmtClass sc = stmt->getStmtClass();
1842 switch (sc) {1852 switch (sc) {
...@@ -1872,6 +1882,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -1872,6 +1882,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1872 return trans_member_expr(c, block, (MemberExpr *)stmt);1882 return trans_member_expr(c, block, (MemberExpr *)stmt);
1873 case Stmt::ArraySubscriptExprClass:1883 case Stmt::ArraySubscriptExprClass:
1874 return trans_array_subscript_expr(c, block, (ArraySubscriptExpr *)stmt);1884 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);
1875 case Stmt::CaseStmtClass:1887 case Stmt::CaseStmtClass:
1876 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");1888 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
1877 return nullptr;1889 return nullptr;
...@@ -2020,9 +2032,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -2020,9 +2032,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
2020 case Stmt::UserDefinedLiteralClass:2032 case Stmt::UserDefinedLiteralClass:
2021 emit_warning(c, stmt->getLocStart(), "TODO handle C UserDefinedLiteralClass");2033 emit_warning(c, stmt->getLocStart(), "TODO handle C UserDefinedLiteralClass");
2022 return nullptr;2034 return nullptr;
2023 case Stmt::CStyleCastExprClass:
2024 emit_warning(c, stmt->getLocStart(), "TODO handle C CStyleCastExprClass");
2025 return nullptr;
2026 case Stmt::CXXFunctionalCastExprClass:2035 case Stmt::CXXFunctionalCastExprClass:
2027 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXFunctionalCastExprClass");2036 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXFunctionalCastExprClass");
2028 return nullptr;2037 return nullptr;
test/parsec.zig+10
...@@ -548,4 +548,14 @@ pub fn addCases(cases: &tests.ParseCContext) {...@@ -548,4 +548,14 @@ pub fn addCases(cases: &tests.ParseCContext) {
548 \\}548 \\}
549 );549 );
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 );
551}561}