1 /* PR c/50584 - No warning for passing small array to C99 static array
2 declarator
3 Verify that redeclarations of functions with pointer parameters to
4 arrays with variable bounds are diagnosed if the bounds don't match
5 either in kind or in the variable expression.
6 { dg-do compile }
7 { dg-options "-Wall -Wvla-parameter" } */
8
9 extern int m, n;
10
11 void pa_ (int (*)[]); // { dg-message "previously declared as 'int \\\(\\\*\\\)\\\[]'" "note" }
12 void pa_ (int (*)[n]); // { dg-warning "\\\[-Wvla-parameter" }
13 void pa_ (int (*)[n + 1]); // { dg-warning "mismatch in bound 1 of argument 1 declared as 'int *\\\(\\\*\\\)\\\[n \\\+ 1\\\]'" }
14
15 void ppa_ (int (**)[]); // { dg-message "previously declared as 'int \\\(\\\*\\\*\\\)\\\[]'" "note" }
16 void ppa_ (int (**)[n]); // { dg-warning "\\\[-Wvla-parameter" }
17 void ppa_ (int (**)[n + 1]); // { dg-warning "mismatch in bound 1 of argument 1 declared as 'int \\\(\\\*\\\*\\\)\\\[n \\\+ 1\\\]'" }
18
19 void pa1 (int (*)[1]); // { dg-message "previously declared as 'int \\\(\\\*\\\)\\\[1]'" "note" }
20 void pa1 (int (*)[n]); // { dg-warning "\\\[-Wvla-parameter" }
21 void pa1 (int (*)[1]);
22 void pa1 (int (*)[n + 1]); // { dg-warning "mismatch in bound 1 of argument 1 declared as 'int *\\\(\\\*\\\)\\\[n \\\+ 1\\\]'" }
23
24 void ppax (int (**)[*]); // { dg-message "previously declared as 'int \\\(\\\*\\\*\\\)\\\[.]'" "note" }
25 void ppax (int (**)[n]); // { dg-warning "\\\[-Wvla-parameter" }
26 /* A VLA with an unspecified bound is represented the same as [0] so
27 so the pretty printer can't differentiate between the two forms. */
28 void ppax (int (**)[1]); // { dg-bogus "\\\[-Warray-parameter" "pr100420 (expected)" { xfail *-*-* } }
29 // { dg-warning "\\\[-Wvla-parameter" "pr100420 (expected)" { xfail *-*-* } .-1 }
30 void ppax (int (**)[n + 1]); // { dg-warning "mismatch in bound 1 of argument 1 declared as 'int *\\\(\\\*\\\*\\\)\\\[n \\\+ 1\\\]'" }
31
32
33 void pa1_n (int (*)[1][n]);
34 void pa1_n (int (*)[1][n]);
35 void pa1_n (int (*)[*][n]); // { dg-warning "mismatch in bound 1 of argument 1 declared as 'int \\\(\\\*\\\)\\\[\\\*]\\\[n]'" "pr100420 (expected)" { xfail *-*-*} }
36 // { dg-warning "mismatch in bound 1 of argument 1 declared as 'int \\\(\\\*\\\)\\\[0]\\\[n]'" "pr100420" { target *-*-* } .-1 }
37
38 void pa1_n_2 (int (*)[1][n][2]);
39 void pa1_n_2 (int (*)[1][n][*]); // { dg-warning "mismatch in bound 3 of argument 1 declared as 'int \\\(\\\*\\\)\\\[1]\\\[n]\\\[\\\*]'" "pr100420 (expected)" { xfail *-*-* } }
40 // { dg-warning "mismatch in bound 3 of argument 1 declared as 'int \\\(\\\*\\\)\\\[1]\\\[n]\\\[0]'" "pr100420" { target *-*-* } .-1 }
41
42
43 void pa1_n_2_a1_n_2 (int (*)[1][n][2], int (*)[1][n][2]);
44 // { dg-message "previously declared as 'int \\\(\\\*\\\)\\\[1]\\\[n]\\\[2]'" "note" { target *-*-* } .-1 }
45 void pa1_n_2_a1_n_2 (int (*)[1][n][2], int (*)[1][n][n]);
46 // { dg-warning "mismatch in bound 3 of argument 2 declared as 'int \\\(\\\*\\\)\\\[1]\\\[n]\\\[n]'" "" { target *-*-* } .-1 }
47 void pa1_n_2_a1_n_2 (int (*)[1][n][2], int (*)[1][3][2]);
48 // { dg-warning "mismatch in bound 2 of argument 2 declared as 'int \\\(\\\*\\\)\\\[1]\\\[3]\\\[2]'" "" { target *-*-* } .-1 }
49 void pa1_n_2_a1_n_2 (int (*)[1][n][2], int (*)[n][n][2]);
50 // { dg-warning "mismatch in bound 1 of argument 2 declared as 'int \\\(\\\*\\\)\\\[n]\\\[n]\\\[2]'" "" { target *-*-* } .-1 }
51 void pa1_n_2_a1_n_2 (int (*)[1][n][n], int (*)[1][n][2]);
52 // { dg-warning "mismatch in bound 3 of argument 1 declared as 'int \\\(\\\*\\\)\\\[1]\\\[n]\\\[n]'" "" { target *-*-* } .-1 }
53 void pa1_n_2_a1_n_2 (int (*)[n][n][2], int (*)[1][n][2]);
54 // { dg-warning "mismatch in bound 1 of argument 1 declared as 'int \\\(\\\*\\\)\\\[n]\\\[n]\\\[2]'" "" { target *-*-* } .-1 }
55 void pa1_n_2_a1_n_2 (int (*)[*][*][*], int (*)[*][*][2]);
56 // { dg-warning "mismatch in bounds 1, 2, 3 of argument 1 declared as 'int \\\(\\\*\\\)\\\[.]\\\[.]\\\[.]'" "" { target *-*-* } .-1 }
57 // { dg-warning "mismatch in bounds 1, 2 of argument 2 declared as 'int \\\(\\\*\\\)\\\[.]\\\[.]\\\[2]'" "" { target *-*-* } .-2 }
58 void pa1_n_2_a1_n_2 (int (*)[1][n][2], int (*)[1][n][2]);
59
60 /* Verify that pointers to arrays of pointers to arrays...etc are handled
61 correctly. */
62 void pa2pampan (int (*(*(*(*)[2])[m])[n]));
63 // { dg-message "previously declared as 'int \\\* \\\(\\\* \\\(\\\* \\\(\\\*\\\)\\\[2]\\\)\\\[m]\\\)\\\[n]'" "note" { target *-*-* } .-1 }
64 void pa2pampan (int (*(*(*(*)[2])[m])[1]));
65 // { dg-warning "mismatch in bound 3 of argument 1 declared as 'int \\\* \\\(\\\* \\\(\\\* \\\(\\\*\\\)\\\[2]\\\)\\\[m]\\\)\\\[1]'" "" { target *-*-* } .-1 }
66 void pa2pampan (int (*(*(*(*)[2])[1])[n]));
67 // { dg-warning "mismatch in bound 2 of argument 1 declared as 'int \\\* \\\(\\\* \\\(\\\* \\\(\\\*\\\)\\\[2]\\\)\\\[1]\\\)\\\[n]'" "" { target *-*-* } .-1 }
68 void pa2pampan (int (*(*(*(*)[2])[m])[n]));