History

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.

Joe Soroka committed 15 years ago

Commit 31fe1cc1 parent 5eb82751 file · +8 −5Browse files

Unified · Split

tccgen.c+8−5
@@ -3108,19 +3108,22 @@ static void post_type(CType *type, AttributeDef *ad) · 3107 unmodified lines
31083108 if (l == 0)
31093109 l = FUNC_OLD;
31103110 skip(')');
3111− t1 = type->t & VT_STORAGE;
31123111 /* NOTE: const is ignored in returned type as it has a special
31133112 meaning in gcc / C++ */
3114− type->t &= ~(VT_STORAGE | VT_CONSTANT);
3113+ type->t &= ~VT_CONSTANT;
31153114 /* some ancient pre-K&R C allows a function to return an array
31163115 and the array brackets to be put after the arguments, such
3117− that "int c()[]" means the same as "int[] c()" */
3118− post_type(type, ad);
3116+ that "int c()[]" means something like "int[] c()" */
3117+ if (tok == '[') {
3118+ next();
3119+ skip(']'); /* only handle simple "[]" */
3120+ type->t |= VT_PTR;
3121+ }
31193122 /* we push a anonymous symbol which will contain the function prototype */
31203123 ad->func_args = arg_size;
31213124 s = sym_push(SYM_FIELD, type, INT_ATTR(ad), l);
31223125 s->next = first;
3123− type->t = t1 | VT_FUNC;
3126+ type->t |= VT_FUNC;
31243127 type->ref = s;
31253128 } else if (tok == '[') {
31263129 /* array definition */