diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-09-07 02:11:18 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-09-07 02:11:18 +0200 |
commit | 766a641d252cf4de21d50b2753dd8c25490b8ba0 (patch) | |
tree | 348d1dca3266f0de0580d9b773e9503dee85fef9 /sys/src/cmd/cc | |
parent | d1204d9b8085634241bf5655279e54a606406cb1 (diff) |
cc: fix void cast crash
the following code reproduces the crash:
void
foo(void)
{
}
void
main(int argc, char **argv)
{
(void)(1 ? (void)0 : foo());
}
the problem is that side() gives a false positive on the OCOND
with later constant folding eleminating the acutal side effect
and OCAST ending up with two nested OCATS with the nested one
being zapped (type == T).
Diffstat (limited to 'sys/src/cmd/cc')
-rw-r--r-- | sys/src/cmd/cc/com.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/sys/src/cmd/cc/com.c b/sys/src/cmd/cc/com.c index 46a59d49a..418bbae26 100644 --- a/sys/src/cmd/cc/com.c +++ b/sys/src/cmd/cc/com.c @@ -1081,6 +1081,11 @@ loop: if(castucom(n)) warn(n, "32-bit unsigned complement zero-extended to 64 bits"); ccom(l); + if(l->type == T){ + n->left = Z; + n->type = T; + break; + } if(l->op == OCONST) { evconst(n); if(n->op == OCONST) |