translate-c: NULL pointers translate to `null`

See #1967
master
Andrew Kelley 2019-05-08 19:21:54 -04:00
parent 9c12237d2d
commit e3542196c0
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
2 changed files with 15 additions and 16 deletions

View File

@ -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); return trans_c_cast(c, bitcast(stmt->getBeginLoc()), dest_type, src_type, target_node);
} }
case ZigClangCK_NullToPointer: case ZigClangCK_NullToPointer:
return trans_create_node_unsigned(c, 0); return trans_create_node(c, NodeTypeNullLiteral);
case ZigClangCK_NoOp: case ZigClangCK_NoOp:
return trans_expr(c, ResultUsedYes, scope, bitcast(stmt->getSubExpr()), TransRValue); return trans_expr(c, ResultUsedYes, scope, bitcast(stmt->getSubExpr()), TransRValue);
case ZigClangCK_Dependent: 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)); return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq, trans_create_node_unsigned_negative(c, 0, false));
case clang::BuiltinType::NullPtr: case clang::BuiltinType::NullPtr:
return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq, 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::Void:
case clang::BuiltinType::Half: case clang::BuiltinType::Half:
@ -2818,8 +2818,7 @@ static AstNode *trans_bool_expr(Context *c, ResultUsed result_used, TransScope *
break; break;
} }
case ZigClangType_Pointer: case ZigClangType_Pointer:
return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq, return trans_create_node_bin_op(c, res, BinOpTypeCmpNotEq, trans_create_node(c, NodeTypeNullLiteral));
trans_create_node_unsigned(c, 0));
case ZigClangType_Typedef: case ZigClangType_Typedef:
{ {

View File

@ -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 { \\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 ((a != 0) and (b != 0)) return 0;
\\ if ((b != 0) and (c != 0)) return 1; \\ if ((b != 0) and (c != null)) return 1;
\\ if ((a != 0) and (c != 0)) return 2; \\ if ((a != 0) and (c != null)) return 2;
\\ if ((a != 0) or (b != 0)) return 3; \\ if ((a != 0) or (b != 0)) return 3;
\\ if ((b != 0) or (c != 0)) return 4; \\ if ((b != 0) or (c != null)) return 4;
\\ if ((a != 0) or (c != 0)) return 5; \\ if ((a != 0) or (c != null)) return 5;
\\ return 6; \\ return 6;
\\} \\}
); );
@ -832,7 +832,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\} \\}
, ,
\\pub export fn foo() [*c]c_int { \\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 !(a != 0); \\ return !(a != 0);
\\ return !(b != 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 { \\pub fn if_none_bool(a: c_int, b: f32, c: ?*c_void, d: enum_SomeEnum) c_int {
\\ if (a != 0) return 0; \\ if (a != 0) return 0;
\\ if (b != 0) return 1; \\ 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; \\ if (d != @bitCast(enum_SomeEnum, @TagType(enum_SomeEnum)(0))) return 3;
\\ return 4; \\ 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 { \\pub fn while_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
\\ while (a != 0) return 0; \\ while (a != 0) return 0;
\\ while (b != 0) return 1; \\ while (b != 0) return 1;
\\ while (c != 0) return 2; \\ while (c != null) return 2;
\\ return 3; \\ 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 { \\pub fn for_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
\\ while (a != 0) return 0; \\ while (a != 0) return 0;
\\ while (b != 0) return 1; \\ while (b != 0) return 1;
\\ while (c != 0) return 2; \\ while (c != null) return 2;
\\ return 3; \\ return 3;
\\} \\}
); );