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}} 6 7 template<typename T> struct Y; // expected-note{{did you mean class here?}} 8 template<class U> class Y { }; // expected-warning{{previously declared}} 9 10 template <typename> 11 struct Z { 12 struct Z { // expected-error{{member 'Z' has the same name as its class}} 13 }; 14 }; 15 16 class A; 17 class A; // expected-note{{previous use is here}} 18 struct A; // expected-warning{{struct 'A' was previously declared as a class}} 19 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}} 25 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}} 35 36 struct D {}; // expected-note{{previous definition is here}}\ 37 // expected-note{{previous use is here}} 38 class D {}; // expected-error{{redefinition of 'D'}} 39 struct D; 40 class D; // expected-warning{{class 'D' was previously declared as a struct}}\ 41 // expected-note{{did you mean struct here?}} 42 43 class E; 44 class E; 45 class E {}; 46 class E; 47 48 struct F; 49 struct F; 50 struct F {}; // expected-note {{previous use}} 51 struct F; 52 class F; // expected-warning {{previously declared as a struct}} expected-note {{did you mean struct}} 53 54 template<class U> class G; // expected-note{{previous use is here}}\ 55 // expected-note{{did you mean struct here?}} 56 template<class U> struct G; // expected-warning{{struct template 'G' was previously declared as a class template}} 57 template<class U> struct G {}; // expected-warning{{'G' defined as a struct template here but previously declared as a class template}} 58 59 // Declarations from contexts where the warning is disabled are entirely 60 // ignored for the purpose of this warning. 61 struct J; 62 struct K; // expected-note {{previous use}} 63 struct L; 64 struct M; // expected-note {{previous use}} 65 66 #pragma clang diagnostic push 67 #pragma clang diagnostic ignored "-Wmismatched-tags" 68 struct H; 69 class I {}; 70 class J; 71 class K; 72 class L; 73 class M {}; 74 #pragma clang diagnostic pop 75 76 class H; // expected-note {{previous use}} 77 struct H; // expected-warning {{previously declared as a class}} 78 79 struct I; // expected-note {{previous use}} 80 class I; // expected-warning {{previously declared as a struct}} 81 82 struct J; 83 class K; // expected-warning {{previously declared as a struct}} 84 struct L; 85 class M; // expected-warning {{previously declared as a struct}} 86 87 /* 88 *** 'X' messages *** 89 CHECK: warning: struct 'X' was previously declared as a class 90 CHECK: {{^}}typedef struct X * X_t; 91 CHECK: {{^}} ^{{$}} 92 CHECK: note: previous use is here 93 CHECK: {{^}}class X; 94 CHECK: {{^}} ^{{$}} 95 CHECK: error: use of 'X' with tag type that does not match previous declaration 96 CHECK: {{^}}union X { int x; float y; }; 97 CHECK: {{^}}^~~~~{{$}} 98 CHECK: {{^}}class{{$}} 99 CHECK: note: previous use is here 100 CHECK: {{^}}class X; 101 CHECK: {{^}} ^{{$}} 102 *** 'Y' messages *** 103 CHECK: warning: 'Y' defined as a class template here but 104 previously declared as a struct template 105 CHECK: {{^}}template<class U> class Y { }; 106 CHECK: {{^}} ^{{$}} 107 CHECK: note: did you mean class here? 108 CHECK: {{^}}template<typename T> struct Y; 109 CHECK: {{^}} ^~~~~~{{$}} 110 CHECK: {{^}} class{{$}} 111 *** 'A' messages *** 112 CHECK: warning: struct 'A' was previously declared as a class 113 CHECK: {{^}}struct A; 114 CHECK: {{^}}^{{$}} 115 CHECK: note: previous use is here 116 CHECK: {{^}}class A; 117 CHECK: {{^}} ^{{$}} 118 *** 'B' messages *** 119 CHECK: warning: struct 'B' was previously declared as a class 120 CHECK: {{^}}struct B; 121 CHECK: {{^}}^{{$}} 122 CHECK: note: previous use is here 123 CHECK: {{^}}class B; 124 CHECK: {{^}} ^{{$}} 125 CHECK: 'B' defined as a struct here but previously declared as a class 126 CHECK: {{^}}struct B {}; 127 CHECK: {{^}}^{{$}} 128 CHECK: note: did you mean struct here? 129 CHECK: {{^}}class B; 130 CHECK: {{^}}^~~~~{{$}} 131 CHECK: {{^}}struct{{$}} 132 CHECK: note: did you mean struct here? 133 CHECK: {{^}}class B; 134 CHECK: {{^}}^~~~~{{$}} 135 CHECK: {{^}}struct{{$}} 136 *** 'C' messages *** 137 CHECK: warning: struct 'C' was previously declared as a class 138 CHECK: {{^}}struct C; 139 CHECK: {{^}}^{{$}} 140 CHECK: note: previous use is here 141 CHECK: {{^}}class C; 142 CHECK: {{^}} ^{{$}} 143 CHECK: warning: class 'C' was previously declared as a struct 144 CHECK: {{^}}class C; 145 CHECK: {{^}}^{{$}} 146 CHECK: note: previous use is here 147 CHECK: {{^}}struct C; 148 CHECK: {{^}} ^{{$}} 149 CHECK: warning: struct 'C' was previously declared as a class 150 CHECK: {{^}}struct C; 151 CHECK: {{^}}^{{$}} 152 CHECK: note: previous use is here 153 CHECK: {{^}}class C; 154 CHECK: {{^}} ^{{$}} 155 CHECK: warning: 'C' defined as a class here but previously declared as a struct 156 CHECK: {{^}}class C {}; 157 CHECK: {{^}}^{{$}} 158 CHECK: note: did you mean class here? 159 CHECK: {{^}}struct C; 160 CHECK: {{^}}^~~~~~{{$}} 161 CHECK: {{^}}class{{$}} 162 CHECK: note: did you mean class here? 163 CHECK: {{^}}struct C; 164 CHECK: {{^}}^~~~~~{{$}} 165 CHECK: {{^}}class{{$}} 166 *** 'D' messages *** 167 CHECK: error: redefinition of 'D' 168 CHECK: {{^}}class D {}; 169 CHECK: {{^}} ^{{$}} 170 CHECK: note: previous definition is here 171 CHECK: {{^}}struct D {}; 172 CHECK: {{^}} ^{{$}} 173 CHECK: warning: class 'D' was previously declared as a struct 174 CHECK: {{^}}class D; 175 CHECK: {{^}}^{{$}} 176 CHECK: note: previous use is here 177 CHECK: {{^}}struct D {}; 178 CHECK: {{^}} ^{{$}} 179 CHECK: note: did you mean struct here? 180 CHECK: {{^}}class D; 181 CHECK: {{^}}^~~~~{{$}} 182 CHECK: {{^}}struct{{$}} 183 *** 'E' messages *** 184 *** 'F' messages *** 185 *** 'G' messages *** 186 CHECK: warning: struct template 'G' was previously declared as a class template 187 CHECK: {{^}}template<class U> struct G; 188 CHECK: {{^}} ^{{$}} 189 CHECK: note: previous use is here 190 CHECK: {{^}}template<class U> class G; 191 CHECK: {{^}} ^{{$}} 192 CHECK: warning: 'G' defined as a struct template here but previously declared as a class template 193 CHECK: {{^}}template<class U> struct G {}; 194 CHECK: {{^}} ^{{$}} 195 CHECK: note: did you mean struct here? 196 CHECK: {{^}}template<class U> class G; 197 CHECK: {{^}} ^~~~~ 198 CHECK: {{^}} struct 199 */ 200