authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-08 13:37:02-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-01-08 13:37:02-05:00
log0ebb07f95d4658f6ac54b381a049ab0ad79442ab
tree5bd96344ad07f337ecaf569d99ae4434508e31b5
parent2a5c622e65a07db95859beabf46f36d3a62c785a
parent6a72eb1541ad0c131a664a0832afb7b2bd406198
signature Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #4101 from LemonBoy/moremerwio

More translate-c fixes

6 files changed, 230 insertions(+), 52 deletions(-)

src-self-hosted/clang.zig+13-5
...@@ -1,5 +1,8 @@...@@ -1,5 +1,8 @@
1const builtin = @import("builtin");1const builtin = @import("builtin");
22
3pub const struct_ZigClangConditionalOperator = @OpaqueType();
4pub const struct_ZigClangBinaryConditionalOperator = @OpaqueType();
5pub const struct_ZigClangAbstractConditionalOperator = @OpaqueType();
3pub const struct_ZigClangAPInt = @OpaqueType();6pub const struct_ZigClangAPInt = @OpaqueType();
4pub const struct_ZigClangAPSInt = @OpaqueType();7pub const struct_ZigClangAPSInt = @OpaqueType();
5pub const struct_ZigClangAPFloat = @OpaqueType();8pub const struct_ZigClangAPFloat = @OpaqueType();
...@@ -16,7 +19,6 @@ pub const struct_ZigClangCallExpr = @OpaqueType();...@@ -16,7 +19,6 @@ pub const struct_ZigClangCallExpr = @OpaqueType();
16pub const struct_ZigClangCaseStmt = @OpaqueType();19pub const struct_ZigClangCaseStmt = @OpaqueType();
17pub const struct_ZigClangCompoundAssignOperator = @OpaqueType();20pub const struct_ZigClangCompoundAssignOperator = @OpaqueType();
18pub const struct_ZigClangCompoundStmt = @OpaqueType();21pub const struct_ZigClangCompoundStmt = @OpaqueType();
19pub const struct_ZigClangConditionalOperator = @OpaqueType();
20pub const struct_ZigClangConstantArrayType = @OpaqueType();22pub const struct_ZigClangConstantArrayType = @OpaqueType();
21pub const struct_ZigClangContinueStmt = @OpaqueType();23pub const struct_ZigClangContinueStmt = @OpaqueType();
22pub const struct_ZigClangDecayedType = @OpaqueType();24pub const struct_ZigClangDecayedType = @OpaqueType();
...@@ -48,6 +50,7 @@ pub const struct_ZigClangMacroQualifiedType = @OpaqueType();...@@ -48,6 +50,7 @@ pub const struct_ZigClangMacroQualifiedType = @OpaqueType();
48pub const struct_ZigClangMemberExpr = @OpaqueType();50pub const struct_ZigClangMemberExpr = @OpaqueType();
49pub const struct_ZigClangNamedDecl = @OpaqueType();51pub const struct_ZigClangNamedDecl = @OpaqueType();
50pub const struct_ZigClangNone = @OpaqueType();52pub const struct_ZigClangNone = @OpaqueType();
53pub const struct_ZigClangOpaqueValueExpr = @OpaqueType();
51pub const struct_ZigClangPCHContainerOperations = @OpaqueType();54pub const struct_ZigClangPCHContainerOperations = @OpaqueType();
52pub const struct_ZigClangParenExpr = @OpaqueType();55pub const struct_ZigClangParenExpr = @OpaqueType();
53pub const struct_ZigClangParenType = @OpaqueType();56pub const struct_ZigClangParenType = @OpaqueType();
...@@ -860,6 +863,9 @@ pub extern fn ZigClangFunctionProtoType_getReturnType(self: *const ZigClangFunct...@@ -860,6 +863,9 @@ pub extern fn ZigClangFunctionProtoType_getReturnType(self: *const ZigClangFunct
860863
861pub const ZigClangSourceLocation = struct_ZigClangSourceLocation;864pub const ZigClangSourceLocation = struct_ZigClangSourceLocation;
862pub const ZigClangQualType = struct_ZigClangQualType;865pub const ZigClangQualType = struct_ZigClangQualType;
866pub const ZigClangConditionalOperator = struct_ZigClangConditionalOperator;
867pub const ZigClangBinaryConditionalOperator = struct_ZigClangBinaryConditionalOperator;
868pub const ZigClangAbstractConditionalOperator = struct_ZigClangAbstractConditionalOperator;
863pub const ZigClangAPValueLValueBase = struct_ZigClangAPValueLValueBase;869pub const ZigClangAPValueLValueBase = struct_ZigClangAPValueLValueBase;
864pub const ZigClangAPValue = struct_ZigClangAPValue;870pub const ZigClangAPValue = struct_ZigClangAPValue;
865pub const ZigClangAPSInt = struct_ZigClangAPSInt;871pub const ZigClangAPSInt = struct_ZigClangAPSInt;
...@@ -877,7 +883,6 @@ pub const ZigClangCallExpr = struct_ZigClangCallExpr;...@@ -877,7 +883,6 @@ pub const ZigClangCallExpr = struct_ZigClangCallExpr;
877pub const ZigClangCaseStmt = struct_ZigClangCaseStmt;883pub const ZigClangCaseStmt = struct_ZigClangCaseStmt;
878pub const ZigClangCompoundAssignOperator = struct_ZigClangCompoundAssignOperator;884pub const ZigClangCompoundAssignOperator = struct_ZigClangCompoundAssignOperator;
879pub const ZigClangCompoundStmt = struct_ZigClangCompoundStmt;885pub const ZigClangCompoundStmt = struct_ZigClangCompoundStmt;
880pub const ZigClangConditionalOperator = struct_ZigClangConditionalOperator;
881pub const ZigClangConstantArrayType = struct_ZigClangConstantArrayType;886pub const ZigClangConstantArrayType = struct_ZigClangConstantArrayType;
882pub const ZigClangContinueStmt = struct_ZigClangContinueStmt;887pub const ZigClangContinueStmt = struct_ZigClangContinueStmt;
883pub const ZigClangDecayedType = struct_ZigClangDecayedType;888pub const ZigClangDecayedType = struct_ZigClangDecayedType;
...@@ -909,6 +914,7 @@ pub const ZigClangMacroQualifiedType = struct_ZigClangMacroQualifiedType;...@@ -909,6 +914,7 @@ pub const ZigClangMacroQualifiedType = struct_ZigClangMacroQualifiedType;
909pub const ZigClangMemberExpr = struct_ZigClangMemberExpr;914pub const ZigClangMemberExpr = struct_ZigClangMemberExpr;
910pub const ZigClangNamedDecl = struct_ZigClangNamedDecl;915pub const ZigClangNamedDecl = struct_ZigClangNamedDecl;
911pub const ZigClangNone = struct_ZigClangNone;916pub const ZigClangNone = struct_ZigClangNone;
917pub const ZigClangOpaqueValueExpr = struct_ZigClangOpaqueValueExpr;
912pub const ZigClangPCHContainerOperations = struct_ZigClangPCHContainerOperations;918pub const ZigClangPCHContainerOperations = struct_ZigClangPCHContainerOperations;
913pub const ZigClangParenExpr = struct_ZigClangParenExpr;919pub const ZigClangParenExpr = struct_ZigClangParenExpr;
914pub const ZigClangParenType = struct_ZigClangParenType;920pub const ZigClangParenType = struct_ZigClangParenType;
...@@ -1095,9 +1101,9 @@ pub extern fn ZigClangForStmt_getBody(*const ZigClangForStmt) *const ZigClangStm...@@ -1095,9 +1101,9 @@ pub extern fn ZigClangForStmt_getBody(*const ZigClangForStmt) *const ZigClangStm
1095pub extern fn ZigClangAPFloat_toString(self: *const ZigClangAPFloat, precision: c_uint, maxPadding: c_uint, truncateZero: bool) [*:0]const u8;1101pub extern fn ZigClangAPFloat_toString(self: *const ZigClangAPFloat, precision: c_uint, maxPadding: c_uint, truncateZero: bool) [*:0]const u8;
1096pub extern fn ZigClangAPFloat_getValueAsApproximateDouble(*const ZigClangFloatingLiteral) f64;1102pub extern fn ZigClangAPFloat_getValueAsApproximateDouble(*const ZigClangFloatingLiteral) f64;
10971103
1098pub extern fn ZigClangConditionalOperator_getCond(*const ZigClangConditionalOperator) *const ZigClangExpr;1104pub extern fn ZigClangAbstractConditionalOperator_getCond(*const ZigClangAbstractConditionalOperator) *const ZigClangExpr;
1099pub extern fn ZigClangConditionalOperator_getTrueExpr(*const ZigClangConditionalOperator) *const ZigClangExpr;1105pub extern fn ZigClangAbstractConditionalOperator_getTrueExpr(*const ZigClangAbstractConditionalOperator) *const ZigClangExpr;
1100pub extern fn ZigClangConditionalOperator_getFalseExpr(*const ZigClangConditionalOperator) *const ZigClangExpr;1106pub extern fn ZigClangAbstractConditionalOperator_getFalseExpr(*const ZigClangAbstractConditionalOperator) *const ZigClangExpr;
11011107
1102pub extern fn ZigClangSwitchStmt_getConditionVariableDeclStmt(*const ZigClangSwitchStmt) ?*const ZigClangDeclStmt;1108pub extern fn ZigClangSwitchStmt_getConditionVariableDeclStmt(*const ZigClangSwitchStmt) ?*const ZigClangDeclStmt;
1103pub extern fn ZigClangSwitchStmt_getCond(*const ZigClangSwitchStmt) *const ZigClangExpr;1109pub extern fn ZigClangSwitchStmt_getCond(*const ZigClangSwitchStmt) *const ZigClangExpr;
...@@ -1140,6 +1146,8 @@ pub extern fn ZigClangUnaryOperator_getType(*const ZigClangUnaryOperator) ZigCla...@@ -1140,6 +1146,8 @@ pub extern fn ZigClangUnaryOperator_getType(*const ZigClangUnaryOperator) ZigCla
1140pub extern fn ZigClangUnaryOperator_getSubExpr(*const ZigClangUnaryOperator) *const ZigClangExpr;1146pub extern fn ZigClangUnaryOperator_getSubExpr(*const ZigClangUnaryOperator) *const ZigClangExpr;
1141pub extern fn ZigClangUnaryOperator_getBeginLoc(*const ZigClangUnaryOperator) ZigClangSourceLocation;1147pub extern fn ZigClangUnaryOperator_getBeginLoc(*const ZigClangUnaryOperator) ZigClangSourceLocation;
11421148
1149pub extern fn ZigClangOpaqueValueExpr_getSourceExpr(*const ZigClangOpaqueValueExpr) ?*const ZigClangExpr;
1150
1143pub extern fn ZigClangCompoundAssignOperator_getType(*const ZigClangCompoundAssignOperator) ZigClangQualType;1151pub extern fn ZigClangCompoundAssignOperator_getType(*const ZigClangCompoundAssignOperator) ZigClangQualType;
1144pub extern fn ZigClangCompoundAssignOperator_getComputationLHSType(*const ZigClangCompoundAssignOperator) ZigClangQualType;1152pub extern fn ZigClangCompoundAssignOperator_getComputationLHSType(*const ZigClangCompoundAssignOperator) ZigClangQualType;
1145pub extern fn ZigClangCompoundAssignOperator_getComputationResultType(*const ZigClangCompoundAssignOperator) ZigClangQualType;1153pub extern fn ZigClangCompoundAssignOperator_getComputationResultType(*const ZigClangCompoundAssignOperator) ZigClangQualType;
src-self-hosted/translate_c.zig+157-32
...@@ -363,7 +363,7 @@ fn prepopulateGlobalNameTable(ast_unit: *ZigClangASTUnit, c: *Context) !void {...@@ -363,7 +363,7 @@ fn prepopulateGlobalNameTable(ast_unit: *ZigClangASTUnit, c: *Context) !void {
363 }363 }
364}364}
365365
366extern fn declVisitorNamesOnlyC(context: ?*c_void, decl: *const ZigClangDecl) bool {366fn declVisitorNamesOnlyC(context: ?*c_void, decl: *const ZigClangDecl) callconv(.C) bool {
367 const c = @ptrCast(*Context, @alignCast(@alignOf(Context), context));367 const c = @ptrCast(*Context, @alignCast(@alignOf(Context), context));
368 declVisitorNamesOnly(c, decl) catch |err| {368 declVisitorNamesOnly(c, decl) catch |err| {
369 c.err = err;369 c.err = err;
...@@ -372,7 +372,7 @@ extern fn declVisitorNamesOnlyC(context: ?*c_void, decl: *const ZigClangDecl) bo...@@ -372,7 +372,7 @@ extern fn declVisitorNamesOnlyC(context: ?*c_void, decl: *const ZigClangDecl) bo
372 return true;372 return true;
373}373}
374374
375extern fn declVisitorC(context: ?*c_void, decl: *const ZigClangDecl) bool {375fn declVisitorC(context: ?*c_void, decl: *const ZigClangDecl) callconv(.C) bool {
376 const c = @ptrCast(*Context, @alignCast(@alignOf(Context), context));376 const c = @ptrCast(*Context, @alignCast(@alignOf(Context), context));
377 declVisitor(c, decl) catch |err| {377 declVisitor(c, decl) catch |err| {
378 c.err = err;378 c.err = err;
...@@ -1010,7 +1010,12 @@ fn transStmt(...@@ -1010,7 +1010,12 @@ fn transStmt(
1010 .BreakStmtClass => return transBreak(rp, scope),1010 .BreakStmtClass => return transBreak(rp, scope),
1011 .ForStmtClass => return transForLoop(rp, scope, @ptrCast(*const ZigClangForStmt, stmt)),1011 .ForStmtClass => return transForLoop(rp, scope, @ptrCast(*const ZigClangForStmt, stmt)),
1012 .FloatingLiteralClass => return transFloatingLiteral(rp, scope, @ptrCast(*const ZigClangFloatingLiteral, stmt), result_used),1012 .FloatingLiteralClass => return transFloatingLiteral(rp, scope, @ptrCast(*const ZigClangFloatingLiteral, stmt), result_used),
1013 .ConditionalOperatorClass => return transConditionalOperator(rp, scope, @ptrCast(*const ZigClangConditionalOperator, stmt), result_used),1013 .ConditionalOperatorClass => {
1014 return transConditionalOperator(rp, scope, @ptrCast(*const ZigClangConditionalOperator, stmt), result_used);
1015 },
1016 .BinaryConditionalOperatorClass => {
1017 return transBinaryConditionalOperator(rp, scope, @ptrCast(*const ZigClangBinaryConditionalOperator, stmt), result_used);
1018 },
1014 .SwitchStmtClass => return transSwitch(rp, scope, @ptrCast(*const ZigClangSwitchStmt, stmt)),1019 .SwitchStmtClass => return transSwitch(rp, scope, @ptrCast(*const ZigClangSwitchStmt, stmt)),
1015 .CaseStmtClass => return transCase(rp, scope, @ptrCast(*const ZigClangCaseStmt, stmt)),1020 .CaseStmtClass => return transCase(rp, scope, @ptrCast(*const ZigClangCaseStmt, stmt)),
1016 .DefaultStmtClass => return transDefault(rp, scope, @ptrCast(*const ZigClangDefaultStmt, stmt)),1021 .DefaultStmtClass => return transDefault(rp, scope, @ptrCast(*const ZigClangDefaultStmt, stmt)),
...@@ -1024,6 +1029,18 @@ fn transStmt(...@@ -1024,6 +1029,18 @@ fn transStmt(
1024 .UnaryExprOrTypeTraitExprClass => return transUnaryExprOrTypeTraitExpr(rp, scope, @ptrCast(*const ZigClangUnaryExprOrTypeTraitExpr, stmt), result_used),1029 .UnaryExprOrTypeTraitExprClass => return transUnaryExprOrTypeTraitExpr(rp, scope, @ptrCast(*const ZigClangUnaryExprOrTypeTraitExpr, stmt), result_used),
1025 .UnaryOperatorClass => return transUnaryOperator(rp, scope, @ptrCast(*const ZigClangUnaryOperator, stmt), result_used),1030 .UnaryOperatorClass => return transUnaryOperator(rp, scope, @ptrCast(*const ZigClangUnaryOperator, stmt), result_used),
1026 .CompoundAssignOperatorClass => return transCompoundAssignOperator(rp, scope, @ptrCast(*const ZigClangCompoundAssignOperator, stmt), result_used),1031 .CompoundAssignOperatorClass => return transCompoundAssignOperator(rp, scope, @ptrCast(*const ZigClangCompoundAssignOperator, stmt), result_used),
1032 .OpaqueValueExprClass => {
1033 const source_expr = ZigClangOpaqueValueExpr_getSourceExpr(@ptrCast(*const ZigClangOpaqueValueExpr, stmt)).?;
1034 const expr = try transExpr(rp, scope, source_expr, .used, lrvalue);
1035 if (expr.id == .GroupedExpression) return maybeSuppressResult(rp, scope, result_used, expr);
1036 const node = try rp.c.a().create(ast.Node.GroupedExpression);
1037 node.* = .{
1038 .lparen = try appendToken(rp.c, .LParen, "("),
1039 .expr = expr,
1040 .rparen = try appendToken(rp.c, .RParen, ")"),
1041 };
1042 return maybeSuppressResult(rp, scope, result_used, &node.base);
1043 },
1027 else => {1044 else => {
1028 return revertAndWarn(1045 return revertAndWarn(
1029 rp,1046 rp,
...@@ -1330,28 +1347,27 @@ fn transImplicitCastExpr(...@@ -1330,28 +1347,27 @@ fn transImplicitCastExpr(
1330) TransError!*ast.Node {1347) TransError!*ast.Node {
1331 const c = rp.c;1348 const c = rp.c;
1332 const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr);1349 const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr);
1333 const sub_expr_node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value);
1334 const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr));1350 const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr));
1335 const src_type = getExprQualType(c, sub_expr);1351 const src_type = getExprQualType(c, sub_expr);
1336 switch (ZigClangImplicitCastExpr_getCastKind(expr)) {1352 switch (ZigClangImplicitCastExpr_getCastKind(expr)) {
1337 .BitCast, .FloatingCast, .FloatingToIntegral, .IntegralToFloating, .IntegralCast, .PointerToIntegral, .IntegralToPointer => {1353 .BitCast, .FloatingCast, .FloatingToIntegral, .IntegralToFloating, .IntegralCast, .PointerToIntegral, .IntegralToPointer => {
1354 const sub_expr_node = try transExpr(rp, scope, sub_expr, .used, .r_value);
1338 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);1355 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);
1339 },1356 },
1340 .LValueToRValue, .NoOp, .FunctionToPointerDecay => {1357 .LValueToRValue, .NoOp, .FunctionToPointerDecay => {
1358 const sub_expr_node = try transExpr(rp, scope, sub_expr, .used, .r_value);
1341 return maybeSuppressResult(rp, scope, result_used, sub_expr_node);1359 return maybeSuppressResult(rp, scope, result_used, sub_expr_node);
1342 },1360 },
1343 .ArrayToPointerDecay => {1361 .ArrayToPointerDecay => {
1344 switch (ZigClangExpr_getStmtClass(sub_expr)) {1362 if (exprIsStringLiteral(sub_expr)) {
1345 .StringLiteralClass, .PredefinedExprClass => {1363 const sub_expr_node = try transExpr(rp, scope, sub_expr, .used, .r_value);
1346 return maybeSuppressResult(rp, scope, result_used, sub_expr_node);1364 return maybeSuppressResult(rp, scope, result_used, sub_expr_node);
1347 },
1348 else => {
1349 const prefix_op = try transCreateNodePrefixOp(rp.c, .AddressOf, .Ampersand, "&");
1350 prefix_op.rhs = sub_expr_node;
1351
1352 return maybeSuppressResult(rp, scope, result_used, &prefix_op.base);
1353 },
1354 }1365 }
1366
1367 const prefix_op = try transCreateNodePrefixOp(rp.c, .AddressOf, .Ampersand, "&");
1368 prefix_op.rhs = try transExpr(rp, scope, sub_expr, .used, .r_value);
1369
1370 return maybeSuppressResult(rp, scope, result_used, &prefix_op.base);
1355 },1371 },
1356 .NullToPointer => {1372 .NullToPointer => {
1357 return try transCreateNodeNullLiteral(rp.c);1373 return try transCreateNodeNullLiteral(rp.c);
...@@ -1367,16 +1383,16 @@ fn transImplicitCastExpr(...@@ -1367,16 +1383,16 @@ fn transImplicitCastExpr(
1367 return transCreateNodeInfixOp(rp, scope, &ptr_to_int.base, .BangEqual, op_token, rhs_node, result_used, false);1383 return transCreateNodeInfixOp(rp, scope, &ptr_to_int.base, .BangEqual, op_token, rhs_node, result_used, false);
1368 },1384 },
1369 .IntegralToBoolean => {1385 .IntegralToBoolean => {
1370 const node = try transExpr(rp, scope, sub_expr, .used, .r_value);1386 const sub_expr_node = try transExpr(rp, scope, sub_expr, .used, .r_value);
13711387
1372 // The expression is already a boolean one, return it as-is1388 // The expression is already a boolean one, return it as-is
1373 if (isBoolRes(node))1389 if (isBoolRes(sub_expr_node))
1374 return node;1390 return sub_expr_node;
13751391
1376 // val != 01392 // val != 0
1377 const op_token = try appendToken(rp.c, .BangEqual, "!=");1393 const op_token = try appendToken(rp.c, .BangEqual, "!=");
1378 const rhs_node = try transCreateNodeInt(rp.c, 0);1394 const rhs_node = try transCreateNodeInt(rp.c, 0);
1379 return transCreateNodeInfixOp(rp, scope, node, .BangEqual, op_token, rhs_node, result_used, false);1395 return transCreateNodeInfixOp(rp, scope, sub_expr_node, .BangEqual, op_token, rhs_node, result_used, false);
1380 },1396 },
1381 else => |kind| return revertAndWarn(1397 else => |kind| return revertAndWarn(
1382 rp,1398 rp,
...@@ -1412,7 +1428,7 @@ fn transBoolExpr(...@@ -1412,7 +1428,7 @@ fn transBoolExpr(
1412 return res;1428 return res;
1413 }1429 }
14141430
1415 const ty = ZigClangQualType_getTypePtr(getExprQualTypeBeforeImplicitCast(rp.c, expr));1431 const ty = ZigClangQualType_getTypePtr(getExprQualType(rp.c, expr));
1416 const node = try finishBoolExpr(rp, scope, ZigClangExpr_getBeginLoc(expr), ty, res, used);1432 const node = try finishBoolExpr(rp, scope, ZigClangExpr_getBeginLoc(expr), ty, res, used);
14171433
1418 if (grouped) {1434 if (grouped) {
...@@ -1433,6 +1449,18 @@ fn exprIsBooleanType(expr: *const ZigClangExpr) bool {...@@ -1433,6 +1449,18 @@ fn exprIsBooleanType(expr: *const ZigClangExpr) bool {
1433 return qualTypeIsBoolean(ZigClangExpr_getType(expr));1449 return qualTypeIsBoolean(ZigClangExpr_getType(expr));
1434}1450}
14351451
1452fn exprIsStringLiteral(expr: *const ZigClangExpr) bool {
1453 switch (ZigClangExpr_getStmtClass(expr)) {
1454 .StringLiteralClass => return true,
1455 .PredefinedExprClass => return true,
1456 .UnaryOperatorClass => {
1457 const op_expr = ZigClangUnaryOperator_getSubExpr(@ptrCast(*const ZigClangUnaryOperator, expr));
1458 return exprIsStringLiteral(op_expr);
1459 },
1460 else => return false,
1461 }
1462}
1463
1436fn isBoolRes(res: *ast.Node) bool {1464fn isBoolRes(res: *ast.Node) bool {
1437 switch (res.id) {1465 switch (res.id) {
1438 .InfixOp => switch (@fieldParentPtr(ast.Node.InfixOp, "base", res).op) {1466 .InfixOp => switch (@fieldParentPtr(ast.Node.InfixOp, "base", res).op) {
...@@ -1765,10 +1793,34 @@ fn transCCast(...@@ -1765,10 +1793,34 @@ fn transCCast(
1765 if (ZigClangType_isBooleanType(qualTypeCanon(src_type)) and1793 if (ZigClangType_isBooleanType(qualTypeCanon(src_type)) and
1766 !ZigClangType_isBooleanType(qualTypeCanon(dst_type)))1794 !ZigClangType_isBooleanType(qualTypeCanon(dst_type)))
1767 {1795 {
1796 // @boolToInt returns either a comptime_int or a u1
1768 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt");1797 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt");
1769 try builtin_node.params.push(expr);1798 try builtin_node.params.push(expr);
1770 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");1799 builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1771 return &builtin_node.base;1800
1801 const inner_cast_node = try transCreateNodeBuiltinFnCall(rp.c, "@intCast");
1802 try inner_cast_node.params.push(try transCreateNodeIdentifier(rp.c, "u1"));
1803 _ = try appendToken(rp.c, .Comma, ",");
1804 try inner_cast_node.params.push(&builtin_node.base);
1805 inner_cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1806
1807 const cast_node = try transCreateNodeBuiltinFnCall(rp.c, "@intCast");
1808 try cast_node.params.push(try transQualType(rp, dst_type, loc));
1809 _ = try appendToken(rp.c, .Comma, ",");
1810
1811 if (cIsSignedInteger(dst_type)) {
1812 const bitcast_node = try transCreateNodeBuiltinFnCall(rp.c, "@bitCast");
1813 try bitcast_node.params.push(try transCreateNodeIdentifier(rp.c, "i1"));
1814 _ = try appendToken(rp.c, .Comma, ",");
1815 try bitcast_node.params.push(&inner_cast_node.base);
1816 bitcast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1817 try cast_node.params.push(&bitcast_node.base);
1818 } else {
1819 try cast_node.params.push(&inner_cast_node.base);
1820 }
1821 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1822
1823 return &cast_node.base;
1772 }1824 }
1773 if (ZigClangQualType_getTypeClass(ZigClangQualType_getCanonicalType(dst_type)) == .Enum) {1825 if (ZigClangQualType_getTypeClass(ZigClangQualType_getCanonicalType(dst_type)) == .Enum) {
1774 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@intToEnum");1826 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@intToEnum");
...@@ -2367,7 +2419,29 @@ fn transConstantExpr(rp: RestorePoint, scope: *Scope, expr: *const ZigClangExpr,...@@ -2367,7 +2419,29 @@ fn transConstantExpr(rp: RestorePoint, scope: *Scope, expr: *const ZigClangExpr,
2367 var result: ZigClangExprEvalResult = undefined;2419 var result: ZigClangExprEvalResult = undefined;
2368 if (!ZigClangExpr_EvaluateAsConstantExpr(expr, &result, .EvaluateForCodeGen, rp.c.clang_context))2420 if (!ZigClangExpr_EvaluateAsConstantExpr(expr, &result, .EvaluateForCodeGen, rp.c.clang_context))
2369 return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangExpr_getBeginLoc(expr), "invalid constant expression", .{});2421 return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangExpr_getBeginLoc(expr), "invalid constant expression", .{});
2370 return maybeSuppressResult(rp, scope, used, try transCreateNodeAPInt(rp.c, ZigClangAPValue_getInt(&result.Val)));2422
2423 var val_node: ?*ast.Node = null;
2424 switch (ZigClangAPValue_getKind(&result.Val)) {
2425 .Int => {
2426 // See comment in `transIntegerLiteral` for why this code is here.
2427 // @as(T, x)
2428 const expr_base = @ptrCast(*const ZigClangExpr, expr);
2429 const as_node = try transCreateNodeBuiltinFnCall(rp.c, "@as");
2430 const ty_node = try transQualType(rp, ZigClangExpr_getType(expr_base), ZigClangExpr_getBeginLoc(expr_base));
2431 try as_node.params.push(ty_node);
2432 _ = try appendToken(rp.c, .Comma, ",");
2433
2434 const int_lit_node = try transCreateNodeAPInt(rp.c, ZigClangAPValue_getInt(&result.Val));
2435 try as_node.params.push(int_lit_node);
2436
2437 as_node.rparen_token = try appendToken(rp.c, .RParen, ")");
2438
2439 return maybeSuppressResult(rp, scope, used, &as_node.base);
2440 },
2441 else => {
2442 return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangExpr_getBeginLoc(expr), "unsupported constant expression kind", .{});
2443 },
2444 }
2371}2445}
23722446
2373fn transPredefinedExpr(rp: RestorePoint, scope: *Scope, expr: *const ZigClangPredefinedExpr, used: ResultUsed) TransError!*ast.Node {2447fn transPredefinedExpr(rp: RestorePoint, scope: *Scope, expr: *const ZigClangPredefinedExpr, used: ResultUsed) TransError!*ast.Node {
...@@ -3024,6 +3098,64 @@ fn transFloatingLiteral(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangFl...@@ -3024,6 +3098,64 @@ fn transFloatingLiteral(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangFl
3024 return maybeSuppressResult(rp, scope, used, &node.base);3098 return maybeSuppressResult(rp, scope, used, &node.base);
3025}3099}
30263100
3101fn transBinaryConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangBinaryConditionalOperator, used: ResultUsed) TransError!*ast.Node {
3102 // GNU extension of the ternary operator where the middle expression is
3103 // omitted, the conditition itself is returned if it evaluates to true
3104 const casted_stmt = @ptrCast(*const ZigClangAbstractConditionalOperator, stmt);
3105 const cond_expr = ZigClangAbstractConditionalOperator_getCond(casted_stmt);
3106 const true_expr = ZigClangAbstractConditionalOperator_getTrueExpr(casted_stmt);
3107 const false_expr = ZigClangAbstractConditionalOperator_getFalseExpr(casted_stmt);
3108
3109 // c: (cond_expr)?:(false_expr)
3110 // zig: (blk: {
3111 // const _cond_temp = (cond_expr);
3112 // break :blk if (_cond_temp) _cond_temp else (false_expr);
3113 // })
3114 const lparen = try appendToken(rp.c, .LParen, "(");
3115
3116 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
3117 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);
3118
3119 const mangled_name = try block_scope.makeMangledName(rp.c, "cond_temp");
3120 const tmp_var = try transCreateNodeVarDecl(rp.c, false, true, mangled_name);
3121 tmp_var.eq_token = try appendToken(rp.c, .Equal, "=");
3122 tmp_var.init_node = try transExpr(rp, &block_scope.base, cond_expr, .used, .r_value);
3123 tmp_var.semicolon_token = try appendToken(rp.c, .Semicolon, ";");
3124 try block_scope.block_node.statements.push(&tmp_var.base);
3125
3126 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);
3127
3128 const if_node = try transCreateNodeIf(rp.c);
3129 var cond_scope = Scope{
3130 .parent = &block_scope.base,
3131 .id = .Condition,
3132 };
3133 const tmp_var_node = try transCreateNodeIdentifier(rp.c, mangled_name);
3134
3135 const ty = ZigClangQualType_getTypePtr(getExprQualType(rp.c, cond_expr));
3136 const cond_node = try finishBoolExpr(rp, &block_scope.base, ZigClangExpr_getBeginLoc(cond_expr), ty, tmp_var_node, used);
3137 if_node.condition = cond_node;
3138 _ = try appendToken(rp.c, .RParen, ")");
3139
3140 if_node.body = try transCreateNodeIdentifier(rp.c, mangled_name);
3141 if_node.@"else" = try transCreateNodeElse(rp.c);
3142 if_node.@"else".?.body = try transExpr(rp, &block_scope.base, false_expr, .used, .r_value);
3143 _ = try appendToken(rp.c, .Semicolon, ";");
3144
3145 break_node.rhs = &if_node.base;
3146 _ = try appendToken(rp.c, .Semicolon, ";");
3147 try block_scope.block_node.statements.push(&break_node.base);
3148 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
3149
3150 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);
3151 grouped_expr.* = .{
3152 .lparen = lparen,
3153 .expr = &block_scope.block_node.base,
3154 .rparen = try appendToken(rp.c, .RParen, ")"),
3155 };
3156 return maybeSuppressResult(rp, scope, used, &grouped_expr.base);
3157}
3158
3027fn transConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangConditionalOperator, used: ResultUsed) TransError!*ast.Node {3159fn transConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangConditionalOperator, used: ResultUsed) TransError!*ast.Node {
3028 const grouped = scope.id == .Condition;3160 const grouped = scope.id == .Condition;
3029 const lparen = if (grouped) try appendToken(rp.c, .LParen, "(") else undefined;3161 const lparen = if (grouped) try appendToken(rp.c, .LParen, "(") else undefined;
...@@ -3033,9 +3165,10 @@ fn transConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigCla...@@ -3033,9 +3165,10 @@ fn transConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigCla
3033 .id = .Condition,3165 .id = .Condition,
3034 };3166 };
30353167
3036 const cond_expr = ZigClangConditionalOperator_getCond(stmt);3168 const casted_stmt = @ptrCast(*const ZigClangAbstractConditionalOperator, stmt);
3037 const true_expr = ZigClangConditionalOperator_getTrueExpr(stmt);3169 const cond_expr = ZigClangAbstractConditionalOperator_getCond(casted_stmt);
3038 const false_expr = ZigClangConditionalOperator_getFalseExpr(stmt);3170 const true_expr = ZigClangAbstractConditionalOperator_getTrueExpr(casted_stmt);
3171 const false_expr = ZigClangAbstractConditionalOperator_getFalseExpr(casted_stmt);
30393172
3040 if_node.condition = try transBoolExpr(rp, &cond_scope, cond_expr, .used, .r_value, false);3173 if_node.condition = try transBoolExpr(rp, &cond_scope, cond_expr, .used, .r_value, false);
3041 _ = try appendToken(rp.c, .RParen, ")");3174 _ = try appendToken(rp.c, .RParen, ")");
...@@ -3278,14 +3411,6 @@ fn getExprQualType(c: *Context, expr: *const ZigClangExpr) ZigClangQualType {...@@ -3278,14 +3411,6 @@ fn getExprQualType(c: *Context, expr: *const ZigClangExpr) ZigClangQualType {
3278 return ZigClangExpr_getType(expr);3411 return ZigClangExpr_getType(expr);
3279}3412}
32803413
3281fn getExprQualTypeBeforeImplicitCast(c: *Context, expr: *const ZigClangExpr) ZigClangQualType {
3282 if (ZigClangExpr_getStmtClass(expr) == .ImplicitCastExprClass) {
3283 const cast_expr = @ptrCast(*const ZigClangImplicitCastExpr, expr);
3284 return getExprQualType(c, ZigClangImplicitCastExpr_getSubExpr(cast_expr));
3285 }
3286 return ZigClangExpr_getType(expr);
3287}
3288
3289fn typeIsOpaque(c: *Context, ty: *const ZigClangType, loc: ZigClangSourceLocation) bool {3414fn typeIsOpaque(c: *Context, ty: *const ZigClangType, loc: ZigClangSourceLocation) bool {
3290 switch (ZigClangType_getTypeClass(ty)) {3415 switch (ZigClangType_getTypeClass(ty)) {
3291 .Builtin => {3416 .Builtin => {
src/zig_clang.cpp+11-6
...@@ -1749,6 +1749,11 @@ const char* ZigClangFunctionDecl_getSectionAttribute(const struct ZigClangFuncti...@@ -1749,6 +1749,11 @@ const char* ZigClangFunctionDecl_getSectionAttribute(const struct ZigClangFuncti
1749 return nullptr;1749 return nullptr;
1750}1750}
17511751
1752const ZigClangExpr *ZigClangOpaqueValueExpr_getSourceExpr(const ZigClangOpaqueValueExpr *self) {
1753 auto casted = reinterpret_cast<const clang::OpaqueValueExpr *>(self);
1754 return reinterpret_cast<const ZigClangExpr *>(casted->getSourceExpr());
1755}
1756
1752const ZigClangTypedefNameDecl *ZigClangTypedefType_getDecl(const ZigClangTypedefType *self) {1757const ZigClangTypedefNameDecl *ZigClangTypedefType_getDecl(const ZigClangTypedefType *self) {
1753 auto casted = reinterpret_cast<const clang::TypedefType *>(self);1758 auto casted = reinterpret_cast<const clang::TypedefType *>(self);
1754 const clang::TypedefNameDecl *name_decl = casted->getDecl();1759 const clang::TypedefNameDecl *name_decl = casted->getDecl();
...@@ -2429,18 +2434,18 @@ unsigned ZigClangCharacterLiteral_getValue(const struct ZigClangCharacterLiteral...@@ -2429,18 +2434,18 @@ unsigned ZigClangCharacterLiteral_getValue(const struct ZigClangCharacterLiteral
2429 return casted->getValue();2434 return casted->getValue();
2430}2435}
24312436
2432const struct ZigClangExpr *ZigClangConditionalOperator_getCond(const struct ZigClangConditionalOperator *self) {2437const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getCond(const struct ZigClangAbstractConditionalOperator *self) {
2433 auto casted = reinterpret_cast<const clang::ConditionalOperator *>(self);2438 auto casted = reinterpret_cast<const clang::AbstractConditionalOperator *>(self);
2434 return reinterpret_cast<const struct ZigClangExpr *>(casted->getCond());2439 return reinterpret_cast<const struct ZigClangExpr *>(casted->getCond());
2435}2440}
24362441
2437const struct ZigClangExpr *ZigClangConditionalOperator_getTrueExpr(const struct ZigClangConditionalOperator *self) {2442const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getTrueExpr(const struct ZigClangAbstractConditionalOperator *self) {
2438 auto casted = reinterpret_cast<const clang::ConditionalOperator *>(self);2443 auto casted = reinterpret_cast<const clang::AbstractConditionalOperator *>(self);
2439 return reinterpret_cast<const struct ZigClangExpr *>(casted->getTrueExpr());2444 return reinterpret_cast<const struct ZigClangExpr *>(casted->getTrueExpr());
2440}2445}
24412446
2442const struct ZigClangExpr *ZigClangConditionalOperator_getFalseExpr(const struct ZigClangConditionalOperator *self) {2447const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getFalseExpr(const struct ZigClangAbstractConditionalOperator *self) {
2443 auto casted = reinterpret_cast<const clang::ConditionalOperator *>(self);2448 auto casted = reinterpret_cast<const clang::AbstractConditionalOperator *>(self);
2444 return reinterpret_cast<const struct ZigClangExpr *>(casted->getFalseExpr());2449 return reinterpret_cast<const struct ZigClangExpr *>(casted->getFalseExpr());
2445}2450}
24462451
src/zig_clang.h+6-3
...@@ -116,6 +116,7 @@ struct ZigClangMacroQualifiedType;...@@ -116,6 +116,7 @@ struct ZigClangMacroQualifiedType;
116struct ZigClangMemberExpr;116struct ZigClangMemberExpr;
117struct ZigClangNamedDecl;117struct ZigClangNamedDecl;
118struct ZigClangNone;118struct ZigClangNone;
119struct ZigClangOpaqueValueExpr;
119struct ZigClangPCHContainerOperations;120struct ZigClangPCHContainerOperations;
120struct ZigClangParenExpr;121struct ZigClangParenExpr;
121struct ZigClangParenType;122struct ZigClangParenType;
...@@ -1056,9 +1057,9 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangCharacterLiteral_getBeginLoc(...@@ -1056,9 +1057,9 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangCharacterLiteral_getBeginLoc(
1056ZIG_EXTERN_C enum ZigClangCharacterLiteral_CharacterKind ZigClangCharacterLiteral_getKind(const struct ZigClangCharacterLiteral *);1057ZIG_EXTERN_C enum ZigClangCharacterLiteral_CharacterKind ZigClangCharacterLiteral_getKind(const struct ZigClangCharacterLiteral *);
1057ZIG_EXTERN_C unsigned ZigClangCharacterLiteral_getValue(const struct ZigClangCharacterLiteral *);1058ZIG_EXTERN_C unsigned ZigClangCharacterLiteral_getValue(const struct ZigClangCharacterLiteral *);
10581059
1059ZIG_EXTERN_C const struct ZigClangExpr *ZigClangConditionalOperator_getCond(const struct ZigClangConditionalOperator *);1060ZIG_EXTERN_C const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getCond(const struct ZigClangAbstractConditionalOperator *);
1060ZIG_EXTERN_C const struct ZigClangExpr *ZigClangConditionalOperator_getTrueExpr(const struct ZigClangConditionalOperator *);1061ZIG_EXTERN_C const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getTrueExpr(const struct ZigClangAbstractConditionalOperator *);
1061ZIG_EXTERN_C const struct ZigClangExpr *ZigClangConditionalOperator_getFalseExpr(const struct ZigClangConditionalOperator *);1062ZIG_EXTERN_C const struct ZigClangExpr *ZigClangAbstractConditionalOperator_getFalseExpr(const struct ZigClangAbstractConditionalOperator *);
10621063
1063ZIG_EXTERN_C struct ZigClangQualType ZigClangCompoundAssignOperator_getType(const struct ZigClangCompoundAssignOperator *);1064ZIG_EXTERN_C struct ZigClangQualType ZigClangCompoundAssignOperator_getType(const struct ZigClangCompoundAssignOperator *);
1064ZIG_EXTERN_C struct ZigClangQualType ZigClangCompoundAssignOperator_getComputationLHSType(const struct ZigClangCompoundAssignOperator *);1065ZIG_EXTERN_C struct ZigClangQualType ZigClangCompoundAssignOperator_getComputationLHSType(const struct ZigClangCompoundAssignOperator *);
...@@ -1088,6 +1089,8 @@ ZIG_EXTERN_C const struct ZigClangExpr *ZigClangMemberExpr_getBase(const struct...@@ -1088,6 +1089,8 @@ ZIG_EXTERN_C const struct ZigClangExpr *ZigClangMemberExpr_getBase(const struct
1088ZIG_EXTERN_C bool ZigClangMemberExpr_isArrow(const struct ZigClangMemberExpr *);1089ZIG_EXTERN_C bool ZigClangMemberExpr_isArrow(const struct ZigClangMemberExpr *);
1089ZIG_EXTERN_C const struct ZigClangValueDecl * ZigClangMemberExpr_getMemberDecl(const struct ZigClangMemberExpr *);1090ZIG_EXTERN_C const struct ZigClangValueDecl * ZigClangMemberExpr_getMemberDecl(const struct ZigClangMemberExpr *);
10901091
1092ZIG_EXTERN_C const ZigClangExpr *ZigClangOpaqueValueExpr_getSourceExpr(const struct ZigClangOpaqueValueExpr *);
1093
1091ZIG_EXTERN_C const struct ZigClangExpr *ZigClangArraySubscriptExpr_getBase(const struct ZigClangArraySubscriptExpr *);1094ZIG_EXTERN_C const struct ZigClangExpr *ZigClangArraySubscriptExpr_getBase(const struct ZigClangArraySubscriptExpr *);
1092ZIG_EXTERN_C const struct ZigClangExpr *ZigClangArraySubscriptExpr_getIdx(const struct ZigClangArraySubscriptExpr *);1095ZIG_EXTERN_C const struct ZigClangExpr *ZigClangArraySubscriptExpr_getIdx(const struct ZigClangArraySubscriptExpr *);
10931096
test/run_translated_c.zig+37
...@@ -3,6 +3,42 @@ const tests = @import("tests.zig");...@@ -3,6 +3,42 @@ const tests = @import("tests.zig");
3const nl = std.cstr.line_sep;3const nl = std.cstr.line_sep;
44
5pub fn addCases(cases: *tests.RunTranslatedCContext) void {5pub fn addCases(cases: *tests.RunTranslatedCContext) void {
6 cases.add("ternary operator",
7 \\#include <stdlib.h>
8 \\static int cnt = 0;
9 \\int foo() { cnt++; return 42; }
10 \\int main(int argc, char **argv) {
11 \\ short q = 3;
12 \\ signed char z0 = q?:1;
13 \\ if (z0 != 3) abort();
14 \\ int z1 = 3?:1;
15 \\ if (z1 != 3) abort();
16 \\ int z2 = foo()?:-1;
17 \\ if (z2 != 42) abort();
18 \\ if (cnt != 1) abort();
19 \\ return 0;
20 \\}
21 , "");
22
23 cases.add("switch case",
24 \\#include <stdlib.h>
25 \\int lottery(unsigned int x) {
26 \\ switch (x) {
27 \\ case 3: return 0;
28 \\ case -1: return 3;
29 \\ case 8 ... 10: return x;
30 \\ default: return -1;
31 \\ }
32 \\}
33 \\int main(int argc, char **argv) {
34 \\ if (lottery(2) != -1) abort();
35 \\ if (lottery(3) != 0) abort();
36 \\ if (lottery(-1) != 3) abort();
37 \\ if (lottery(9) != 9) abort();
38 \\ return 0;
39 \\}
40 , "");
41
6 cases.add("boolean values and expressions",42 cases.add("boolean values and expressions",
7 \\#include <stdlib.h>43 \\#include <stdlib.h>
8 \\static const _Bool false_val = 0;44 \\static const _Bool false_val = 0;
...@@ -12,6 +48,7 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {...@@ -12,6 +48,7 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
12 \\ if (!r) abort();48 \\ if (!r) abort();
13 \\ _Bool self = foo;49 \\ _Bool self = foo;
14 \\ if (self == false_val) abort();50 \\ if (self == false_val) abort();
51 \\ if (((r) ? 'a' : 'b') != 'a') abort();
15 \\}52 \\}
16 \\int main(int argc, char **argv) {53 \\int main(int argc, char **argv) {
17 \\ foo(2, 5);54 \\ foo(2, 5);
test/translate_c.zig+6-6
...@@ -1468,10 +1468,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1468,10 +1468,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1468 \\ __case_1: {1468 \\ __case_1: {
1469 \\ __case_0: {1469 \\ __case_0: {
1470 \\ switch (i) {1470 \\ switch (i) {
1471 \\ 0 => break :__case_0,1471 \\ @as(c_int, 0) => break :__case_0,
1472 \\ 1...3 => break :__case_1,1472 \\ @as(c_int, 1)...@as(c_int, 3) => break :__case_1,
1473 \\ else => break :__default,1473 \\ else => break :__default,
1474 \\ 4 => break :__case_2,1474 \\ @as(c_int, 4) => break :__case_2,
1475 \\ }1475 \\ }
1476 \\ }1476 \\ }
1477 \\ res = 1;1477 \\ res = 1;
...@@ -2530,10 +2530,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2530,10 +2530,10 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2530 , &[_][]const u8{2530 , &[_][]const u8{
2531 \\pub export fn foo(arg_x: bool) bool {2531 \\pub export fn foo(arg_x: bool) bool {
2532 \\ var x = arg_x;2532 \\ var x = arg_x;
2533 \\ var a: bool = (@boolToInt(x) != @as(c_int, 1));2533 \\ var a: bool = (@intCast(c_int, @bitCast(i1, @intCast(u1, @boolToInt(x)))) != @as(c_int, 1));
2534 \\ var b: bool = (@boolToInt(a) != @as(c_int, 0));2534 \\ var b: bool = (@intCast(c_int, @bitCast(i1, @intCast(u1, @boolToInt(a)))) != @as(c_int, 0));
2535 \\ var c: bool = @ptrToInt(foo) != 0;2535 \\ var c: bool = @ptrToInt(foo) != 0;
2536 \\ return foo((@boolToInt(c) != @boolToInt(b)));2536 \\ return foo((@intCast(c_int, @bitCast(i1, @intCast(u1, @boolToInt(c)))) != @intCast(c_int, @bitCast(i1, @intCast(u1, @boolToInt(b))))));
2537 \\}2537 \\}
2538 });2538 });
2539}2539}