diff options
| author | Michael Matz <matz@suse.de> | 2017-05-07 08:10:06 +0200 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2017-05-07 08:10:06 +0200 |
| commit | 94ac9f2b4952fbd77bfdf39e753fcbca3e472883 (patch) | |
| tree | 64ae33f596c660b2cbf028a006e2ab6a9251773a | |
| parent | 5732a1882e3a0fa74e766049f71ec3b7c51808f3 (diff) | |
| download | tinycc-94ac9f2b4952fbd77bfdf39e753fcbca3e472883.tar.gz tinycc-94ac9f2b4952fbd77bfdf39e753fcbca3e472883.tar.bz2 | |
Accept extern initialized file-scope variables
'extern int i = 42;' at file scope (but not in function scope!) is
allowed and is a proper definition, even though questionable style;
some compilers warn about this.
| -rw-r--r-- | tccgen.c | 3 | ||||
| -rw-r--r-- | tests/tcctest.c | 2 |
2 files changed, 4 insertions, 1 deletions
@@ -6955,7 +6955,8 @@ found: has_init = (tok == '='); if (has_init && (type.t & VT_VLA)) tcc_error("variable length array cannot be initialized"); - if ((type.t & VT_EXTERN) || ((type.t & VT_BTYPE) == VT_FUNC) || + if (((type.t & VT_EXTERN) && (!has_init || l != VT_CONST)) || + ((type.t & VT_BTYPE) == VT_FUNC) || ((type.t & VT_ARRAY) && (type.t & VT_STATIC) && !has_init && l == VT_CONST && type.ref->c < 0)) { /* external variable or function */ diff --git a/tests/tcctest.c b/tests/tcctest.c index b6e4116..3a4860a 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -1752,6 +1752,8 @@ arrtype2 sinit22 = {5,6,7}; int sinit23[2] = { "astring" ? sizeof("astring") : -1, &sinit23 ? 42 : -1 }; +extern int external_inited = 42; + void init_test(void) { int linit1 = 2; |
