blob: 5c59578d6eb5aa3d92e7d83b1d17c6e1b76a2617 [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -Wmismatched-tags -verify %s
Richard Trieubbf34c02011-06-10 03:11:26 +00002// RUN: %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
Richard Trieubbf34c02011-06-10 03:11:26 +000010class 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*/