aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/Wvla-parameter.c
blob: 6e4df02969c56f00ee52ca400518d994c23b35ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* 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)]);