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
12281228 return nullptr;
12291229 return target_node;
12301230 }
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 }
12311244 case CK_Dependent:
12321245 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_Dependent");
12331246 return nullptr;
1234 case CK_BitCast:
1235 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_BitCast");
1236 return nullptr;
12371247 case CK_LValueBitCast:
12381248 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_LValueBitCast");
12391249 return nullptr;
test/parsec.zig+22
......@@ -558,4 +558,26 @@ pub fn addCases(cases: &tests.ParseCContext) {
558558 \\ return c_int(a);
559559 \\}
560560 );
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 );
561571}
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// }