blob: 706ec5688ba53a68ec6f12a73f6389eef6f74db1 [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -Wmismatched-tags -verify %s
Rafael Espindola96e78132013-07-04 16:16:58 +00002// RUN: not %clang_cc1 -fsyntax-only -Wmismatched-tags %s 2>&1 | FileCheck %s
Douglas Gregor501c5ce2009-05-14 16:41:31 +00003class X; // expected-note 2{{here}}
4typedef struct X * X_t; // expected-warning{{previously declared}}
Richard Trieubbf34c02011-06-10 03:11:26 +00005union X { int x; float y; }; // expected-error{{use of 'X' with tag type that does not match previous declaration}}
Douglas Gregored4ec8f2009-05-03 17:18:57 +00006
Richard Trieubbf34c02011-06-10 03:11:26 +00007template<typename T> struct Y; // expected-note{{did you mean class here?}}
Douglas Gregor501c5ce2009-05-14 16:41:31 +00008template<class U> class Y { }; // expected-warning{{previously declared}}
Douglas Gregored4ec8f2009-05-03 17:18:57 +00009
Stephen Hines0e2c34f2015-03-23 12:09:02 -070010template <typename>
11struct Z { // expected-note{{previous definition is here}}
12 struct Z { // expected-error{{nested redefinition of 'Z'}}
13 };
14};
15
Richard Trieubbf34c02011-06-10 03:11:26 +000016class 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*/