1 /* PR c/50584 - No warning for passing small array to C99 static array
3 Verify the -Wvla-parameter warnings correctly diagnose mismatches
4 between multimensional array arguments with one or more variable
5 bounds in redeclarations of the same function.
7 { dg-options "-Wall -Wvla-parameter" } */
9 void fmn_a1n_axn (int n
, int[1][n
]); // { dg-message "previously declared as 'int\\\[1]\\\[n]' with 1 variable bound" "note" }
10 void fmn_a1n_axn (int n
, int[*][n
]); // { dg-warning "argument 2 of type 'int\\\[\\\*]\\\[n]' declared with 2 variable bounds" }
13 void fmn_axn_a2n (int n
, int[*][n
]); // { dg-message "previously declared as 'int\\\[\\\*]\\\[n]' with 2 variable bounds" "note" }
14 void fmn_axn_a2n (int n
, int[2][n
]); // { dg-warning "argument 2 of type 'int\\\[2]\\\[n]' declared with 1 variable bound" }
17 void fmn_amn_axn (int m
, int n
, int[m
][n
]); // { dg-message "previously declared as 'int\\\[m]\\\[n]' with 0 unspecified variable bounds" "note" }
18 void fmn_amn_axn (int m
, int n
, int[*][n
]); // { dg-warning "argument 3 of type 'int\\\[\\\*]\\\[n]' declared with 1 unspecified variable bound" }
20 // Same as above but a different function name.
21 void gmn_amn_axn (int m
, int n
, int[m
][n
]); // { dg-message "previously declared as 'int\\\[m]\\\[n]' with 0 unspecified variable bounds" "note" }
22 void gmn_amn_axn (int m
, int n
, int[*][n
]); // { dg-warning "argument 3 of type 'int\\\[\\\*]\\\[n]' declared with 1 unspecified variable bound" }
26 void fm_A7_m_5 (int m
, A7
[m
][5]); // { dg-message "previously declared as 'int\\\[m]\\\[5]\\\[7]' with bound argument 1" "note" }
27 void fm_A7_m_5 (int n
, A7
[n
][5]);
29 void fm_A7_m_5 (int n
, A7
[n
+ 1][5]); // { dg-warning "argument 2 of type 'int\\\[n \\\+ 1]\\\[5]\\\[7]' declared with mismatched bound 'n \\\+ 1'" }
32 int n1
, n2
, n3
, n4
, n5
, n6
, n7
, n8
, n9
;
33 void f (int[n1
][2][n3
][4][n5
][6][n7
][8][n9
]); // { dg-message "previously declared as 'int\\\[n1]\\\[2]\\\[n3]\\\[4]\\\[n5]\\\[6]\\\[n7]\\\[8]\\\[n9]' with 0 unspecified variable bounds" "note" }
34 // { dg-message "with 5 variable bounds" "note" { target *-*-* } .-1 }
35 void f (int[n1
][2][n3
][4][n5
][6][n7
][8][n9
]);
37 /* Due to a limitation and because [*] is represented the same as [0]
38 only the most significant array bound is rendered as [*]; the others
39 are rendered as [0]. */
40 void f (int[n1
][2][n3
][4][n5
][6][n7
][8][*]); // { dg-warning "argument 1 of type 'int\\\[n1]\\\[2]\\\[n3]\\\[4]\\\[n5]\\\[6]\\\[n7]\\\[8]\\\[\\\*]' declared with 1 unspecified variable bound" "pr100420 (expected)" { xfail *-*-* } }
41 // { dg-warning "argument 1 of type 'int\\\[n1]\\\[2]\\\[n3]\\\[4]\\\[n5]\\\[6]\\\[n7]\\\[8]\\\[0]' declared with 1 unspecified variable bound" "pr100420" { target *-*-* } .-1 }
42 void f (int[n1
][2][n3
][4][n5
][6][*][8][n9
]); // { dg-warning "argument 1 of type 'int\\\[n1]\\\[2]\\\[n3]\\\[4]\\\[n5]\\\[6]\\\[\\\*]\\\[8]\\\[n9]' declared with 1 unspecified variable bound" "pr100420 (expected)" { xfail *-*-* } }
43 // { dg-warning "argument 1 of type 'int\\\[n1]\\\[2]\\\[n3]\\\[4]\\\[n5]\\\[6]\\\[0]\\\[8]\\\[n9]' declared with 1 unspecified variable bound" "pr100420" { target *-*-* } .-1 }
44 void f (int[n1
][2][n3
][4][*][6][n7
][8][n9
]); // { dg-warning "argument 1 of type 'int\\\[n1]\\\[2]\\\[n3]\\\[4]\\\[\\\*]\\\[6]\\\[n7]\\\[8]\\\[n9]' declared with 1 unspecified variable bound" "pr100420 (expected)" { xfail *-*-*} }
45 // { dg-warning "argument 1 of type 'int\\\[n1]\\\[2]\\\[n3]\\\[4]\\\[0]\\\[6]\\\[n7]\\\[8]\\\[n9]' declared with 1 unspecified variable bound" "pr100420" { target *-*-* } .-1 }
46 void f (int[n1
][2][*][4][n5
][6][n7
][8][n9
]); // { dg-warning "argument 1 of type 'int\\\[n1]\\\[2]\\\[\\\*]\\\[4]\\\[n5]\\\[6]\\\[n7]\\\[8]\\\[n9]' declared with 1 unspecified variable bound" "pr100420 (expected)" { xfail *-*-* } }
47 // { dg-warning "argument 1 of type 'int\\\[n1]\\\[2]\\\[0]\\\[4]\\\[n5]\\\[6]\\\[n7]\\\[8]\\\[n9]' declared with 1 unspecified variable bound" "pr100420" { target *-*-* } .-1 }
48 void f (int[*][2][n3
][4][n5
][6][n7
][8][n9
]); // { dg-warning "argument 1 of type 'int\\\[\\\*]\\\[2]\\\[n3]\\\[4]\\\[n5]\\\[6]\\\[n7]\\\[8]\\\[n9]' declared with 1 unspecified variable bound" }
50 void f (int[n1
][n2
][n3
][n4
][n5
][n6
][n7
][n8
][n9
]); // { dg-warning "argument 1 of type 'int\\\[n1]\\\[n2]\\\[n3]\\\[n4]\\\[n5]\\\[n6]\\\[n7]\\\[n8]\\\[n9]' declared with 9 variable bounds" }
52 // Verify that arrays of pointers to arrays...etc are handled correctly.
53 void a2pampan (int (*(*(*[2])[n1
])[n2
]));
54 // { dg-message "previously declared as 'int \\\* \\\(\\\* \\\(\\\*\\\[2]\\\)\\\[n1]\\\)\\\[n2]'" "note" { target *-*-* } .-1 }
55 void a2pampan (int (*(*(*[2])[n1
])[1]));
56 // { dg-warning "argument 1 of type 'int \\\* \\\(\\\* \\\(\\\*\\\[2]\\\)\\\[n1]\\\)\\\[1]' declared with 1 variable bound" "" { target *-*-* } .-1 }
57 void a2pampan (int (*(*(*[2])[1])[n2
]));
58 // { dg-warning "argument 1 of type 'int \\\* \\\(\\\* \\\(\\\*\\\[2]\\\)\\\[1]\\\)\\\[n2]' declared with 1 variable bound" "" { target *-*-* } .-1 }
59 void a2pampan (int (*(*(*[2])[n1
])[n1
]));
60 // { dg-warning "argument 1 of type 'int \\\* \\\(\\\* \\\(\\\*\\\[2]\\\)\\\[n1]\\\)\\\[n1]' declared with mismatched bound 'n1'" "" { target *-*-* } .-1 }
61 void a2pampan (int (*(*(*[2])[n1
])[n2
]));
64 /* Verify that the presence or absence of static with VLA dooesn't cause
67 int f2ia1_1 (int n
, int [n
][n
]); // { sg-message "previously declared as 'int\\\[n]\\\[n]' with bound argument 1" }
68 int f2ia1_1 (int n
, int[static n
][n
]);
69 int f2ia1_1 (int n
, int a
[static n
][n
]) { return sizeof *a
; }
70 int f2ia1_1 (int n
, int[static n
+ 1][n
]); // { dg-warning "argument 2 of type 'int\\\[static *n \\\+ 1]\\\[n]' declared with mismatched bound 'n \\\+ 1'" }
72 int f2ias1_1 (int n
, int [static n
][n
]); // { dg-message "previously declared as 'int\\\[static +n]\\\[n]' with bound argument 1" }
73 int f2ias1_1 (int n
, int[n
][n
]);
74 int f2ias1_1 (int n
, int a
[++n
][n
]) // { dg-warning "argument 2 of type 'int\\\[\\\+\\\+n]\\\[n]' declared with mismatched bound ' ?\\+\\+n'" }