authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 02:31:52-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 02:31:52-04:00
logc01ae69cdbb84a3c154df635afd01675a6a7a616
tree5cce89783f0933cb0ee0a6f5d4abd5dd16c9928f
parent2655cf1bf7fc57d57572405f6e21b0b9a7986451

parse-c: support implicit cast to void *


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

src/parsec.cpp+13-3
...@@ -1228,12 +1228,22 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas...@@ -1228,12 +1228,22 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
1228 return nullptr;1228 return nullptr;
1229 return target_node;1229 return target_node;
1230 }1230 }
1231 case CK_BitCast:
1232 {
1233 AstNode *target_node = trans_expr(c, true, block, stmt->getSubExpr(), TransRValue);
1234 if (target_node == nullptr)
1235 return nullptr;
1236
1237 AstNode *dest_type_node = trans_qual_type(c, stmt->getType(), stmt->getLocStart());
1238
1239 AstNode *node = trans_create_node_builtin_fn_call_str(c, "ptrCast");
1240 node->data.fn_call_expr.params.append(dest_type_node);
1241 node->data.fn_call_expr.params.append(target_node);
1242 return node;
1243 }
1231 case CK_Dependent:1244 case CK_Dependent:
1232 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_Dependent");1245 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_Dependent");
1233 return nullptr;1246 return nullptr;
1234 case CK_BitCast:
1235 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_BitCast");
1236 return nullptr;
1237 case CK_LValueBitCast:1247 case CK_LValueBitCast:
1238 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_LValueBitCast");1248 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_LValueBitCast");
1239 return nullptr;1249 return nullptr;
test/parsec.zig+22
...@@ -558,4 +558,26 @@ pub fn addCases(cases: &tests.ParseCContext) {...@@ -558,4 +558,26 @@ pub fn addCases(cases: &tests.ParseCContext) {
558 \\ return c_int(a);558 \\ return c_int(a);
559 \\}559 \\}
560 );560 );
561
562 cases.add("implicit cast to void *",
563 \\void *foo(unsigned short *x) {
564 \\ return x;
565 \\}
566 ,
567 \\export fn foo(x: ?&c_ushort) -> ?&c_void {
568 \\ return @ptrCast(?&c_void, x);
569 \\}
570 );
561}571}
572
573
574
575
576// TODO
577//float *ptrcast(int *a) {
578// return (float *)a;
579//}
580// should translate to
581// fn ptrcast(a: ?&c_int) -> ?&f32 {
582// return @ptrCast(?&f32, a);
583// }