1 // RUN: %clang_cc1 -fsyntax-only -Wmismatched-tags -verify %s
2 // RUN: not %clang_cc1 -fsyntax-only -Wmismatched-tags %s 2>&1 | FileCheck %s
3 class X; // expected-note 2{{here}}
4 typedef struct X * X_t; // expected-warning{{previously declared}}
5 union X { int x; float y; }; // expected-error{{use of 'X' with tag type that does not match previous declaration}}
7 template<typename T> struct Y; // expected-note{{did you mean class here?}}
8 template<class U> class Y { }; // expected-warning{{previously declared}}
12 struct Z { // expected-error{{member 'Z' has the same name as its class}}
17 class A; // expected-note{{previous use is here}}
18 struct A; // expected-warning{{struct 'A' was previously declared as a class}}
20 class B; // expected-note{{did you mean struct here?}}
21 class B; // expected-note{{previous use is here}}\
22 // expected-note{{did you mean struct here?}}
23 struct B; // expected-warning{{struct 'B' was previously declared as a class}}
24 struct B {}; // expected-warning{{'B' defined as a struct here but previously declared as a class}}
26 class C; // expected-note{{previous use is here}}
27 struct C; // expected-warning{{struct 'C' was previously declared as a class}}\
28 // expected-note{{previous use is here}}\
29 // expected-note{{did you mean class here?}}
30 class C; // expected-warning{{class 'C' was previously declared as a struct}}\
31 // expected-note{{previous use is here}}
32 struct C; // expected-warning{{struct 'C' was previously declared as a class}}\
33 // expected-note{{did you mean class here?}}
34 class C {}; // expected-warning{{'C' defined as a class here but previously declared as a struct}}
36 struct D {}; // expected-note{{previous definition is here}}\
37 // expected-note{{previous use is here}}
38 class D {}; // expected-error{{redefinition of 'D'}}
40 class D; // expected-warning{{class 'D' was previously declared as a struct}}\
41 // expected-note{{did you mean struct here?}}
53 template<class U> class G; // expected-note{{previous use is here}}\
54 // expected-note{{did you mean struct here?}}
55 template<class U> struct G; // expected-warning{{struct template 'G' was previously declared as a class template}}
56 template<class U> struct G {}; // expected-warning{{'G' defined as a struct template here but previously declared as a class template}}
60 CHECK: warning: struct 'X' was previously declared as a class
61 CHECK: {{^}}typedef struct X * X_t;
63 CHECK: note: previous use is here
66 CHECK: error: use of 'X' with tag type that does not match previous declaration
67 CHECK: {{^}}union X { int x; float y; };
68 CHECK: {{^}}^~~~~{{$}}
69 CHECK: {{^}}class{{$}}
70 CHECK: note: previous use is here
74 CHECK: warning: 'Y' defined as a class template here but
75 previously declared as a struct template
76 CHECK: {{^}}template<class U> class Y { };
78 CHECK: note: did you mean class here?
79 CHECK: {{^}}template<typename T> struct Y;
80 CHECK: {{^}} ^~~~~~{{$}}
81 CHECK: {{^}} class{{$}}
83 CHECK: warning: struct 'A' was previously declared as a class
86 CHECK: note: previous use is here
90 CHECK: warning: struct 'B' was previously declared as a class
93 CHECK: note: previous use is here
96 CHECK: 'B' defined as a struct here but previously declared as a class
97 CHECK: {{^}}struct B {};
99 CHECK: note: did you mean struct here?
101 CHECK: {{^}}^~~~~{{$}}
102 CHECK: {{^}}struct{{$}}
103 CHECK: note: did you mean struct here?
105 CHECK: {{^}}^~~~~{{$}}
106 CHECK: {{^}}struct{{$}}
108 CHECK: warning: struct 'C' was previously declared as a class
109 CHECK: {{^}}struct C;
111 CHECK: note: previous use is here
114 CHECK: warning: class 'C' was previously declared as a struct
117 CHECK: note: previous use is here
118 CHECK: {{^}}struct C;
120 CHECK: warning: struct 'C' was previously declared as a class
121 CHECK: {{^}}struct C;
123 CHECK: note: previous use is here
126 CHECK: warning: 'C' defined as a class here but previously declared as a struct
127 CHECK: {{^}}class C {};
129 CHECK: note: did you mean class here?
130 CHECK: {{^}}struct C;
131 CHECK: {{^}}^~~~~~{{$}}
132 CHECK: {{^}}class{{$}}
133 CHECK: note: did you mean class here?
134 CHECK: {{^}}struct C;
135 CHECK: {{^}}^~~~~~{{$}}
136 CHECK: {{^}}class{{$}}
138 CHECK: error: redefinition of 'D'
139 CHECK: {{^}}class D {};
141 CHECK: note: previous definition is here
142 CHECK: {{^}}struct D {};
144 CHECK: warning: class 'D' was previously declared as a struct
147 CHECK: note: previous use is here
148 CHECK: {{^}}struct D {};
150 CHECK: note: did you mean struct here?
152 CHECK: {{^}}^~~~~{{$}}
153 CHECK: {{^}}struct{{$}}
157 CHECK: warning: struct template 'G' was previously declared as a class template
158 CHECK: {{^}}template<class U> struct G;
160 CHECK: note: previous use is here
161 CHECK: {{^}}template<class U> class G;
163 CHECK: warning: 'G' defined as a struct template here but previously declared as a class template
164 CHECK: {{^}}template<class U> struct G {};
166 CHECK: note: did you mean struct here?
167 CHECK: {{^}}template<class U> class G;