diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-11-04 16:07:13 +0200 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-11-04 23:13:29 +0200 |
| commit | e6b3cb5043b189fab6417df4a6921728ea174c8f (patch) | |
| tree | fed95ca152b9d1425dd0922e6454898280869cb7 /src | |
| parent | 8c4faa5f3f63cfbcfdc12cda7c37be1da642d2f6 (diff) | |
| download | zig-e6b3cb5043b189fab6417df4a6921728ea174c8f.tar.gz zig-e6b3cb5043b189fab6417df4a6921728ea174c8f.zip | |
Sema: detect division overflow
Closes #13434
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 30 |
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, |
