From ba8e5c774af5dd5481e124594a2384873527294c Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Sat, 7 Sep 2019 12:37:33 -0700 Subject: Libflac: Tell it that we have stdint.h so it finds SIZE_MAX --- sys/src/cmd/audio/libFLAC/mkfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/src/cmd/audio/libFLAC/mkfile b/sys/src/cmd/audio/libFLAC/mkfile index 43ac51946..7e84440a0 100644 --- a/sys/src/cmd/audio/libFLAC/mkfile +++ b/sys/src/cmd/audio/libFLAC/mkfile @@ -26,6 +26,6 @@ OFILES=\ window.$O\ CC=pcc -CFLAGS=-I. -I../libogg -DVERSION="1.3.1" -DPlan9 -DFLAC__NO_ASM -DFLAC__HAS_OGG -DFLAC__ALIGN_MALLOC_DATA -D_C99_SNPRINTF_EXTENSION -D_BSD_EXTENSION -D_POSIX_SOURCE -c +CFLAGS=-I. -I../libogg -DVERSION="1.3.1" -DPlan9 -DFLAC__NO_ASM -DFLAC__HAS_OGG -DFLAC__ALIGN_MALLOC_DATA -D_C99_SNPRINTF_EXTENSION -D_BSD_EXTENSION -D_POSIX_SOURCE -DHAVE_STDINT_H -c Date: Sat, 7 Sep 2019 18:25:04 -0700 Subject: Allow address expressions in ?c after int casts. This fixes ocaml on non-x86 architectures, where we have code that looks like: #define Fl_head ((uintptr_t)(&sentinel.first_field)) Without this change, we get an error about a non-constant initializer. This change takes the checks for pointers and makes them apply to all expressions. It also makes the checks stricter, preventing the following from compiling to junk: int x; int y = 42; int *p = &x + y --- sys/src/cmd/cc/dcl.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/sys/src/cmd/cc/dcl.c b/sys/src/cmd/cc/dcl.c index 4e6fd7775..03410bcb9 100644 --- a/sys/src/cmd/cc/dcl.c +++ b/sys/src/cmd/cc/dcl.c @@ -373,35 +373,35 @@ init1(Sym *s, Type *t, long o, int exflag) goto gext; } if(t->etype == TIND) { - while(a->op == OCAST) { + if(a->op == OCAST) warn(a, "CAST in initialization ignored"); - a = a->left; - } - if(!sametype(t, a->type)) { + if(!sametype(t, a->type)) diag(a, "initialization of incompatible pointers: %s\n%T and %T", s->name, t, a->type); - } - switch(a->op) { - case OADDR: - a = a->left; - break; - case ONAME: - case OIND: - diag(a, "initializer is not a constant: %s", s->name); - return Z; - } - goto gext; } while(a->op == OCAST) a = a->left; - if(a->op == OADDR) { - warn(a, "initialize pointer to an integer: %s", s->name); + + switch(a->op) { + case OADDR: + if(t->etype != TIND) + warn(a, "initialize pointer to an integer: %s", s->name); a = a->left; - goto gext; + break; + case OADD: + /* + * Constants will be folded before this point, which just leaves offsets + * from names. + */ + l = a->left; + r = a->right; + if(l->op == OADDR && r->op == OCONST || r->op == OADDR && l->op == OCONST) + break; + default: + diag(a, "initializer is not a constant: %s", s->name); + return Z; } - diag(a, "initializer is not a constant: %s", s->name); - return Z; gext: gextern(s, a, o, t->width); -- cgit v1.2.3