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