aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorjacobly0 <jacobly0@users.noreply.github.com>2022-10-12 05:40:59 -0400
committerGitHub <noreply@github.com>2022-10-12 12:40:59 +0300
commit562ac8be48e4a08358da73e556e331e3618f8b4b (patch)
tree3495e59a81924c3a8ff12b8948fe069f01f104cc /src/codegen.zig
parentb47e54ed3f6e5d93fff8a2327c88c903cc0a194c (diff)
downloadzig-562ac8be48e4a08358da73e556e331e3618f8b4b.tar.gz
zig-562ac8be48e4a08358da73e556e331e3618f8b4b.zip
codegen: add support for lowering .field_ptr on a slice
Closes #13068
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index f5340458a5..e7f927a2d6 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -363,11 +363,21 @@ pub fn generateSymbol(
const mod = bin_file.options.module.?;
const decl = mod.declPtr(decl_index);
const addend = blk: {
- switch (decl.ty.tag()) {
- .@"struct" => {
+ switch (decl.ty.zigTypeTag()) {
+ .Struct => {
const addend = decl.ty.structFieldOffset(field_ptr.field_index, target);
break :blk @intCast(u32, addend);
},
+ .Pointer => {
+ assert(decl.ty.isSlice());
+ var buf: Type.SlicePtrFieldTypeBuffer = undefined;
+ const addend = switch (field_ptr.field_index) {
+ 0 => 0,
+ 1 => decl.ty.slicePtrFieldType(&buf).abiSize(target),
+ else => unreachable,
+ };
+ break :blk @intCast(u32, addend);
+ },
else => return Result{
.fail = try ErrorMsg.create(
bin_file.allocator,