authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 02:37:42-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 02:37:42-04:00
logbe37b03f4c841ea4e309008885e1831fa86ff085
treeb30aa44cf4ca6ed99d00122c692ea49c89f9c196
parentc01ae69cdbb84a3c154df635afd01675a6a7a616

parse-c: support sizeof


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

src/parsec.cpp+12-3
...@@ -1857,6 +1857,16 @@ static AstNode *trans_c_style_cast_expr(Context *c, bool result_used, AstNode *b...@@ -1857,6 +1857,16 @@ static AstNode *trans_c_style_cast_expr(Context *c, bool result_used, AstNode *b
1857 return trans_c_cast(c, stmt->getLocStart(), stmt->getType(), sub_expr_node);1857 return trans_c_cast(c, stmt->getLocStart(), stmt->getType(), sub_expr_node);
1858}1858}
18591859
1860static AstNode *trans_unary_expr_or_type_trait_expr(Context *c, AstNode *block, UnaryExprOrTypeTraitExpr *stmt) {
1861 AstNode *type_node = trans_qual_type(c, stmt->getTypeOfArgument(), stmt->getLocStart());
1862 if (type_node == nullptr)
1863 return nullptr;
1864
1865 AstNode *node = trans_create_node_builtin_fn_call_str(c, "sizeOf");
1866 node->data.fn_call_expr.params.append(type_node);
1867 return node;
1868}
1869
1860static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {1870static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
1861 Stmt::StmtClass sc = stmt->getStmtClass();1871 Stmt::StmtClass sc = stmt->getStmtClass();
1862 switch (sc) {1872 switch (sc) {
...@@ -1894,6 +1904,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -1894,6 +1904,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1894 return trans_array_subscript_expr(c, block, (ArraySubscriptExpr *)stmt);1904 return trans_array_subscript_expr(c, block, (ArraySubscriptExpr *)stmt);
1895 case Stmt::CStyleCastExprClass:1905 case Stmt::CStyleCastExprClass:
1896 return trans_c_style_cast_expr(c, result_used, block, (CStyleCastExpr *)stmt, lrvalue);1906 return trans_c_style_cast_expr(c, result_used, block, (CStyleCastExpr *)stmt, lrvalue);
1907 case Stmt::UnaryExprOrTypeTraitExprClass:
1908 return trans_unary_expr_or_type_trait_expr(c, block, (UnaryExprOrTypeTraitExpr *)stmt);
1897 case Stmt::CaseStmtClass:1909 case Stmt::CaseStmtClass:
1898 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");1910 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
1899 return nullptr;1911 return nullptr;
...@@ -2233,9 +2245,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -2233,9 +2245,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
2233 case Stmt::TypoExprClass:2245 case Stmt::TypoExprClass:
2234 emit_warning(c, stmt->getLocStart(), "TODO handle C TypoExprClass");2246 emit_warning(c, stmt->getLocStart(), "TODO handle C TypoExprClass");
2235 return nullptr;2247 return nullptr;
2236 case Stmt::UnaryExprOrTypeTraitExprClass:
2237 emit_warning(c, stmt->getLocStart(), "TODO handle C UnaryExprOrTypeTraitExprClass");
2238 return nullptr;
2239 case Stmt::VAArgExprClass:2248 case Stmt::VAArgExprClass:
2240 emit_warning(c, stmt->getLocStart(), "TODO handle C VAArgExprClass");2249 emit_warning(c, stmt->getLocStart(), "TODO handle C VAArgExprClass");
2241 return nullptr;2250 return nullptr;
test/parsec.zig+11
...@@ -568,6 +568,17 @@ pub fn addCases(cases: &tests.ParseCContext) {...@@ -568,6 +568,17 @@ pub fn addCases(cases: &tests.ParseCContext) {
568 \\ return @ptrCast(?&c_void, x);568 \\ return @ptrCast(?&c_void, x);
569 \\}569 \\}
570 );570 );
571
572 cases.add("sizeof",
573 \\#include <stddef.h>
574 \\size_t size_of(void) {
575 \\ return sizeof(int);
576 \\}
577 ,
578 \\export fn size_of() -> usize {
579 \\ return @sizeOf(c_int);
580 \\}
581 );
571}582}
572583
573584