1// RUN: %clang_cc1 -fsyntax-only -Wmismatched-tags -verify %s
2// RUN: not %clang_cc1 -fsyntax-only -Wmismatched-tags %s 2>&1 | FileCheck %s
3class X; // expected-note 2{{here}}
4typedef struct X * X_t; // expected-warning{{previously declared}}
5union X { int x; float y; }; // expected-error{{use of 'X' with tag type that does not match previous declaration}}
6
7template<typename T> struct Y; // expected-note{{did you mean class here?}}
8template<class U> class Y { }; // expected-warning{{previously declared}}
9
10class A;
11class A;  // expected-note{{previous use is here}}
12struct A;  // expected-warning{{struct 'A' was previously declared as a class}}
13
14class B;  // expected-note{{did you mean struct here?}}
15class B;  // expected-note{{previous use is here}}\
16          // expected-note{{did you mean struct here?}}
17struct B;  // expected-warning{{struct 'B' was previously declared as a class}}
18struct B {};  // expected-warning{{'B' defined as a struct here but previously declared as a class}}
19
20class C;  // expected-note{{previous use is here}}
21struct C;  // expected-warning{{struct 'C' was previously declared as a class}}\
22           // expected-note{{previous use is here}}\
23           // expected-note{{did you mean class here?}}
24class C;  // expected-warning{{class 'C' was previously declared as a struct}}\
25          // expected-note{{previous use is here}}
26struct C;  // expected-warning{{struct 'C' was previously declared as a class}}\
27           // expected-note{{did you mean class here?}}
28class C {};  // expected-warning{{'C' defined as a class here but previously declared as a struct}}
29
30struct D {};  // expected-note{{previous definition is here}}\
31              // expected-note{{previous use is here}}
32class D {};  // expected-error{{redefinition of 'D'}}
33struct D;
34class D;  // expected-warning{{class 'D' was previously declared as a struct}}\
35          // expected-note{{did you mean struct here?}}
36
37class E;
38class E;
39class E {};
40class E;
41
42struct F;
43struct F;
44struct F {};
45struct F;
46
47template<class U> class G;  // expected-note{{previous use is here}}\
48                            // expected-note{{did you mean struct here?}}
49template<class U> struct G;  // expected-warning{{struct template 'G' was previously declared as a class template}}
50template<class U> struct G {};  // expected-warning{{'G' defined as a struct template here but previously declared as a class template}}
51
52/*
53*** 'X' messages ***
54CHECK: warning: struct 'X' was previously declared as a class
55CHECK: {{^}}typedef struct X * X_t;
56CHECK: {{^}}        ^{{$}}
57CHECK: note: previous use is here
58CHECK: {{^}}class X;
59CHECK: {{^}}      ^{{$}}
60CHECK: error: use of 'X' with tag type that does not match previous declaration
61CHECK: {{^}}union X { int x; float y; };
62CHECK: {{^}}^~~~~{{$}}
63CHECK: {{^}}class{{$}}
64CHECK: note: previous use is here
65CHECK: {{^}}class X;
66CHECK: {{^}}      ^{{$}}
67*** 'Y' messages ***
68CHECK: warning: 'Y' defined as a class template here but
69      previously declared as a struct template
70CHECK: {{^}}template<class U> class Y { };
71CHECK: {{^}}                  ^{{$}}
72CHECK: note: did you mean class here?
73CHECK: {{^}}template<typename T> struct Y;
74CHECK: {{^}}                     ^~~~~~{{$}}
75CHECK: {{^}}                     class{{$}}
76*** 'A' messages ***
77CHECK: warning: struct 'A' was previously declared as a class
78CHECK: {{^}}struct A;
79CHECK: {{^}}^{{$}}
80CHECK: note: previous use is here
81CHECK: {{^}}class A;
82CHECK: {{^}}      ^{{$}}
83*** 'B' messages ***
84CHECK: warning: struct 'B' was previously declared as a class
85CHECK: {{^}}struct B;
86CHECK: {{^}}^{{$}}
87CHECK: note: previous use is here
88CHECK: {{^}}class B;
89CHECK: {{^}}      ^{{$}}
90CHECK: 'B' defined as a struct here but previously declared as a class
91CHECK: {{^}}struct B {};
92CHECK: {{^}}^{{$}}
93CHECK: note: did you mean struct here?
94CHECK: {{^}}class B;
95CHECK: {{^}}^~~~~{{$}}
96CHECK: {{^}}struct{{$}}
97CHECK: note: did you mean struct here?
98CHECK: {{^}}class B;
99CHECK: {{^}}^~~~~{{$}}
100CHECK: {{^}}struct{{$}}
101*** 'C' messages ***
102CHECK: warning: struct 'C' was previously declared as a class
103CHECK: {{^}}struct C;
104CHECK: {{^}}^{{$}}
105CHECK: note: previous use is here
106CHECK: {{^}}class C;
107CHECK: {{^}}      ^{{$}}
108CHECK: warning: class 'C' was previously declared as a struct
109CHECK: {{^}}class C;
110CHECK: {{^}}^{{$}}
111CHECK: note: previous use is here
112CHECK: {{^}}struct C;
113CHECK: {{^}}       ^{{$}}
114CHECK: warning: struct 'C' was previously declared as a class
115CHECK: {{^}}struct C;
116CHECK: {{^}}^{{$}}
117CHECK: note: previous use is here
118CHECK: {{^}}class C;
119CHECK: {{^}}      ^{{$}}
120CHECK: warning: 'C' defined as a class here but previously declared as a struct
121CHECK: {{^}}class C {};
122CHECK: {{^}}^{{$}}
123CHECK: note: did you mean class here?
124CHECK: {{^}}struct C;
125CHECK: {{^}}^~~~~~{{$}}
126CHECK: {{^}}class{{$}}
127CHECK: note: did you mean class here?
128CHECK: {{^}}struct C;
129CHECK: {{^}}^~~~~~{{$}}
130CHECK: {{^}}class{{$}}
131*** 'D' messages ***
132CHECK: error: redefinition of 'D'
133CHECK: {{^}}class D {};
134CHECK: {{^}}      ^{{$}}
135CHECK: note: previous definition is here
136CHECK: {{^}}struct D {};
137CHECK: {{^}}       ^{{$}}
138CHECK: warning: class 'D' was previously declared as a struct
139CHECK: {{^}}class D;
140CHECK: {{^}}^{{$}}
141CHECK: note: previous use is here
142CHECK: {{^}}struct D {};
143CHECK: {{^}}       ^{{$}}
144CHECK: note: did you mean struct here?
145CHECK: {{^}}class D;
146CHECK: {{^}}^~~~~{{$}}
147CHECK: {{^}}struct{{$}}
148*** 'E' messages ***
149*** 'F' messages ***
150*** 'G' messages ***
151CHECK: warning: struct template 'G' was previously declared as a class template
152CHECK: {{^}}template<class U> struct G;
153CHECK: {{^}}                  ^{{$}}
154CHECK: note: previous use is here
155CHECK: {{^}}template<class U> class G;
156CHECK: {{^}}                        ^{{$}}
157CHECK: warning: 'G' defined as a struct template here but previously declared as a class template
158CHECK: {{^}}template<class U> struct G {};
159CHECK: {{^}}                  ^{{$}}
160CHECK: note: did you mean struct here?
161CHECK: {{^}}template<class U> class G;
162CHECK: {{^}}                  ^~~~~
163CHECK: {{^}}                  struct
164*/
165