aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-10-05 16:49:12 +0300
committerVeikka Tuominen <git@vexu.eu>2022-10-06 20:09:45 +0300
commit446deb31a80a2bd046633fb087d8caee3ed41021 (patch)
tree800acec67f7a982dddfa52b5f011a3d96554932d /src
parent775e055b59366f60badfb77a420219691846314b (diff)
downloadzig-446deb31a80a2bd046633fb087d8caee3ed41021.tar.gz
zig-446deb31a80a2bd046633fb087d8caee3ed41021.zip
Sema: validate bitSizeOf operand type
Closes #13080
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 01c8b395bc..55fd296ff7 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -14286,6 +14286,38 @@ fn zirBitSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
const src = inst_data.src();
const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };
const operand_ty = try sema.resolveType(block, operand_src, inst_data.operand);
+ switch (operand_ty.zigTypeTag()) {
+ .Fn,
+ .NoReturn,
+ .Undefined,
+ .Null,
+ .BoundFn,
+ .Opaque,
+ => return sema.fail(block, operand_src, "no size available for type '{}'", .{operand_ty.fmt(sema.mod)}),
+
+ .Type,
+ .EnumLiteral,
+ .ComptimeFloat,
+ .ComptimeInt,
+ .Void,
+ => return sema.addIntUnsigned(Type.comptime_int, 0),
+
+ .Bool,
+ .Int,
+ .Float,
+ .Pointer,
+ .Array,
+ .Struct,
+ .Optional,
+ .ErrorUnion,
+ .ErrorSet,
+ .Enum,
+ .Union,
+ .Vector,
+ .Frame,
+ .AnyFrame,
+ => {},
+ }
const target = sema.mod.getTarget();
const bit_size = try operand_ty.bitSizeAdvanced(target, sema.kit(block, src));
return sema.addIntUnsigned(Type.comptime_int, bit_size);