authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-08 19:21:54-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-08 19:21:54-04:00
loge3542196c0b0121fb52d9af599b549cf490e47a8
tree52cf53f210e547b5e96f441a80fe5be8bd8d034e
parent9c12237d2d0643fcf34ad6d027ce78d285e40271
signaturelock-open Commit is signed but in an unrecognized format.

translate-c: NULL pointers translate to `null`

See #1967

2 files changed, 15 insertions(+), 16 deletions(-)

src/translate_c.cpp+3-4
...@@ -1914,7 +1914,7 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra...@@ -1914,7 +1914,7 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra
1914 return trans_c_cast(c, bitcast(stmt->getBeginLoc()), dest_type, src_type, target_node);1914 return trans_c_cast(c, bitcast(stmt->getBeginLoc()), dest_type, src_type, target_node);
1915 }1915 }
1916 case ZigClangCK_NullToPointer:1916 case ZigClangCK_NullToPointer:
1917 return trans_create_node_unsigned(c, 0);1917 return trans_create_node(c, NodeTypeNullLiteral);
1918 case ZigClangCK_NoOp:1918 case ZigClangCK_NoOp:
1919 return trans_expr(c, ResultUsedYes, scope, bitcast(stmt->getSubExpr()), TransRValue);1919 return trans_expr(c, ResultUsedYes, scope, bitcast(stmt->getSubExpr()), TransRValue);
1920 case ZigClangCK_Dependent:1920 case ZigClangCK_Dependent:
...@@ -2721,7 +2721,7 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *...@@ -2721,7 +2721,7 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *
2721 return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq, trans_create_node_unsigned_negative(c, 0, false));2721 return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq, trans_create_node_unsigned_negative(c, 0, false));
2722 case clang::BuiltinType::NullPtr:2722 case clang::BuiltinType::NullPtr:
2723 return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq,2723 return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq,
2724 trans_create_node_unsigned(c, 0));2724 trans_create_node(c, NodeTypeNullLiteral));
27252725
2726 case clang::BuiltinType::Void:2726 case clang::BuiltinType::Void:
2727 case clang::BuiltinType::Half:2727 case clang::BuiltinType::Half:
...@@ -2818,8 +2818,7 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *...@@ -2818,8 +2818,7 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *
2818 break;2818 break;
2819 }2819 }
2820 case ZigClangType_Pointer:2820 case ZigClangType_Pointer:
2821 return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq,2821 return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq, trans_create_node(c, NodeTypeNullLiteral));
2822 trans_create_node_unsigned(c, 0));
28232822
2824 case ZigClangType_Typedef:2823 case ZigClangType_Typedef:
2825 {2824 {
test/translate_c.zig+12-12
...@@ -72,7 +72,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -72,7 +72,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
72 \\ _ = c"void foo(void)";72 \\ _ = c"void foo(void)";
73 \\}73 \\}
74 );74 );
75 75
76 cases.add("ignore result",76 cases.add("ignore result",
77 \\void foo() {77 \\void foo() {
78 \\ int a;78 \\ int a;
...@@ -648,11 +648,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -648,11 +648,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
648 ,648 ,
649 \\pub export fn and_or_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {649 \\pub export fn and_or_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
650 \\ if ((a != 0) and (b != 0)) return 0;650 \\ if ((a != 0) and (b != 0)) return 0;
651 \\ if ((b != 0) and (c != 0)) return 1;651 \\ if ((b != 0) and (c != null)) return 1;
652 \\ if ((a != 0) and (c != 0)) return 2;652 \\ if ((a != 0) and (c != null)) return 2;
653 \\ if ((a != 0) or (b != 0)) return 3;653 \\ if ((a != 0) or (b != 0)) return 3;
654 \\ if ((b != 0) or (c != 0)) return 4;654 \\ if ((b != 0) or (c != null)) return 4;
655 \\ if ((a != 0) or (c != 0)) return 5;655 \\ if ((a != 0) or (c != null)) return 5;
656 \\ return 6;656 \\ return 6;
657 \\}657 \\}
658 );658 );
...@@ -832,7 +832,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -832,7 +832,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
832 \\}832 \\}
833 ,833 ,
834 \\pub export fn foo() [*c]c_int {834 \\pub export fn foo() [*c]c_int {
835 \\ return 0;835 \\ return null;
836 \\}836 \\}
837 );837 );
838838
...@@ -1360,7 +1360,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1360,7 +1360,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1360 \\ return !(a == 0);1360 \\ return !(a == 0);
1361 \\ return !(a != 0);1361 \\ return !(a != 0);
1362 \\ return !(b != 0);1362 \\ return !(b != 0);
1363 \\ return !(c != 0);1363 \\ return !(c != null);
1364 \\}1364 \\}
1365 );1365 );
13661366
...@@ -1417,7 +1417,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1417,7 +1417,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1417 \\pub fn if_none_bool(a: c_int, b: f32, c: ?*c_void, d: enum_SomeEnum) c_int {1417 \\pub fn if_none_bool(a: c_int, b: f32, c: ?*c_void, d: enum_SomeEnum) c_int {
1418 \\ if (a != 0) return 0;1418 \\ if (a != 0) return 0;
1419 \\ if (b != 0) return 1;1419 \\ if (b != 0) return 1;
1420 \\ if (c != 0) return 2;1420 \\ if (c != null) return 2;
1421 \\ if (d != @bitCast(enum_SomeEnum, @TagType(enum_SomeEnum)(0))) return 3;1421 \\ if (d != @bitCast(enum_SomeEnum, @TagType(enum_SomeEnum)(0))) return 3;
1422 \\ return 4;1422 \\ return 4;
1423 \\}1423 \\}
...@@ -1434,7 +1434,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1434,7 +1434,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1434 \\pub fn while_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {1434 \\pub fn while_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
1435 \\ while (a != 0) return 0;1435 \\ while (a != 0) return 0;
1436 \\ while (b != 0) return 1;1436 \\ while (b != 0) return 1;
1437 \\ while (c != 0) return 2;1437 \\ while (c != null) return 2;
1438 \\ return 3;1438 \\ return 3;
1439 \\}1439 \\}
1440 );1440 );
...@@ -1450,7 +1450,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1450,7 +1450,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1450 \\pub fn for_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {1450 \\pub fn for_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
1451 \\ while (a != 0) return 0;1451 \\ while (a != 0) return 0;
1452 \\ while (b != 0) return 1;1452 \\ while (b != 0) return 1;
1453 \\ while (c != 0) return 2;1453 \\ while (c != null) return 2;
1454 \\ return 3;1454 \\ return 3;
1455 \\}1455 \\}
1456 );1456 );
...@@ -1581,7 +1581,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1581,7 +1581,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1581 \\ fn_int(&fn_int);1581 \\ fn_int(&fn_int);
1582 \\ fn_ptr(42);1582 \\ fn_ptr(42);
1583 \\}1583 \\}
1584 ,1584 ,
1585 \\pub extern fn fn_int(x: c_int) void;1585 \\pub extern fn fn_int(x: c_int) void;
1586 \\pub extern fn fn_f32(x: f32) void;1586 \\pub extern fn fn_f32(x: f32) void;
1587 \\pub extern fn fn_f64(x: f64) void;1587 \\pub extern fn fn_f64(x: f64) void;
...@@ -1624,7 +1624,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1624,7 +1624,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1624 \\ long long *to_longlong = p;1624 \\ long long *to_longlong = p;
1625 \\ }1625 \\ }
1626 \\}1626 \\}
1627 ,1627 ,
1628 \\pub export fn test_ptr_cast() void {1628 \\pub export fn test_ptr_cast() void {
1629 \\ var p: ?*c_void = undefined;1629 \\ var p: ?*c_void = undefined;
1630 \\ {1630 \\ {