From 31fe1cc62b30e52d35dfd669dc9bc3dbb5a8ad8e Mon Sep 17 00:00:00 2001 From: Joe Soroka Date: Tue, 8 Mar 2011 14:13:08 -0800 Subject: [PATCH] clarify support for functions returning an array previously, tcc would accept a prototype of a function returning an array, but not giving those functions bodies nor calling them. it seems that gcc has never supported them, so we should probably just error out... but it's possible that someone already using tcc includes some header that contains an unused prototype for one, so let's continue to support that. --- tccgen.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tccgen.c b/tccgen.c index b3355276..172f8c71 100644 --- a/tccgen.c +++ b/tccgen.c @@ -3108,19 +3108,22 @@ static void post_type(CType *type, AttributeDef *ad) if (l == 0) l = FUNC_OLD; skip(')'); - t1 = type->t & VT_STORAGE; /* NOTE: const is ignored in returned type as it has a special meaning in gcc / C++ */ - type->t &= ~(VT_STORAGE | VT_CONSTANT); + type->t &= ~VT_CONSTANT; /* 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); + that "int c()[]" means something like "int[] c()" */ + if (tok == '[') { + next(); + skip(']'); /* only handle simple "[]" */ + type->t |= VT_PTR; + } /* 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->t |= VT_FUNC; type->ref = s; } else if (tok == '[') { /* array definition */ -- 2.11.4.GIT