mirror of
https://github.com/mirror/tinycc.git
synced 2025-01-25 06:00:11 +08:00
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
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;
|
||||
/* array definition */
|
||||
next();
|
||||
if (tok == TOK_RESTRICT1)
|
||||
next();
|
||||
while (1) {
|
||||
/* 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;
|
||||
t1 = 0;
|
||||
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 New Issue
Block a user