1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: cp %s %t
3*67e74705SXin Li // RUN: not %clang_cc1 -fixit %t -x c -DFIXIT
4*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only %t -x c -DFIXIT
5*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s -strict-whitespace
6*67e74705SXin Li
test1()7*67e74705SXin Li void test1() {
8*67e74705SXin Li int a[] = {0,1,1,2,3};
9*67e74705SXin Li int []b = {0,1,4,9,16};
10*67e74705SXin Li // expected-error@-1{{brackets are not allowed here; to declare an array, place the brackets after the identifier}}
11*67e74705SXin Li // CHECK: {{^}} int []b = {0,1,4,9,16};
12*67e74705SXin Li // CHECK: {{^}} ~~ ^
13*67e74705SXin Li // CHECK: {{^}} []
14*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:7-[[@LINE-5]]:9}:""
15*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:10-[[@LINE-6]]:10}:"[]"
16*67e74705SXin Li
17*67e74705SXin Li int c = a[0];
18*67e74705SXin Li int d = b[0]; // No undeclared identifer error here.
19*67e74705SXin Li
20*67e74705SXin Li int *e = a;
21*67e74705SXin Li int *f = b; // No undeclared identifer error here.
22*67e74705SXin Li }
23*67e74705SXin Li
24*67e74705SXin Li struct S {
25*67e74705SXin Li int [1][1]x;
26*67e74705SXin Li // expected-error@-1{{brackets are not allowed here; to declare an array, place the brackets after the identifier}}
27*67e74705SXin Li // CHECK: {{^}} int [1][1]x;
28*67e74705SXin Li // CHECK: {{^}} ~~~~~~ ^
29*67e74705SXin Li // CHECK: {{^}} [1][1]
30*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:7-[[@LINE-5]]:13}:""
31*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:14-[[@LINE-6]]:14}:"[1][1]"
32*67e74705SXin Li } s;
33*67e74705SXin Li
34*67e74705SXin Li #ifndef FIXIT
test2()35*67e74705SXin Li void test2() {
36*67e74705SXin Li int [][][];
37*67e74705SXin Li // expected-error@-1{{expected identifier or '('}}
38*67e74705SXin Li // CHECK: {{^}} int [][][];
39*67e74705SXin Li // CHECK: {{^}} ^
40*67e74705SXin Li // CHECK-NOT: fix-it
41*67e74705SXin Li struct T {
42*67e74705SXin Li int [];
43*67e74705SXin Li // expected-error@-1{{expected member name or ';' after declaration specifiers}}
44*67e74705SXin Li // CHECK: {{^}} int [];
45*67e74705SXin Li // CHECK: {{^}} ~~~ ^
46*67e74705SXin Li // CHECK-NOT: fix-it
47*67e74705SXin Li };
48*67e74705SXin Li }
49*67e74705SXin Li
test3()50*67e74705SXin Li void test3() {
51*67e74705SXin Li int [5] *;
52*67e74705SXin Li // expected-error@-1{{expected identifier or '('}}
53*67e74705SXin Li // CHECK: {{^}} int [5] *;
54*67e74705SXin Li // CHECK: {{^}} ^
55*67e74705SXin Li // CHECK-NOT: fix-it
56*67e74705SXin Li // expected-error@-5{{brackets are not allowed here; to declare an array, place the brackets after the identifier}}
57*67e74705SXin Li // CHECK: {{^}} int [5] *;
58*67e74705SXin Li // CHECK: {{^}} ~~~~ ^
59*67e74705SXin Li // CHECK: {{^}} ()[5]
60*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-9]]:7-[[@LINE-9]]:11}:""
61*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-10]]:11-[[@LINE-10]]:11}:"("
62*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-11]]:12-[[@LINE-11]]:12}:")[5]"
63*67e74705SXin Li
64*67e74705SXin Li int [5] * a;
65*67e74705SXin Li // expected-error@-1{{brackets are not allowed here; to declare an array, place the brackets after the identifier}}
66*67e74705SXin Li // CHECK: {{^}} int [5] * a;
67*67e74705SXin Li // CHECK: {{^}} ~~~~ ^
68*67e74705SXin Li // CHECK: {{^}} ( )[5]
69*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:7-[[@LINE-5]]:11}:""
70*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:11-[[@LINE-6]]:11}:"("
71*67e74705SXin Li // CHECK: fix-it:{{.*}}:{[[@LINE-7]]:14-[[@LINE-7]]:14}:")[5]"
72*67e74705SXin Li
73*67e74705SXin Li int *b[5] = a; // expected-error{{}} a should not be corrected to type b
74*67e74705SXin Li
75*67e74705SXin Li int (*c)[5] = a; // a should be the same type as c
76*67e74705SXin Li }
77*67e74705SXin Li #endif
78*67e74705SXin Li
79*67e74705SXin Li // CHECK: 8 errors generated.
80