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 10class 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*/ 165