From 766a641d252cf4de21d50b2753dd8c25490b8ba0 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 7 Sep 2019 02:11:18 +0200 Subject: [PATCH] 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). --- sys/src/cmd/cc/com.c | 5 +++++ 1 file changed, 5 insertions(+) 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)