Commit c01ae69cdb

Andrew Kelley <superjoe30@gmail.com>
2017-09-21 08:31:52
parse-c: support implicit cast to void *
1 parent 2655cf1
Changed files (2)
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;
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);
+// }