diff options
| author | Andrew Chambers <andrewchambers@fastmail.com> | 2019-02-27 22:10:17 +1300 | 
|---|---|---|
| committer | Quentin Carbonneaux <quentin@c9x.me> | 2019-02-27 16:26:53 +0100 | 
| commit | c043227bf792fd341cd19f40cd96b7577dacbd5a (patch) | |
| tree | 140b02435306f45d188a151f647df74a29596acc /fold.c | |
| parent | b2ea8c11b61014cb90e2a025d605ac77a1c7d6bc (diff) | |
| download | roux-c043227bf792fd341cd19f40cd96b7577dacbd5a.tar.gz | |
Let runtime crash on zero div, don't fold it.
Remarks from Quentin:
It is an important decision to use Bot
and not Top as the result of 'x / 0'.
By using Bot, we refuse to give a warrant
to the compiler that would allow meaningless
subsequent decisions.  An example follows.
Clang, on my computer, will build a program
which prints "Ho" when fed the following C:
    int main()
    { puts(1/0 ? "Hi" : "Ho"); }
On the other hand, a C compiler based on
QBE will build a program which crashes,
as one would expect.
See also
https://c9x.me/notes/2014-09-10.html
Diffstat (limited to 'fold.c')
| -rw-r--r-- | fold.c | 2 | 
1 files changed, 1 insertions, 1 deletions
| diff --git a/fold.c b/fold.c index 8fc64c5..019b739 100644 --- a/fold.c +++ b/fold.c @@ -500,7 +500,7 @@ opfold(int op, int cls, Con *cl, Con *cr, Fn *fn) if ((op == Odiv || op == Oudiv || op == Orem || op == Ourem) && czero(cr, KWIDE(cls))) - err("null divisor in '%s'", optab[op].name); + return Bot; if (cls == Kw || cls == Kl) { if (foldint(&c, op, cls == Kl, cl, cr)) return Bot; | 
