blob: 6e4df02969c56f00ee52ca400518d994c23b35ea [file] [log] [blame]
/* PR c/50584 - No warning for passing small array to C99 static array
declarator
Verify the -Wvla-parameter warnings correctly diagnose mismatches
between one-dimensional VLA and non-VLA arguments in redeclarations
of the same function.
Also verify that the array/pointer argument form in a mismatched
redeclaration doesn't override the form in the initial declaration.
{ dg-do compile }
{ dg-options "-Wall -Wvla-parameter" } */
/* Verify that redeclaring an argument as a VLA with an unspecified
bound that was first declared as an ordinary array with an unspecified
bound triggers a warning. */
void f1ia_x (int[]); // { dg-message "previously declared as an ordinary array 'int\\\[]'" "note" }
void f1ia_x (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
void f1ia_x (int[]);
void f1ia_x (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
/* Also verify that a definition of the same form as the first declaration
doesn't trigger a warning and doesn't prevent warnings for subsequent
mismatches. */
void f1ia_x (int a[]) { (void)&a;}
void f1ia_x (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
/* Repeat the above but starting with an ordinary array with a constant
bound. */
void f1ia1x (int[1]); // { dg-message "previously declared as an ordinary array 'int\\\[1]'" "note" }
void f1ia1x (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
void f1ia1x (int a[1]) { (void)&a; }
void f1ia1x (int[1]);
void f1ia1x (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
void f1ipx (int*); // { dg-message "previously declared as a pointer 'int ?\\\*'" "note" }
void f1ipx (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
void f1ipx (int*);
void f1ipx (int *p) { (void)&p; }
void f1ipx (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
void f1ipx (int*);
void f2ipx (int*, int*); // { dg-message "previously declared as a pointer 'int ?\\\*'" "note" }
void f2ipx (int*, int[*]); // { dg-warning "argument 2 of type 'int\\\[\\\*]' declared as a variable length array" }
void f2ipx (int*, int*);
void f2ipx (int*, int[*]); // { dg-warning "argument 2 of type 'int\\\[\\\*]' declared as a variable length array" }
void f2ipx (int *p, int *q) { (void)&p; (void)&q; }
void f2ipx (int*, int[*]); // { dg-warning "argument 2 of type 'int\\\[\\\*]' declared as a variable length array" }
void f1ias2x (int[static 2]); // { dg-message "previously declared as an ordinary array 'int\\\[static 2]'" }
void f1ias2x (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
void f1ias2x (int[static 2]);
void f1ias2x (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
void f1ias2x (int a[static 2]) { (void)&a; }
void f1ias2x (int[*]); // { dg-warning "argument 1 of type 'int\\\[\\\*]' declared as a variable length array" }
void f1ias2x (int[static 2]);
extern int nelts;
void f1sa_var (short[]); // { dg-message "previously declared as an ordinary array 'short int\\\[]'" }
void f1sa_var (short[nelts]); // { dg-warning "argument 1 of type 'short int\\\[nelts]' declared as a variable length array" }
void f1sa_var (short[]);
void f1sa_var (short[nelts]); // { dg-warning "argument 1 of type 'short int\\\[nelts]' declared as a variable length array" }
void f1sa_var (short a[]) { (void)&a; }
void f1sa_var (short[nelts]); // { dg-warning "argument 1 of type 'short int\\\[nelts]' declared as a variable length array" }
void f1sa_var (short[]);
void f1sa_expr (int[]); // { dg-message "previously declared as an ordinary array 'int\\\[]'" }
void f1sa_expr (int[nelts + 1]); // { dg-warning "argument 1 of type 'int\\\[nelts \\\+ 1]' declared as a variable length array" }
void f1sa_expr (int[]);
void f1sa_expr (int[nelts * 2]); // { dg-warning "argument 1 of type 'int\\\[nelts \\\* 2]' declared as a variable length array" }
void f1sa_expr (int a[]) { (void)&a; }
void f1sa_expr (int[nelts / 3]); // { dg-warning "argument 1 of type 'int\\\[nelts / 3]' declared as a variable length array" }
void f1sa_expr (int[]);
extern int f (int);
void f1ia_f (int[]); // { dg-message "previously declared as an ordinary array 'int\\\[]'" }
void f1ia_f (int[f (1)]); // { dg-warning "argument 1 of type 'int\\\[f *\\\(1\\\)]' declared as a variable length array" }
void f1ia_f (int[]);
void f1ia_f (int[f (2)]); // { dg-warning "argument 1 of type 'int\\\[f *\\\(2\\\)]' declared as a variable length array" }
void f1ia_f (int a[]) { (void)&a; }
void f1ia_f (int[f (3)]); // { dg-warning "argument 1 of type 'int\\\[f *\\\(3\\\)]' declared as a variable length array" }
void f1ia_f (int[f (4)]); // { dg-warning "argument 1 of type 'int\\\[f *\\\(4\\\)]' declared as a variable length array" }
void f1ia_f (int[]);
void f1iaf0_f1 (int[f (0)]); // { dg-message "previously declared as 'int\\\[f *\\\(0\\\)]'" }
void f1iaf0_f1 (int[f (1)]); // { dg-warning "argument 1 of type 'int\\\[f *\\\(1\\\)]' declared with mismatched bound" }
void f1iaf0_f1 (int[f (0)]);
void f1iaf0_f1 (int[f (1)]); // { dg-warning "argument 1 of type 'int\\\[f *\\\(1\\\)]' declared with mismatched bound" }
void f1iaf0_f1 (int a[f (0)]) { (void)&a; }
void f1iaf0_f1 (int[f (1)]); // { dg-warning "argument 1 of type 'int\\\[f *\\\(1\\\)]' declared with mismatched bound" }
void f1iaf0_f1 (int[f (0)]);
void f1la_ (long[]); // { dg-message "previously declared as an ordinary array 'long int\\\[]'" }
void f1la_ (long[nelts]); // { dg-warning "argument 1 of type 'long int\\\[nelts]' declared as a variable length array" }
void f1la_ (long[]);
void f1la_ (long a[nelts]) // { dg-warning "argument 1 of type 'long int\\\[nelts]' declared as a variable length array" }
{ (void)&a; }
void f1la_ (long[]);
void f2ca_ (int, char[]); // { dg-message "previously declared as an ordinary array 'char\\\[]'" }
void f2ca_ (int n, char[n]); // { dg-warning "argument 2 of type 'char\\\[n]' declared as a variable length array" }
void f2ca_ (int, char[]);
void f2ca_ (int n, char a[n]) // { dg-warning "argument 2 of type 'char\\\[n]' declared as a variable length array" }
{ (void)&n; (void)&a; }
void f2ia1_f (int n, int[n]); // { dg-message "previously declared as 'int\\\[n]' with bound argument 1" }
void f2ia1_f (int, int[f (0)]); // { dg-warning "argument 2 of type 'int\\\[f *\\\(0\\\)]' declared with mismatched bound 'f *\\\(0\\\)'" }
void f2ia1_f (int m, int[m]);
void f2ia1_f (int, int[f (1)]); // { dg-warning "argument 2 of type 'int\\\[f *\\\(1\\\)]' declared with mismatched bound 'f *\\\(1\\\)'" }
void f2ia1_f (int x, int a[x]) { (void)&x; (void)&a; }
void f2ia1_f (int, int[f (2)]); // { dg-warning "argument 2 of type 'int\\\[f *\\\(2\\\)]' declared with mismatched bound 'f *\\\(2\\\)'" }
void f2ia1_f (int y, int[y]);
void f2iaf_1 (int, int[f (0)]); // { dg-message "previously declared as 'int\\\[f *\\\(0\\\)]'" }
void f2iaf_1 (int n, int[n]); // { dg-warning "argument 2 of type 'int\\\[n]' declared with mismatched bound argument 1" }
void f2iaf_1 (int, int[f (0)]);
void f2iaf_1 (int m, int[m]); // { dg-warning "argument 2 of type 'int\\\[m]' declared with mismatched bound argument 1" }
void f2iaf_1 (int x, int a[f (0)]) { (void)&x; (void)&a; }
void f2iaf_1 (int y, int[y]); // { dg-warning "argument 2 of type 'int\\\[y]' declared with mismatched bound argument 1" }
void f3ia1 (int n, int, int[n]); // { dg-message "previously declared as 'int\\\[n]' with bound argument 1" }
void f3ia1 (int, int n, int[n]); // { dg-warning "argument 3 of type 'int\\\[n]' declared with mismatched bound argument 2" }
void f3ia1 (int n, int, int[n]);
extern int g (int);
void f1iaf_g (int[f (1)]); // { dg-message "previously declared as 'int\\\[f *\\\(1\\\)]'" }
void f1iaf_g (int[g (1)]); // { dg-warning "argument 1 of type 'int\\\[g *\\\(1\\\)]' declared with mismatched bound" }
void f1iaf_g (int[f (1)]);
void nrf1iaf_g (int[f (1)]); // { dg-message "previously declared as 'int\\\[f *\\\(1\\\)]'" }
__attribute__ ((nonnull))
void nrf1iaf_g (int[g (1)]); // { dg-warning "argument 1 of type 'int\\\[g *\\\(1\\\)]' declared with mismatched bound" }
__attribute__ ((noreturn))
void nrf1iaf_g (int[f (1)]);