aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen/c.zig36
1 files changed, 27 insertions, 9 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index d7aec355e9..f4b54cd3aa 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -717,10 +717,21 @@ pub const DeclGen = struct {
val = rt.data;
}
const target = dg.module.getTarget();
+
+ const safety_on = switch (dg.module.optimizeMode()) {
+ .Debug, .ReleaseSafe => true,
+ .ReleaseFast, .ReleaseSmall => false,
+ };
+
if (val.isUndefDeep()) {
switch (ty.zigTypeTag()) {
- // bool b = 0xaa; evals to true, but memcpy(&b, 0xaa, 1); evals to false.
- .Bool => return dg.renderValue(writer, ty, Value.false, location),
+ .Bool => {
+ if (safety_on) {
+ return writer.writeAll("0xaa");
+ } else {
+ return writer.writeAll("false");
+ }
+ },
.Int, .Enum, .ErrorSet => return writer.print("{x}", .{try dg.fmtIntLiteral(ty, val)}),
.Float => {
const bits = ty.floatBits(target);
@@ -1099,7 +1110,13 @@ pub const DeclGen = struct {
},
}
},
- .Bool => return writer.print("zig_{}", .{val.toBool()}),
+ .Bool => {
+ if (val.toBool()) {
+ return writer.writeAll("true");
+ } else {
+ return writer.writeAll("false");
+ }
+ },
.Optional => {
var opt_buf: Type.Payload.ElemType = undefined;
const payload_ty = ty.optionalChild(&opt_buf);
@@ -1141,8 +1158,10 @@ pub const DeclGen = struct {
if (!payload_ty.hasRuntimeBits()) {
// We use the error type directly as the type.
- const err_val = if (val.errorUnionIsPayload()) Value.initTag(.zero) else val;
- return dg.renderValue(writer, error_ty, err_val, location);
+ if (val.errorUnionIsPayload()) {
+ return try writer.writeByte('0');
+ }
+ return dg.renderValue(writer, error_ty, val, location);
}
if (location != .Initializer) {
@@ -1802,10 +1821,9 @@ pub const DeclGen = struct {
const target = dg.module.getTarget();
switch (t.zigTypeTag()) {
- .Void => {
- try w.writeAll("void");
- },
- .NoReturn, .Bool, .Float => {
+ .Void => try w.writeAll("void"),
+ .Bool => try w.writeAll("bool"),
+ .NoReturn, .Float => {
try w.writeAll("zig_");
try t.print(w, dg.module);
},