summaryrefslogtreecommitdiff
path: root/sys/src/cmd/cc
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-09-07 02:11:18 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2019-09-07 02:11:18 +0200
commit766a641d252cf4de21d50b2753dd8c25490b8ba0 (patch)
tree348d1dca3266f0de0580d9b773e9503dee85fef9 /sys/src/cmd/cc
parentd1204d9b8085634241bf5655279e54a606406cb1 (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.c5
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)