From c01ae69cdbb84a3c154df635afd01675a6a7a616 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 21 Sep 2017 02:31:52 -0400 Subject: [PATCH] parse-c: support implicit cast to void * --- src/parsec.cpp | 16 +++++++++++++--- test/parsec.zig | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/parsec.cpp b/src/parsec.cpp index 88afc8b0e..30d256ecc 100644 --- a/src/parsec.cpp +++ b/src/parsec.cpp @@ -1228,12 +1228,22 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas return nullptr; return target_node; } + case CK_BitCast: + { + AstNode *target_node = trans_expr(c, true, block, stmt->getSubExpr(), TransRValue); + if (target_node == nullptr) + return nullptr; + + AstNode *dest_type_node = trans_qual_type(c, stmt->getType(), stmt->getLocStart()); + + AstNode *node = trans_create_node_builtin_fn_call_str(c, "ptrCast"); + node->data.fn_call_expr.params.append(dest_type_node); + node->data.fn_call_expr.params.append(target_node); + return node; + } case CK_Dependent: emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_Dependent"); return nullptr; - case CK_BitCast: - emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_BitCast"); - return nullptr; case CK_LValueBitCast: emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_LValueBitCast"); return nullptr; diff --git a/test/parsec.zig b/test/parsec.zig index 725fc47ab..77a63a879 100644 --- a/test/parsec.zig +++ b/test/parsec.zig @@ -558,4 +558,26 @@ pub fn addCases(cases: &tests.ParseCContext) { \\ return c_int(a); \\} ); + + cases.add("implicit cast to void *", + \\void *foo(unsigned short *x) { + \\ return x; + \\} + , + \\export fn foo(x: ?&c_ushort) -> ?&c_void { + \\ return @ptrCast(?&c_void, x); + \\} + ); } + + + + +// TODO +//float *ptrcast(int *a) { +// return (float *)a; +//} +// should translate to +// fn ptrcast(a: ?&c_int) -> ?&f32 { +// return @ptrCast(?&f32, a); +// }