ref: 766a641d252cf4de21d50b2753dd8c25490b8ba0
parent: d1204d9b8085634241bf5655279e54a606406cb1
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Sep 6 22:11:18 EDT 2019
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).
--- a/sys/src/cmd/cc/com.c
+++ b/sys/src/cmd/cc/com.c
@@ -1081,6 +1081,11 @@
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)