aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-11-04 16:07:13 +0200
committerVeikka Tuominen <git@vexu.eu>2022-11-04 23:13:29 +0200
commite6b3cb5043b189fab6417df4a6921728ea174c8f (patch)
treefed95ca152b9d1425dd0922e6454898280869cb7 /src/Sema.zig
parent8c4faa5f3f63cfbcfdc12cda7c37be1da642d2f6 (diff)
downloadzig-e6b3cb5043b189fab6417df4a6921728ea174c8f.tar.gz
zig-e6b3cb5043b189fab6417df4a6921728ea174c8f.zip
Sema: detect division overflow
Closes #13434
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index f3aa861b5c..3def393dfb 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -12469,10 +12469,12 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
if (maybe_rhs_val) |rhs_val| {
if (is_int) {
- return sema.addConstant(
- resolved_type,
- try lhs_val.intDiv(rhs_val, resolved_type, sema.arena, target),
- );
+ const res = try lhs_val.intDiv(rhs_val, resolved_type, sema.arena, target);
+ var vector_index: usize = undefined;
+ if (!(try sema.intFitsInType(block, src, res, resolved_type, &vector_index))) {
+ return sema.failWithIntegerOverflow(block, src, resolved_type, res, vector_index);
+ }
+ return sema.addConstant(resolved_type, res);
} else {
return sema.addConstant(
resolved_type,
@@ -12584,10 +12586,12 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
if (modulus_val.compareWithZero(.neq)) {
return sema.fail(block, src, "exact division produced remainder", .{});
}
- return sema.addConstant(
- resolved_type,
- try lhs_val.intDiv(rhs_val, resolved_type, sema.arena, target),
- );
+ const res = try lhs_val.intDiv(rhs_val, resolved_type, sema.arena, target);
+ var vector_index: usize = undefined;
+ if (!(try sema.intFitsInType(block, src, res, resolved_type, &vector_index))) {
+ return sema.failWithIntegerOverflow(block, src, resolved_type, res, vector_index);
+ }
+ return sema.addConstant(resolved_type, res);
} else {
const modulus_val = try lhs_val.floatMod(rhs_val, resolved_type, sema.arena, target);
if (modulus_val.compareWithZero(.neq)) {
@@ -12862,10 +12866,12 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
if (maybe_rhs_val) |rhs_val| {
if (is_int) {
- return sema.addConstant(
- resolved_type,
- try lhs_val.intDiv(rhs_val, resolved_type, sema.arena, target),
- );
+ const res = try lhs_val.intDiv(rhs_val, resolved_type, sema.arena, target);
+ var vector_index: usize = undefined;
+ if (!(try sema.intFitsInType(block, src, res, resolved_type, &vector_index))) {
+ return sema.failWithIntegerOverflow(block, src, resolved_type, res, vector_index);
+ }
+ return sema.addConstant(resolved_type, res);
} else {
return sema.addConstant(
resolved_type,