PR c/100619 - ICE on a VLA parameter with too many dimensions
gcc/c-family/ChangeLog: PR c/100619 * c-attribs.c (build_attr_access_from_parms): Handle arbitrarily many bounds. gcc/testsuite/ChangeLog: PR c/100619 * gcc.dg/pr100619.c: New test.
This commit is contained in:
parent
dc6758f03e
commit
eb2a917fa0
2 changed files with 49 additions and 11 deletions
|
@ -5043,16 +5043,25 @@ build_attr_access_from_parms (tree parms, bool skip_voidptr)
|
|||
/* Create the attribute access string from the arg spec string,
|
||||
optionally followed by position of the VLA bound argument if
|
||||
it is one. */
|
||||
char specbuf[80];
|
||||
int len = snprintf (specbuf, sizeof specbuf, "%c%u%s",
|
||||
attr_access::mode_chars[access_deferred],
|
||||
argpos, s);
|
||||
gcc_assert ((size_t) len < sizeof specbuf);
|
||||
{
|
||||
size_t specend = spec.length ();
|
||||
if (!specend)
|
||||
{
|
||||
spec = '+';
|
||||
specend = 1;
|
||||
}
|
||||
|
||||
if (!spec.length ())
|
||||
spec += '+';
|
||||
|
||||
spec += specbuf;
|
||||
/* Format the access string in place. */
|
||||
int len = snprintf (NULL, 0, "%c%u%s",
|
||||
attr_access::mode_chars[access_deferred],
|
||||
argpos, s);
|
||||
spec.resize (specend + len + 1);
|
||||
sprintf (&spec[specend], "%c%u%s",
|
||||
attr_access::mode_chars[access_deferred],
|
||||
argpos, s);
|
||||
/* Trim the trailing NUL. */
|
||||
spec.resize (specend + len);
|
||||
}
|
||||
|
||||
/* The (optional) list of expressions denoting the VLA bounds
|
||||
N in ARGTYPE <arg>[Ni]...[Nj]...[Nk]. */
|
||||
|
@ -5077,8 +5086,13 @@ build_attr_access_from_parms (tree parms, bool skip_voidptr)
|
|||
{
|
||||
/* BOUND previously seen in the parameter list. */
|
||||
TREE_PURPOSE (vb) = size_int (*psizpos);
|
||||
sprintf (specbuf, "$%u", *psizpos);
|
||||
spec += specbuf;
|
||||
/* Format the position string in place. */
|
||||
int len = snprintf (NULL, 0, "$%u", *psizpos);
|
||||
size_t specend = spec.length ();
|
||||
spec.resize (specend + len + 1);
|
||||
sprintf (&spec[specend], "$%u", *psizpos);
|
||||
/* Trim the trailing NUL. */
|
||||
spec.resize (specend + len);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
24
gcc/testsuite/gcc.dg/pr100619.c
Normal file
24
gcc/testsuite/gcc.dg/pr100619.c
Normal file
|
@ -0,0 +1,24 @@
|
|||
/* PR c/100619 - ICE on a VLA parameter with too many dimensions
|
||||
{ dg-do compile }
|
||||
{ dg-options "-Wall" } */
|
||||
|
||||
extern int n;
|
||||
|
||||
#define A10 [n][n][n][n][n][n][n][n][n][n]
|
||||
#define A100 A10 A10 A10 A10 A10 A10 A10 A10 A10 A10 A10
|
||||
#define A1000 A100 A100 A100 A100 A100 A100 A100 A100 A100 A100 A100
|
||||
|
||||
void f10 (int A10);
|
||||
void f10 (int A10);
|
||||
|
||||
void f100 (int A100);
|
||||
void f100 (int A100);
|
||||
|
||||
void f1000 (int A1000);
|
||||
void f1000 (int A1000);
|
||||
|
||||
void fx_1000 (int [ ]A1000);
|
||||
void fx_1000 (int [1]A1000); // { dg-warning "-Warray-parameter" }
|
||||
|
||||
void fn_1000 (int [n ]A1000);
|
||||
void fn_1000 (int [n + 1]A1000); // { dg-warning "-Wvla-parameter" }
|
Loading…
Add table
Reference in a new issue