@@ -5149,6 +5149,11 @@ pub const FuncGen = struct {
51495149 const same_size_int = self .context .intType (elem_bits );
51505150 const truncated_int = self .builder .buildTrunc (shifted_value , same_size_int , "" );
51515151 return self .builder .buildBitCast (truncated_int , elem_llvm_ty , "" );
5152+ } else if (field_ty .zigTypeTag () == .Pointer ) {
5153+ const elem_bits = @intCast (c_uint , field_ty .bitSize (target ));
5154+ const same_size_int = self .context .intType (elem_bits );
5155+ const truncated_int = self .builder .buildTrunc (shifted_value , same_size_int , "" );
5156+ return self .builder .buildIntToPtr (truncated_int , elem_llvm_ty , "" );
51525157 }
51535158 return self .builder .buildTrunc (shifted_value , elem_llvm_ty , "" );
51545159 },
@@ -7999,7 +8004,10 @@ pub const FuncGen = struct {
79998004 const non_int_val = try self .resolveInst (elem );
80008005 const ty_bit_size = @intCast (u16 , field .ty .bitSize (target ));
80018006 const small_int_ty = self .dg .context .intType (ty_bit_size );
8002- const small_int_val = self .builder .buildBitCast (non_int_val , small_int_ty , "" );
8007+ const small_int_val = if (field .ty .zigTypeTag () == .Pointer )
8008+ self .builder .buildPtrToInt (non_int_val , small_int_ty , "" )
8009+ else
8010+ self .builder .buildBitCast (non_int_val , small_int_ty , "" );
80038011 const shift_rhs = int_llvm_ty .constInt (running_bits , .False );
80048012 // If the field is as large as the entire packed struct, this
80058013 // zext would go from, e.g. i16 to i16. This is legal with
0 commit comments