diff --git a/src/translate_c.cpp b/src/translate_c.cpp index 2389f55cb..eefdf7e26 100644 --- a/src/translate_c.cpp +++ b/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: { diff --git a/test/translate_c.zig b/test/translate_c.zig index 7339130b8..21b33e69d 100644 --- a/test/translate_c.zig +++ b/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; \\ {