aboutsummaryrefslogtreecommitdiff
path: root/tccgen.c
diff options
context:
space:
mode:
authorJoe Soroka <gits@joesoroka.com>2011-03-08 01:47:31 -0800
committerJoe Soroka <gits@joesoroka.com>2011-03-08 01:47:31 -0800
commit89059f94c08b6da87fcbd98fba2b5876c0bde3bd (patch)
tree0fa55e20b87baebf78e505aa60c7c5b00f12ca2e /tccgen.c
parent772b302187c9d1b810f7dfe0732aef78d286e317 (diff)
downloadtinycc-89059f94c08b6da87fcbd98fba2b5876c0bde3bd.tar.gz
tinycc-89059f94c08b6da87fcbd98fba2b5876c0bde3bd.tar.bz2
refactor post_type() to be explicit about its recursion
Diffstat (limited to 'tccgen.c')
-rw-r--r--tccgen.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/tccgen.c b/tccgen.c
index 78a2bad..c4c3c46 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -3048,7 +3048,9 @@ static void asm_label_instr(CString *astr)
#endif
}
-static void post_type(CType *type, AttributeDef *ad)
+static void post_type_array(CType *type, AttributeDef *ad);
+
+static void post_type_args(CType *type, AttributeDef *ad)
{
int n, l, t1, arg_size, align;
Sym **plast, *s, *first;
@@ -3114,14 +3116,23 @@ static void post_type(CType *type, AttributeDef *ad)
/* some ancient pre-K&R C allows a function to return an array
and the array brackets to be put after the arguments, such
that "int c()[]" means the same as "int[] c()" */
- post_type(type, ad);
+ if (tok == '[')
+ post_type_array(type, ad);
/* we push a anonymous symbol which will contain the function prototype */
ad->func_args = arg_size;
s = sym_push(SYM_FIELD, type, INT_ATTR(ad), l);
s->next = first;
type->t = t1 | VT_FUNC;
type->ref = s;
- } else if (tok == '[') {
+ }
+}
+
+static void post_type_array(CType *type, AttributeDef *ad)
+{
+ int n, t1;
+ Sym *s;
+
+ if (tok == '[') {
/* array definition */
next();
if (tok == TOK_RESTRICT1)
@@ -3136,7 +3147,8 @@ static void post_type(CType *type, AttributeDef *ad)
/* parse next post type */
t1 = type->t & VT_STORAGE;
type->t &= ~VT_STORAGE;
- post_type(type, ad);
+ if (tok == '[')
+ post_type_array(type, ad);
/* we push a anonymous symbol which will contain the array
element type */
@@ -3210,7 +3222,10 @@ static void type_decl(CType *type, AttributeDef *ad, int *v, int td)
*v = 0;
}
}
- post_type(type, ad);
+ if (tok == '(')
+ post_type_args(type, ad);
+ else if (tok == '[')
+ post_type_array(type, ad);
if (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2)
parse_attribute(ad);