aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgrischka <grischka>2016-05-05 20:04:00 +0200
committergrischka <grischka>2016-05-05 20:04:00 +0200
commitd48662d49650099e5ab9e1fe218311a18c2ff73a (patch)
tree4af92eb69304fdef3e48c6ddb1a8972df80f0855
parentfe845cf53da206bb28f6b49a0878b0118b4f242b (diff)
downloadtinycc-d48662d49650099e5ab9e1fe218311a18c2ff73a.tar.gz
tinycc-d48662d49650099e5ab9e1fe218311a18c2ff73a.tar.bz2
tccgen: scopes levels for local symbols (update 1)
Catch top level redeclarations too. Also fix mistakes in tcctest.c and the tcc sources (win32) showing up now.
-rw-r--r--elf.h3
-rw-r--r--tccgen.c11
-rw-r--r--tests/tcctest.c2
-rw-r--r--win32/include/_mingw.h11
-rw-r--r--win32/include/stdint.h3
5 files changed, 19 insertions, 11 deletions
diff --git a/elf.h b/elf.h
index 52ccf3f..ecabafa 100644
--- a/elf.h
+++ b/elf.h
@@ -28,13 +28,12 @@ typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef long long int int64_t;
-#endif
-
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long int uint64_t;
#endif
+#endif
/* Standard ELF types. */
diff --git a/tccgen.c b/tccgen.c
index 042fb92..6954d3a 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -239,11 +239,10 @@ ST_FUNC Sym *sym_push(int v, CType *type, int r, int c)
ps = &ts->sym_identifier;
s->prev_tok = *ps;
*ps = s;
- if (local_scope) {
- s->scope = local_scope;
- if (s->prev_tok && s->prev_tok->scope == s->scope)
- tcc_error("redeclaration of '%s'", get_tok_str(v & ~SYM_STRUCT, NULL));
- }
+ s->scope = local_scope;
+ if (s->prev_tok && s->prev_tok->scope == s->scope)
+ tcc_error("redeclaration of '%s'",
+ get_tok_str(v & ~SYM_STRUCT, NULL));
}
return s;
}
@@ -2929,6 +2928,8 @@ static void struct_decl(CType *type, AttributeDef *ad, int u)
expect("struct/union/enum name");
s = struct_find(v);
if (s && s->type.t == a) {
+ if (0 == local_scope)
+ goto do_decl; /* compatibility with past behavior */
if (tok != '{' && tok != ';')
goto do_decl; /* variable declaration: 'struct s x;' */
if (s->scope == local_scope && (s->c == -1 || tok != '{'))
diff --git a/tests/tcctest.c b/tests/tcctest.c
index 823a657..14cf5f3 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -2303,7 +2303,9 @@ void c99_vla_test(int size1, int size2)
#endif
}
+#ifndef __TINYC__
typedef __SIZE_TYPE__ uintptr_t;
+#endif
void sizeof_test(void)
{
diff --git a/win32/include/_mingw.h b/win32/include/_mingw.h
index e400814..416d8dc 100644
--- a/win32/include/_mingw.h
+++ b/win32/include/_mingw.h
@@ -100,16 +100,19 @@ typedef __time64_t time_t;
#define _TIME_T_DEFINED
#endif
+#if 0 // defined in stddef.h
typedef unsigned long size_t;
-#define _SIZE_T_DEFINED
typedef long ssize_t;
+typedef unsigned short wchar_t;
+#endif
+#define _SIZE_T_DEFINED
#define _SSIZE_T_DEFINED
+#define _WCHAR_T_DEFINED
-typedef unsigned int wint_t;
typedef unsigned short wctype_t;
+typedef unsigned int wint_t;
#define _WCTYPE_T_DEFINED
-typedef unsigned short wchar_t;
-#define _WCHAR_T_DEFINED
+#define _WINT_T
typedef int errno_t;
#define _ERRCODE_DEFINED
diff --git a/win32/include/stdint.h b/win32/include/stdint.h
index 1f81fcc..cdebf44 100644
--- a/win32/include/stdint.h
+++ b/win32/include/stdint.h
@@ -31,6 +31,8 @@
#define __need_wchar_t
#include "stddef.h"
+#ifndef __int8_t_defined
+#define __int8_t_defined
/* 7.18.1.1 Exact-width integer types */
typedef signed char int8_t;
typedef unsigned char uint8_t;
@@ -40,6 +42,7 @@ typedef int int32_t;
typedef unsigned uint32_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;
+#endif
/* 7.18.1.2 Minimum-width integer types */
typedef signed char int_least8_t;