| author | |
| committer | |
| log | fb9d6b8bd96b1d0403f04fd31b1ebc0881105f48 |
| tree | 740adc7995bd1395bc53b5446adc444d42b57bb9 |
| parent | 657fe557115d9fde5de5b8c6b65a4db4e3a2e567 |
| signature |
5 files changed, 18 insertions(+), 5 deletions(-)
src/codegen/c.zig+1-1| ... | ... | @@ -1880,7 +1880,7 @@ pub const DeclGen = struct { |
| 1880 | 1880 | if (cty.isBool()) |
| 1881 | 1881 | signAbbrev(.unsigned) |
| 1882 | 1882 | else if (cty.isInteger()) |
| 1883 | signAbbrev(cty.signedness() orelse .unsigned) | |
| 1883 | signAbbrev(cty.signedness(dg.module.getTarget())) | |
| 1884 | 1884 | else if (cty.isFloat()) |
| 1885 | 1885 | @as(u8, 'f') |
| 1886 | 1886 | else if (cty.isPointer()) |
src/codegen/c/type.zig+2-2| ... | ... | @@ -537,9 +537,9 @@ pub const CType = extern union { |
| 537 | 537 | }; |
| 538 | 538 | } |
| 539 | 539 | |
| 540 | pub fn signedness(self: CType) ?std.builtin.Signedness { | |
| 540 | pub fn signedness(self: CType, target: std.Target) std.builtin.Signedness { | |
| 541 | 541 | return switch (self.tag()) { |
| 542 | .char => null, // unknown signedness | |
| 542 | .char => target.charSignedness(), | |
| 543 | 543 | .@"signed char", |
| 544 | 544 | .short, |
| 545 | 545 | .int, |
src/type.zig+4-2| ... | ... | @@ -2216,7 +2216,8 @@ pub const Type = struct { |
| 2216 | 2216 | /// Returns true if and only if the type is a fixed-width, signed integer. |
| 2217 | 2217 | pub fn isSignedInt(ty: Type, mod: *const Module) bool { |
| 2218 | 2218 | return switch (ty.toIntern()) { |
| 2219 | .c_char_type, .isize_type, .c_short_type, .c_int_type, .c_long_type, .c_longlong_type => true, | |
| 2219 | .c_char_type => mod.getTarget().charSignedness() == .signed, | |
| 2220 | .isize_type, .c_short_type, .c_int_type, .c_long_type, .c_longlong_type => true, | |
| 2220 | 2221 | else => switch (mod.intern_pool.indexToKey(ty.toIntern())) { |
| 2221 | 2222 | .int_type => |int_type| int_type.signedness == .signed, |
| 2222 | 2223 | else => false, |
| ... | ... | @@ -2227,6 +2228,7 @@ pub const Type = struct { |
| 2227 | 2228 | /// Returns true if and only if the type is a fixed-width, unsigned integer. |
| 2228 | 2229 | pub fn isUnsignedInt(ty: Type, mod: *const Module) bool { |
| 2229 | 2230 | return switch (ty.toIntern()) { |
| 2231 | .c_char_type => mod.getTarget().charSignedness() == .unsigned, | |
| 2230 | 2232 | .usize_type, .c_ushort_type, .c_uint_type, .c_ulong_type, .c_ulonglong_type => true, |
| 2231 | 2233 | else => switch (mod.intern_pool.indexToKey(ty.toIntern())) { |
| 2232 | 2234 | .int_type => |int_type| int_type.signedness == .unsigned, |
| ... | ... | @@ -2257,7 +2259,7 @@ pub const Type = struct { |
| 2257 | 2259 | }, |
| 2258 | 2260 | .usize_type => return .{ .signedness = .unsigned, .bits = target.ptrBitWidth() }, |
| 2259 | 2261 | .isize_type => return .{ .signedness = .signed, .bits = target.ptrBitWidth() }, |
| 2260 | .c_char_type => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.char) }, | |
| 2262 | .c_char_type => return .{ .signedness = mod.getTarget().charSignedness(), .bits = target.c_type_bit_size(.char) }, | |
| 2261 | 2263 | .c_short_type => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.short) }, |
| 2262 | 2264 | .c_ushort_type => return .{ .signedness = .unsigned, .bits = target.c_type_bit_size(.ushort) }, |
| 2263 | 2265 | .c_int_type => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.int) }, |
test/behavior.zig+1| ... | ... | @@ -145,6 +145,7 @@ test { |
| 145 | 145 | _ = @import("behavior/bugs/15778.zig"); |
| 146 | 146 | _ = @import("behavior/byteswap.zig"); |
| 147 | 147 | _ = @import("behavior/byval_arg_var.zig"); |
| 148 | _ = @import("behavior/c_char_signedness.zig"); | |
| 148 | 149 | _ = @import("behavior/call.zig"); |
| 149 | 150 | _ = @import("behavior/cast.zig"); |
| 150 | 151 | _ = @import("behavior/cast_int.zig"); |
test/behavior/c_char_signedness.zig created+10| ... | ... | @@ -0,0 +1,10 @@ |
| 1 | const std = @import("std"); | |
| 2 | const expectEqual = std.testing.expectEqual; | |
| 3 | const c = @cImport({ | |
| 4 | @cInclude("limits.h"); | |
| 5 | }); | |
| 6 | ||
| 7 | test "c_char signedness" { | |
| 8 | try expectEqual(@as(c_char, c.CHAR_MIN), std.math.minInt(c_char)); | |
| 9 | try expectEqual(@as(c_char, c.CHAR_MAX), std.math.maxInt(c_char)); | |
| 10 | } |