Don't fail on const/restrict/static/* inside []
This patch makes tcc ignore them. Normally (as per the C standard), They should be only applicable inside parameter arrays and affect (const/restrict) the pointer the array gets converted to. [matz: fix formatting, add volatile handling, add testcase, add comment about above deficiency]
This commit is contained in:
parent
d6d3cf00ec
commit
ef668aae1e
3 changed files with 51 additions and 2 deletions
19
tccgen.c
19
tccgen.c
|
@ -4348,8 +4348,23 @@ static int post_type(CType *type, AttributeDef *ad, int storage, int td)
|
||||||
int saved_nocode_wanted = nocode_wanted;
|
int saved_nocode_wanted = nocode_wanted;
|
||||||
/* array definition */
|
/* array definition */
|
||||||
next();
|
next();
|
||||||
if (tok == TOK_RESTRICT1)
|
while (1) {
|
||||||
next();
|
/* XXX The optional type-quals and static should only be accepted
|
||||||
|
in parameter decls. The '*' as well, and then even only
|
||||||
|
in prototypes (not function defs). */
|
||||||
|
switch (tok) {
|
||||||
|
case TOK_RESTRICT1: case TOK_RESTRICT2: case TOK_RESTRICT3:
|
||||||
|
case TOK_CONST1:
|
||||||
|
case TOK_VOLATILE1:
|
||||||
|
case TOK_STATIC:
|
||||||
|
case '*':
|
||||||
|
next();
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
n = -1;
|
n = -1;
|
||||||
t1 = 0;
|
t1 = 0;
|
||||||
if (tok != ']') {
|
if (tok != ']') {
|
||||||
|
|
34
tests/tests2/100_c99array-decls.c
Normal file
34
tests/tests2/100_c99array-decls.c
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
void foo(int [5]);
|
||||||
|
void fooc(int x[const 5]);
|
||||||
|
void foos(int x[static 5]);
|
||||||
|
void foov(int x[volatile 5]);
|
||||||
|
void foor(int x[restrict 5]);
|
||||||
|
void fooc(int [const 5]);
|
||||||
|
void foos(int [static 5]);
|
||||||
|
void foov(int [volatile 5]);
|
||||||
|
void foor(int [restrict 5]);
|
||||||
|
void fooc(int (* const x));
|
||||||
|
void foos(int *x);
|
||||||
|
void foov(int * volatile x);
|
||||||
|
void foor(int * restrict x);
|
||||||
|
void fooc(int x[volatile 5])
|
||||||
|
{
|
||||||
|
x[3] = 42;
|
||||||
|
#ifdef INVALID
|
||||||
|
x = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
void foovm(int x[const *]);
|
||||||
|
void foovm(int * const x);
|
||||||
|
#ifdef INVALID
|
||||||
|
void wrongc(int x[3][const 4]);
|
||||||
|
void wrongvm(int x[static *]);
|
||||||
|
void foovm(int x[const *])
|
||||||
|
{
|
||||||
|
x[2] = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
0
tests/tests2/100_c99array-decls.expect
Normal file
0
tests/tests2/100_c99array-decls.expect
Normal file
Loading…
Reference in a new issue