parse-c: support implicit cast to void *

This commit is contained in:
Andrew Kelley 2017-09-21 02:31:52 -04:00
parent 2655cf1bf7
commit c01ae69cdb
2 changed files with 35 additions and 3 deletions

View File

@ -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;

View File

@ -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);
// }