1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 // RUN: cp %s %t
3 // RUN: not %clang_cc1 -fixit %t -x c++ -DFIXIT
4 // RUN: %clang_cc1 -fsyntax-only %t -x c++ -DFIXIT
5 // RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s -strict-whitespace
6 
test1()7 void test1() {
8   int a[] = {0,1,1,2,3};
9   int []b = {0,1,4,9,16};
10   // expected-error@-1{{brackets go after the unqualified-id}}
11   // CHECK: {{^}}  int []b = {0,1,4,9,16};
12   // CHECK: {{^}}      ~~ ^
13   // CHECK: {{^}}         []
14   // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:7-[[@LINE-5]]:9}:""
15   // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:10-[[@LINE-6]]:10}:"[]"
16 
17   int c = a[0];
18   int d = b[0];  // No undeclared identifer error here.
19 
20   int *e = a;
21   int *f = b;  // No undeclared identifer error here.
22 
23   int[1] g[2];
24   // expected-error@-1{{brackets go after the unqualified-id}}
25   // CHECK: {{^}}  int[1] g[2];
26   // CHECK: {{^}}     ~~~     ^
27   // CHECK: {{^}}             [1]
28   // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:6-[[@LINE-5]]:9}:""
29   // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:14-[[@LINE-6]]:14}:"[1]"
30 }
31 
test2()32 void test2() {
33   int [3] (*a) = 0;
34   // expected-error@-1{{brackets go after the unqualified-id}}
35   // CHECK: {{^}}  int [3] (*a) = 0;
36   // CHECK: {{^}}      ~~~~    ^
37   // CHECK: {{^}}              [3]
38   // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:7-[[@LINE-5]]:11}:""
39   // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:15-[[@LINE-6]]:15}:"[3]"
40 
41 #ifndef FIXIT
42   // Make sure a is corrected to be like type y, instead of like type z.
43   int (*b)[3] = a;
44   int (*c[3]) = a;  // expected-error{{}}
45 #endif
46 }
47 
48 struct A {
49   static int [1][1]x;
50   // expected-error@-1{{brackets go after the unqualified-id}}
51   // CHECK: {{^}}  static int [1][1]x;
52   // CHECK: {{^}}             ~~~~~~ ^
53   // CHECK: {{^}}                    [1][1]
54   // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:14-[[@LINE-5]]:20}:""
55   // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:21-[[@LINE-6]]:21}:"[1][1]"
56 };
57 
58 int [1][1]A::x = { {42} };
59 // expected-error@-1{{brackets go after the unqualified-id}}
60 // CHECK: {{^}}int [1][1]A::x = { {42} };
61 // CHECK: {{^}}    ~~~~~~    ^
62 // CHECK: {{^}}              [1][1]
63 // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:5-[[@LINE-5]]:11}:""
64 // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:15-[[@LINE-6]]:15}:"[1][1]"
65 
66 struct B { static int (*x)[5]; };
67 int [5] *B::x = 0;
68 // expected-error@-1{{brackets go after the unqualified-id}}
69 // CHECK: {{^}}int [5] *B::x = 0;
70 // CHECK: {{^}}    ~~~~     ^
71 // CHECK: {{^}}        (    )[5]
72 // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:5-[[@LINE-5]]:9}:""
73 // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:9-[[@LINE-6]]:9}:"("
74 // CHECK: fix-it:{{.*}}:{[[@LINE-7]]:14-[[@LINE-7]]:14}:")[5]"
75 
test3()76 void test3() {
77   int [3] *a;
78   // expected-error@-1{{brackets go after the unqualified-id}}
79   // CHECK: {{^}}  int [3] *a;
80   // CHECK: {{^}}      ~~~~  ^
81   // CHECK: {{^}}          ( )[3]
82   // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:7-[[@LINE-5]]:11}:""
83   // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:11-[[@LINE-6]]:11}:"("
84   // CHECK: fix-it:{{.*}}:{[[@LINE-7]]:13-[[@LINE-7]]:13}:")[3]"
85 
86   int (*b)[3] = a;  // no error
87 }
88 
test4()89 void test4() {
90   int [2] a;
91   // expected-error@-1{{brackets go after the unqualified-id}}
92   // CHECK: {{^}}  int [2] a;
93   // CHECK: {{^}}      ~~~~ ^
94   // CHECK: {{^}}           [2]
95   // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:7-[[@LINE-5]]:11}:""
96   // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:12-[[@LINE-6]]:12}:"[2]"
97 
98   int [2] &b = a;
99   // expected-error@-1{{brackets go after the unqualified-id}}
100   // CHECK: {{^}}  int [2] &b = a;
101   // CHECK: {{^}}      ~~~~  ^
102   // CHECK: {{^}}          ( )[2]
103   // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:7-[[@LINE-5]]:11}:""
104   // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:11-[[@LINE-6]]:11}:"("
105   // CHECK: fix-it:{{.*}}:{[[@LINE-7]]:13-[[@LINE-7]]:13}:")[2]"
106 
107 }
108 
109 namespace test5 {
110 #ifndef FIXIT
111 int [][][];
112 // expected-error@-1{{expected unqualified-id}}
113 // CHECK: {{^}}int [][][];
114 // CHECK: {{^}}    ^
115 
116 struct C {
117   int [];
118   // expected-error@-1{{expected member name or ';' after declaration specifiers}}
119   // CHECK: {{^}}  int [];
120   // CHECK: {{^}}  ~~~ ^
121 };
122 
123 #endif
124 }
125 
126 namespace test6 {
127 struct A {
128   static int arr[3];
129 };
130 int [3] ::test6::A::arr = {1,2,3};
131 // expected-error@-1{{brackets go after the unqualified-id}}
132 // CHECK: {{^}}int [3] ::test6::A::arr = {1,2,3};
133 // CHECK: {{^}}    ~~~~               ^
134 // CHECK: {{^}}                       [3]
135 // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:5-[[@LINE-5]]:9}:""
136 // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:24-[[@LINE-6]]:24}:"[3]"
137 
138 }
139 
140 namespace test7 {
141 class A{};
test()142 void test() {
143   int [3] A::*a;
144   // expected-error@-1{{brackets go after the unqualified-id}}
145   // CHECK: {{^}}  int [3] A::*a;
146   // CHECK: {{^}}      ~~~~     ^
147   // CHECK: {{^}}          (    )[3]
148   // CHECK: fix-it:{{.*}}:{[[@LINE-5]]:7-[[@LINE-5]]:11}:""
149   // CHECK: fix-it:{{.*}}:{[[@LINE-6]]:11-[[@LINE-6]]:11}:"("
150   // CHECK: fix-it:{{.*}}:{[[@LINE-7]]:16-[[@LINE-7]]:16}:")[3]"
151 }
152 }
153 // CHECK: 14 errors generated.
154