xref: /aosp_15_r20/external/clang/test/Sema/static-array.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -fblocks -verify %s
2*67e74705SXin Li 
cat0(int a[static0])3*67e74705SXin Li void cat0(int a[static 0]) {} // expected-warning {{'static' has no effect on zero-length arrays}}
4*67e74705SXin Li 
cat(int a[static3])5*67e74705SXin Li void cat(int a[static 3]) {} // expected-note 2 {{callee declares array parameter as static here}}
6*67e74705SXin Li 
vat(int i,int a[static i])7*67e74705SXin Li void vat(int i, int a[static i]) {} // expected-note {{callee declares array parameter as static here}}
8*67e74705SXin Li 
f(int * p)9*67e74705SXin Li void f(int *p) {
10*67e74705SXin Li   int a[2], b[3], c[4];
11*67e74705SXin Li 
12*67e74705SXin Li   cat0(0);
13*67e74705SXin Li 
14*67e74705SXin Li   cat(0); // expected-warning {{null passed to a callee that requires a non-null argument}}
15*67e74705SXin Li   cat(a); // expected-warning {{array argument is too small; contains 2 elements, callee requires at least 3}}
16*67e74705SXin Li   cat(b);
17*67e74705SXin Li   cat(c);
18*67e74705SXin Li   cat(p);
19*67e74705SXin Li 
20*67e74705SXin Li   vat(1, 0); // expected-warning {{null passed to a callee that requires a non-null argument}}
21*67e74705SXin Li   vat(3, b);
22*67e74705SXin Li }
23*67e74705SXin Li 
24*67e74705SXin Li 
25*67e74705SXin Li typedef int td[static 3]; // expected-error {{'static' used in array declarator outside of function prototype}}
26*67e74705SXin Li typedef void(*fp)(int[static 42]); // no-warning
27*67e74705SXin Li 
g(void)28*67e74705SXin Li void g(void) {
29*67e74705SXin Li   int a[static 42]; // expected-error {{'static' used in array declarator outside of function prototype}}
30*67e74705SXin Li 
31*67e74705SXin Li   int b[const 10]; // expected-error {{type qualifier used in array declarator outside of function prototype}}
32*67e74705SXin Li   int c[volatile 10]; // expected-error {{type qualifier used in array declarator outside of function prototype}}
33*67e74705SXin Li   int d[restrict 10]; // expected-error {{type qualifier used in array declarator outside of function prototype}}
34*67e74705SXin Li 
35*67e74705SXin Li   int e[static restrict 1]; // expected-error {{'static' used in array declarator outside of function prototype}}
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li void h(int [static const 10][42]); // no-warning
39*67e74705SXin Li 
40*67e74705SXin Li void i(int [10]
41*67e74705SXin Li        [static 42]); // expected-error {{'static' used in non-outermost array type derivation}}
42*67e74705SXin Li 
43*67e74705SXin Li void j(int [10]
44*67e74705SXin Li        [const 42]); // expected-error {{type qualifier used in non-outermost array type derivation}}
45*67e74705SXin Li 
46*67e74705SXin Li void k(int (*x)[static 10]); // expected-error {{'static' used in non-outermost array type derivation}}
47*67e74705SXin Li void l(int (x)[static 10]); // no-warning
48*67e74705SXin Li void m(int *x[static 10]); // no-warning
49*67e74705SXin Li void n(int *(x)[static 10]); // no-warning
50*67e74705SXin Li 
51*67e74705SXin Li void o(int (x[static 10])(void)); // expected-error{{'x' declared as array of functions of type 'int (void)'}}
52*67e74705SXin Li void p(int (^x)[static 10]); // expected-error{{block pointer to non-function type is invalid}}
53*67e74705SXin Li void q(int (^x[static 10])()); // no-warning
54*67e74705SXin Li 
r(x)55*67e74705SXin Li void r(x)
56*67e74705SXin Li   int x[restrict]; // no-warning
57*67e74705SXin Li {}
58