diff options
| -rwxr-xr-x | configure | 26 | ||||
| -rw-r--r-- | tccgen.c | 44 |
2 files changed, 46 insertions, 24 deletions
@@ -1,7 +1,7 @@ #!/bin/sh # # tcc configure script (c) 2003 Fabrice Bellard -# + # set temporary file name if test ! -z "$TMPDIR" ; then TMPDIR1="${TMPDIR}" @@ -11,21 +11,13 @@ else TMPDIR1="/tmp" fi -RDM1="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -RDM2="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -TMPC="${TMPDIR1}/tcc-conf-${RDM1}-$$-${RDM2}.c" -RDM1="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -RDM2="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -TMPO="${TMPDIR1}/tcc-conf-${RDM1}-$$-${RDM2}.o" -RDM1="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -RDM2="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -TMPE="${TMPDIR1}/tcc-conf-${RDM1}-$$-${RDM2}" -RDM1="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -RDM2="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -TMPS="${TMPDIR1}/tcc-conf-${RDM1}-$$-${RDM2}.S" -RDM1="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -RDM2="$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" " )" -TMPH="${TMPDIR1}/tcc-conf-${RDM1}-$$-${RDM2}.h" +# bashism: TMPN="${TMPDIR1}/tcc-conf-${RANDOM}-$$-${RANDOM}.c" +TMPN="./conftest-$$" + +TMPC=$TMPN.c +TMPH=$TMPN.h +TMPO=$TMPN.o +TMPE=$TMPN # default parameters build_cross="no" @@ -407,4 +399,4 @@ else echo "config.h is unchanged" fi -rm -f $TMPO $TMPC $TMPE $TMPS $TMPH +rm -f $TMPN* @@ -2995,9 +2995,6 @@ static void post_type(CType *type, AttributeDef *ad) if (tok == '(') { /* function declaration */ - if ((type->t & VT_STATIC) && local_stack) { - error("Function without file scope cannot be static"); - } next(); l = 0; first = NULL; @@ -4294,14 +4291,28 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, next(); skip(';'); } else if (tok == TOK_FOR) { - int e; + int e, c99_for_decl = 0; next(); skip('('); if (tok != ';') { - gexpr(); - vpop(); + if (tok < TOK_UIDENT) { + // handle C99 for loop construct + c99_for_decl = 1; + + /* record local declaration stack position */ + s = local_stack; + + decl(VT_LOCAL); + if (is_expr) + vpop(); + } else { + gexpr(); + vpop(); + skip(';'); + } + } else { + skip(';'); } - skip(';'); d = ind; c = ind; a = 0; @@ -4324,6 +4335,25 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, gjmp_addr(c); gsym(a); gsym_addr(b, c); + + if (c99_for_decl) { + /* pop locally defined symbols */ + if(is_expr) { + /* XXX: this solution makes only valgrind happy... + triggered by gcc.c-torture/execute/20000917-1.c */ + Sym *p; + switch(vtop->type.t & VT_BTYPE) { + case VT_PTR: + case VT_STRUCT: + case VT_ENUM: + case VT_FUNC: + for(p=vtop->type.ref;p;p=p->prev) + if(p->prev==s) + error("unsupported expression type"); + } + } + sym_pop(&local_stack, s); + } } else if (tok == TOK_DO) { next(); |
