Commit e3542196c0

Andrew Kelley <andrew@ziglang.org>
2019-05-09 01:21:54
translate-c: NULL pointers translate to `null`
See #1967
1 parent 9c12237
Changed files (2)
src/translate_c.cpp
@@ -1914,7 +1914,7 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra
                 return trans_c_cast(c, bitcast(stmt->getBeginLoc()), dest_type, src_type, target_node);
             }
         case ZigClangCK_NullToPointer:
-            return trans_create_node_unsigned(c, 0);
+            return trans_create_node(c, NodeTypeNullLiteral);
         case ZigClangCK_NoOp:
             return trans_expr(c, ResultUsedYes, scope, bitcast(stmt->getSubExpr()), TransRValue);
         case ZigClangCK_Dependent:
@@ -2721,7 +2721,7 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *
                     return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq, trans_create_node_unsigned_negative(c, 0, false));
                 case clang::BuiltinType::NullPtr:
                     return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq,
-                            trans_create_node_unsigned(c, 0));
+                            trans_create_node(c, NodeTypeNullLiteral));
 
                 case clang::BuiltinType::Void:
                 case clang::BuiltinType::Half:
@@ -2818,8 +2818,7 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *
             break;
         }
         case ZigClangType_Pointer:
-            return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq,
-                    trans_create_node_unsigned(c, 0));
+            return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq, trans_create_node(c, NodeTypeNullLiteral));
 
         case ZigClangType_Typedef:
         {
test/translate_c.zig
@@ -72,7 +72,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         \\    _ = c"void foo(void)";
         \\}
     );
-    
+
     cases.add("ignore result",
         \\void foo() {
         \\    int a;
@@ -648,11 +648,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
     ,
         \\pub export fn and_or_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
         \\    if ((a != 0) and (b != 0)) return 0;
-        \\    if ((b != 0) and (c != 0)) return 1;
-        \\    if ((a != 0) and (c != 0)) return 2;
+        \\    if ((b != 0) and (c != null)) return 1;
+        \\    if ((a != 0) and (c != null)) return 2;
         \\    if ((a != 0) or (b != 0)) return 3;
-        \\    if ((b != 0) or (c != 0)) return 4;
-        \\    if ((a != 0) or (c != 0)) return 5;
+        \\    if ((b != 0) or (c != null)) return 4;
+        \\    if ((a != 0) or (c != null)) return 5;
         \\    return 6;
         \\}
     );
@@ -832,7 +832,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         \\}
     ,
         \\pub export fn foo() [*c]c_int {
-        \\    return 0;
+        \\    return null;
         \\}
     );
 
@@ -1360,7 +1360,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         \\    return !(a == 0);
         \\    return !(a != 0);
         \\    return !(b != 0);
-        \\    return !(c != 0);
+        \\    return !(c != null);
         \\}
     );
 
@@ -1417,7 +1417,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         \\pub fn if_none_bool(a: c_int, b: f32, c: ?*c_void, d: enum_SomeEnum) c_int {
         \\    if (a != 0) return 0;
         \\    if (b != 0) return 1;
-        \\    if (c != 0) return 2;
+        \\    if (c != null) return 2;
         \\    if (d != @bitCast(enum_SomeEnum, @TagType(enum_SomeEnum)(0))) return 3;
         \\    return 4;
         \\}
@@ -1434,7 +1434,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         \\pub fn while_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
         \\    while (a != 0) return 0;
         \\    while (b != 0) return 1;
-        \\    while (c != 0) return 2;
+        \\    while (c != null) return 2;
         \\    return 3;
         \\}
     );
@@ -1450,7 +1450,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         \\pub fn for_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
         \\    while (a != 0) return 0;
         \\    while (b != 0) return 1;
-        \\    while (c != 0) return 2;
+        \\    while (c != null) return 2;
         \\    return 3;
         \\}
     );
@@ -1581,7 +1581,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         \\    fn_int(&fn_int);
         \\    fn_ptr(42);
         \\}
-        ,
+    ,
         \\pub extern fn fn_int(x: c_int) void;
         \\pub extern fn fn_f32(x: f32) void;
         \\pub extern fn fn_f64(x: f64) void;
@@ -1624,7 +1624,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
         \\        long long *to_longlong = p;
         \\    }
         \\}
-        ,
+    ,
         \\pub export fn test_ptr_cast() void {
         \\    var p: ?*c_void = undefined;
         \\    {