aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Soroka <gits@joesoroka.com>2011-07-22 02:09:28 -0700
committerJoe Soroka <gits@joesoroka.com>2011-07-22 02:09:28 -0700
commit9b52e16a50e7ed86b4fec6736cd32421fa90785a (patch)
treea90b4b7f7f3c9ac7df15c63787b537c1b5907739
parentd7d845888808da6191ab6a70942fac6e3eb815ea (diff)
downloadtinycc-9b52e16a50e7ed86b4fec6736cd32421fa90785a.tar.gz
tinycc-9b52e16a50e7ed86b4fec6736cd32421fa90785a.tar.bz2
re-added negative-array-size testcase and fixed fix for it
-rw-r--r--tccgen.c6
-rw-r--r--tests/tcctest.c2
2 files changed, 5 insertions, 3 deletions
diff --git a/tccgen.c b/tccgen.c
index cfa7d8f..e488c65 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -3166,13 +3166,13 @@ static void post_type(CType *type, AttributeDef *ad)
n = -1;
t1 = 0;
if (tok != ']') {
- gexpr();
+ if (!local_stack || nocode_wanted)
+ vpushi(expr_const());
+ else gexpr();
if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {
n = vtop->c.i;
if (n < 0)
error("invalid array size");
- } else if (!local_stack) {
- error("expected constant expression (variably modified array at file scope)");
} else {
if (!is_integer_btype(vtop->type.t & VT_BTYPE))
error("size of variable length array should be an integer");
diff --git a/tests/tcctest.c b/tests/tcctest.c
index 3581a7a..92f239e 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -2083,6 +2083,8 @@ void *bounds_checking_is_enabled()
return (ca != cp + 1) ? cp : NULL;
}
+typedef int constant_negative_array_size_as_compile_time_assertion_idiom[(1 ? 2 : 0) - 1];
+
void c99_vla_test(int size1, int size2)
{
#if defined __i386__ || defined __x86_64__