summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-04-23 05:12:57 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-04-23 05:12:57 +0200
commitc1ff805e236a818eb530ac68236c506448377419 (patch)
tree0a68327d7a436765bafb6800597eeec2648bac8d /sys/src
parent7f0728b7f446a77b8606ed3dffd48deb48697384 (diff)
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.
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/cmd/cc/dcl.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/src/cmd/cc/dcl.c b/sys/src/cmd/cc/dcl.c
index 7b2ae464f..1a7f38e1a 100644
--- a/sys/src/cmd/cc/dcl.c
+++ b/sys/src/cmd/cc/dcl.c
@@ -381,11 +381,12 @@ init1(Sym *s, Type *t, long o, int exflag)
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;
}