aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure26
-rw-r--r--tccgen.c44
2 files changed, 46 insertions, 24 deletions
diff --git a/configure b/configure
index b3de471..b981785 100755
--- a/configure
+++ b/configure
@@ -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*
diff --git a/tccgen.c b/tccgen.c
index 9940df5..a7c9557 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -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();