aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-09-02 13:39:46 +0300
committerVeikka Tuominen <git@vexu.eu>2022-09-02 17:57:10 +0300
commit8b58dab78b8a157a39377654691324dd71f77d23 (patch)
tree0198f4ee62cde36f0cede9c9a587749982085312 /src/value.zig
parent7a8d9af4a94caeb74361c9462cd44a1e4356150b (diff)
downloadzig-8b58dab78b8a157a39377654691324dd71f77d23.tar.gz
zig-8b58dab78b8a157a39377654691324dd71f77d23.zip
Sema: resolve lazy value before intToFloat
Closes #12698
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/value.zig b/src/value.zig
index a1961b40f7..50f86c7e79 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -2940,17 +2940,24 @@ pub const Value = extern union {
}
pub fn intToFloat(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, target: Target) !Value {
+ return intToFloatAdvanced(val, arena, int_ty, float_ty, target, null) catch |err| switch (err) {
+ error.OutOfMemory => return error.OutOfMemory,
+ else => unreachable,
+ };
+ }
+
+ pub fn intToFloatAdvanced(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, target: Target, sema_kit: ?Module.WipAnalysis) !Value {
if (int_ty.zigTypeTag() == .Vector) {
const result_data = try arena.alloc(Value, int_ty.vectorLen());
for (result_data) |*scalar, i| {
- scalar.* = try intToFloatScalar(val.indexVectorlike(i), arena, float_ty.scalarType(), target);
+ scalar.* = try intToFloatScalar(val.indexVectorlike(i), arena, float_ty.scalarType(), target, sema_kit);
}
return Value.Tag.aggregate.create(arena, result_data);
}
- return intToFloatScalar(val, arena, float_ty, target);
+ return intToFloatScalar(val, arena, float_ty, target, sema_kit);
}
- pub fn intToFloatScalar(val: Value, arena: Allocator, float_ty: Type, target: Target) !Value {
+ pub fn intToFloatScalar(val: Value, arena: Allocator, float_ty: Type, target: Target, sema_kit: ?Module.WipAnalysis) !Value {
switch (val.tag()) {
.undef, .zero, .one => return val,
.the_only_possible_value => return Value.initTag(.zero), // for i0, u0
@@ -2970,6 +2977,22 @@ pub const Value = extern union {
const float = bigIntToFloat(limbs, false);
return floatToValue(float, arena, float_ty, target);
},
+ .lazy_align => {
+ const ty = val.castTag(.lazy_align).?.data;
+ if (sema_kit) |sk| {
+ return intToFloatInner((try ty.abiAlignmentAdvanced(target, .{ .sema_kit = sk })).scalar, arena, float_ty, target);
+ } else {
+ return intToFloatInner(ty.abiAlignment(target), arena, float_ty, target);
+ }
+ },
+ .lazy_size => {
+ const ty = val.castTag(.lazy_size).?.data;
+ if (sema_kit) |sk| {
+ return intToFloatInner((try ty.abiSizeAdvanced(target, .{ .sema_kit = sk })).scalar, arena, float_ty, target);
+ } else {
+ return intToFloatInner(ty.abiSize(target), arena, float_ty, target);
+ }
+ },
else => unreachable,
}
}