1) recursive types have no storage anymore, so a static int (*p)[x]; declaration is just fine 2) since somewhen VT_VLA doesn't imply VT_ARRAY anymore, so we now need to check VLA in at least one place before checking test_lvalue. ((2) should probably be cleaned up again so that VLA does again imply ARRAY)
Showing the changes to tccgen.c (1 of 2 files). Show all
Unified · Split
| @@ -5018,7 +5018,8 @@ static CType *type_decl(CType *type, AttributeDef *ad, int *v, int td) · 5017 unmodified lines | ||
| 5018 | 5018 | expect("identifier"); |
| 5019 | 5019 | *v = 0; |
| 5020 | 5020 | } |
| 5021 | − post_type(post, ad, storage, td & ~(TYPE_DIRECT|TYPE_ABSTRACT)); | |
| 5021 | + post_type(post, ad, post != ret ? 0 : storage, | |
| 5022 | + td & ~(TYPE_DIRECT|TYPE_ABSTRACT)); | |
| 5022 | 5023 | parse_attribute(ad); |
| 5023 | 5024 | type->t |= storage; |
| 5024 | 5025 | return ret; |
| @@ -5437,7 +5438,7 @@ ST_FUNC void unary(void) · 412 unmodified lines | ||
| 5437 | 5438 | there and in function calls. */ |
| 5438 | 5439 | /* arrays can also be used although they are not lvalues */ |
| 5439 | 5440 | if ((vtop->type.t & VT_BTYPE) != VT_FUNC && |
| 5440 | − !(vtop->type.t & VT_ARRAY)) | |
| 5441 | + !(vtop->type.t & (VT_ARRAY | VT_VLA))) | |
| 5441 | 5442 | test_lvalue(); |
| 5442 | 5443 | if (vtop->sym) |
| 5443 | 5444 | vtop->sym->a.addrtaken = 1; |