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