fixes first attempt: http://repo.or.cz/w/tinycc.git/commitdiff/31fe1cc
Unified · Split
| @@ -3108,16 +3108,21 @@ static void post_type(CType *type, AttributeDef *ad) · 3107 unmodified lines | ||
| 3108 | 3108 | if (l == 0) |
| 3109 | 3109 | l = FUNC_OLD; |
| 3110 | 3110 | skip(')'); |
| 3111 | − t1 = type->t & VT_STORAGE; | |
| 3112 | 3111 | /* NOTE: const is ignored in returned type as it has a special |
| 3113 | 3112 | meaning in gcc / C++ */ |
| 3114 | − type->t &= ~(VT_STORAGE | VT_CONSTANT); | |
| 3113 | + type->t &= ~VT_CONSTANT; | |
| 3115 | 3114 | /* some ancient pre-K&R C allows a function to return an array |
| 3116 | 3115 | 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 | + } | |
| 3119 | 3122 | /* we push a anonymous symbol which will contain the function prototype */ |
| 3120 | 3123 | ad->func_args = arg_size; |
| 3124 | + t1 = type->t & VT_STORAGE; | |
| 3125 | + type->t &= ~VT_STORAGE; | |
| 3121 | 3126 | s = sym_push(SYM_FIELD, type, INT_ATTR(ad), l); |
| 3122 | 3127 | s->next = first; |
| 3123 | 3128 | type->t = t1 | VT_FUNC; |