shithub: riscv

Download patch

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)