shithub: riscv

Download patch

ref: c1ff805e236a818eb530ac68236c506448377419
parent: 7f0728b7f446a77b8606ed3dffd48deb48697384
author: cinap_lenrek <[email protected]>
date: Thu Apr 23 01:12:57 EDT 2015

cc: fix non constant pointer initializer for other compilers than 8c/6c

i made a mistake here as this change breaks the arm and mips compilers
which lack an optimiation in xcom() that folds constant pointer arithmetic
into the offset. on arm, the a node is a complex expression with op OADD of
type TIND but the test rejected the (valid) pointer arithmetic.

instead, we now test for the operations which cannot be constant instead
of using the type as a proxy.

--- a/sys/src/cmd/cc/dcl.c
+++ b/sys/src/cmd/cc/dcl.c
@@ -381,11 +381,12 @@
 				diag(a, "initialization of incompatible pointers: %s\n%T and %T",
 					s->name, t, a->type);
 			}
-			if(a->op == OADDR) {
+			switch(a->op) {
+			case OADDR:
 				a = a->left;
-				goto gext;
-			}
-			if(a->type->etype == TIND) {
+				break;
+			case ONAME:
+			case OIND:
 				diag(a, "initializer is not a constant: %s", s->name);
 				return Z;
 			}