aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-09-20 16:48:42 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-09-20 16:48:42 -0700
commitabc30f79489b68f6dc0ee4b408c63a8e783215d1 (patch)
tree0979982ebfa529405ae0e6014f910a3cf496aa14 /src
parent4b2d7a9c67760aa9a81bfd364ac0d88cbb9737f1 (diff)
downloadzig-abc30f79489b68f6dc0ee4b408c63a8e783215d1.tar.gz
zig-abc30f79489b68f6dc0ee4b408c63a8e783215d1.zip
stage2: improve handling of 0 bit types
* Sema: zirAtomicLoad handles 0-bit types correctly * LLVM backend: when lowering function types, elide parameters with 0-bit types. * Type: abiSize handles u0/i0 correctly
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig4
-rw-r--r--src/codegen/llvm.zig18
-rw-r--r--src/type.zig1
3 files changed, 16 insertions, 7 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index f53dbea90c..990aa4ddf0 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -7803,6 +7803,10 @@ fn zirAtomicLoad(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Compile
else => {},
}
+ if (try sema.typeHasOnePossibleValue(block, elem_ty_src, elem_ty)) |val| {
+ return sema.addConstant(elem_ty, val);
+ }
+
if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| {
if (try ptr_val.pointerDeref(sema.arena)) |elem_val| {
return sema.addConstant(elem_ty, elem_val);
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 2e835260af..2f703e2d68 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -541,17 +541,21 @@ pub const DeclGen = struct {
defer self.gpa.free(fn_param_types);
zig_fn_type.fnParamTypes(fn_param_types);
- const llvm_param = try self.gpa.alloc(*const llvm.Type, fn_param_len);
- defer self.gpa.free(llvm_param);
-
- for (fn_param_types) |fn_param, i| {
- llvm_param[i] = try self.llvmType(fn_param);
+ const llvm_param_buffer = try self.gpa.alloc(*const llvm.Type, fn_param_len);
+ defer self.gpa.free(llvm_param_buffer);
+
+ var llvm_params_len: c_uint = 0;
+ for (fn_param_types) |fn_param| {
+ if (fn_param.hasCodeGenBits()) {
+ llvm_param_buffer[llvm_params_len] = try self.llvmType(fn_param);
+ llvm_params_len += 1;
+ }
}
const fn_type = llvm.functionType(
try self.llvmType(return_type),
- llvm_param.ptr,
- @intCast(c_uint, fn_param_len),
+ llvm_param_buffer.ptr,
+ llvm_params_len,
.False,
);
const llvm_fn = self.llvmModule().addFunction(decl.name, fn_type);
diff --git a/src/type.zig b/src/type.zig
index 122faefbc7..c2dc150347 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -1822,6 +1822,7 @@ pub const Type = extern union {
.int_signed, .int_unsigned => {
const bits: u16 = self.cast(Payload.Bits).?.data;
+ if (bits == 0) return 0;
return std.math.ceilPowerOfTwoPromote(u16, (bits + 7) / 8);
},