aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tcc.h4
-rw-r--r--tccgen.c6
2 files changed, 9 insertions, 1 deletions
diff --git a/tcc.h b/tcc.h
index 98f28db..5ed3e21 100644
--- a/tcc.h
+++ b/tcc.h
@@ -389,9 +389,10 @@ typedef struct AttributeDef {
func_export : 1,
func_import : 1,
func_args : 5,
+ func_proto : 1,
mode : 4,
weak : 1,
- fill : 11;
+ fill : 10;
struct Section *section;
int alias_target; /* token */
} AttributeDef;
@@ -401,6 +402,7 @@ typedef struct AttributeDef {
#define FUNC_EXPORT(r) (((AttributeDef*)&(r))->func_export)
#define FUNC_IMPORT(r) (((AttributeDef*)&(r))->func_import)
#define FUNC_ARGS(r) (((AttributeDef*)&(r))->func_args)
+#define FUNC_PROTO(r) (((AttributeDef*)&(r))->func_proto)
#define FUNC_ALIGN(r) (((AttributeDef*)&(r))->aligned)
#define FUNC_PACKED(r) (((AttributeDef*)&(r))->packed)
#define ATTR_MODE(r) (((AttributeDef*)&(r))->mode)
diff --git a/tccgen.c b/tccgen.c
index 4849b6c..a937358 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -5818,6 +5818,10 @@ static int decl0(int l, int is_for_loop_init)
goto func_error1;
r = sym->type.ref->r;
+
+ if (!FUNC_PROTO(r))
+ tcc_error("redefinition of '%s'", get_tok_str(v, NULL));
+
/* use func_call from prototype if not defined */
if (FUNC_CALL(r) != FUNC_CDECL
&& FUNC_CALL(type.ref->r) == FUNC_CDECL)
@@ -5836,6 +5840,7 @@ static int decl0(int l, int is_for_loop_init)
tcc_error("incompatible types for redefinition of '%s'",
get_tok_str(v, NULL));
}
+ FUNC_PROTO(type.ref->r) = 0;
/* if symbol is already defined, then put complete type */
sym->type = type;
} else {
@@ -5901,6 +5906,7 @@ static int decl0(int l, int is_for_loop_init)
if ((type.t & VT_BTYPE) == VT_FUNC) {
/* external function definition */
/* specific case for func_call attribute */
+ ad.func_proto = 1;
type.ref->r = INT_ATTR(&ad);
} else if (!(type.t & VT_ARRAY)) {
/* not lvalue if array */