1 /* PR c++/94078 - bogus and missing -Wmismatched-tags on an instance 2 of a template 3 Verify that -Wmismatched-tags is issued for redeclarations and 4 instances of the appropriate primary template or specialization. 5 { dg-do compile } 6 { dg-options "-Wmismatched-tags" } */ 7 8 // Exercise explicit specialization. 9 template <class> class S1; 10 template <> struct S1<int>; 11 12 template <class> class S1; 13 template <class> struct S1; // { dg-warning "\\\[-Wmismatched-tags" } 14 15 template <> class S1<char>; 16 template <> struct S1<char>; // { dg-warning "\\\[-Wmismatched-tags" } 17 18 template <> class S1<int>; // { dg-warning "\\\[-Wmismatched-tags" } 19 template <> struct S1<int>; 20 21 extern S1<void> s1v; 22 extern class S1<void> s1v; 23 extern struct S1<void> s1v; // { dg-warning "\\\[-Wmismatched-tags" } 24 25 extern S1<int> s1i; 26 extern class S1<int> s1i; // { dg-warning "\\\[-Wmismatched-tags" } 27 extern struct S1<int> s1i; 28 29 extern S1<char> s1c; 30 extern class S1<char> s1c; 31 extern struct S1<char> s1c; // { dg-warning "\\\[-Wmismatched-tags" } 32 33 34 // Exercise partial specialization. 35 template <class> struct S2; 36 template <class T> class S2<const T>; 37 38 template <class> class S2; // { dg-warning "\\\[-Wmismatched-tags" } 39 template <class> struct S2; 40 41 template <class T> class S2<const T>; 42 template <class T> struct S2<const T>;// { dg-warning "\\\[-Wmismatched-tags" } 43 44 extern S2<int> s2i; 45 extern class S2<int> s2i; // { dg-warning "\\\[-Wmismatched-tags" } 46 extern struct S2<int> s2i; 47 48 extern S2<const int> s2ci; 49 extern class S2<const int> s2ci; 50 extern struct S2<const int> s2ci; // { dg-warning "\\\[-Wmismatched-tags" } 51 52 53 template <class> struct S3; 54 template <class T> class S3<T*>; 55 template <class T> struct S3<T&>; 56 57 template <class> class S3; // { dg-warning "\\\[-Wmismatched-tags" } 58 template <class> struct S3; 59 60 template <class T> class S3<T*>; 61 template <class T> struct S3<T*>; // { dg-warning "\\\[-Wmismatched-tags" } 62 63 template <class T> class S3<T&>; // { dg-warning "\\\[-Wmismatched-tags" } 64 template <class T> struct S3<T&>; 65 66 extern S3<int> s3i; 67 extern class S3<int> s3i; // { dg-warning "\\\[-Wmismatched-tags" } 68 extern struct S3<int> s3i; 69 70 extern S3<int*> s3p; 71 extern class S3<int*> s3p; 72 extern struct S3<int*> s3p; // { dg-warning "\\\[-Wmismatched-tags" } 73 74 extern S3<int&> s3r; 75 extern class S3<int&> s3r; // { dg-warning "\\\[-Wmismatched-tags" } 76 extern struct S3<int&> s3r; 77 78 // Repeat exactly the same as above. 79 extern S3<int> s3i; 80 extern class S3<int> s3i; // { dg-warning "\\\[-Wmismatched-tags" } 81 extern struct S3<int> s3i; 82 83 extern S3<int*> s3p; 84 extern class S3<int*> s3p; 85 extern struct S3<int*> s3p; // { dg-warning "\\\[-Wmismatched-tags" } 86 87 extern S3<int&> s3r; 88 extern class S3<int&> s3r; // { dg-warning "\\\[-Wmismatched-tags" } 89 extern struct S3<int&> s3r; 90 91 // Repeat the same as above just with different type. 92 extern S3<long> s3l; 93 extern class S3<long> s3l; // { dg-warning "\\\[-Wmismatched-tags" } 94 extern struct S3<long> s3l; 95 96 extern S3<long*> s3lp; 97 extern class S3<long*> s3lp; 98 extern struct S3<long*> s3lp; // { dg-warning "\\\[-Wmismatched-tags" } 99 100 extern S3<long&> s3lr; 101 extern class S3<long&> s3lr; // { dg-warning "\\\[-Wmismatched-tags" } 102 extern struct S3<long&> s3lr; 103 104 // Repeat with the class-keys swapped. 105 extern S3<long> s3l; 106 extern struct S3<long> s3l; 107 extern class S3<long> s3l; // { dg-warning "\\\[-Wmismatched-tags" } 108 109 extern S3<long*> s3lp; 110 extern struct S3<long*> s3lp; // { dg-warning "\\\[-Wmismatched-tags" } 111 extern class S3<long*> s3lp; 112 113 extern S3<long&> s3lr; 114 extern struct S3<long&> s3lr; 115 extern class S3<long&> s3lr; // { dg-warning "\\\[-Wmismatched-tags" } 116 117 118 namespace N 119 { 120 template <class> struct A; 121 122 extern class A<int> ai; // { dg-warning "\\\[-Wmismatched-tags" } 123 extern struct A<int> ai; 124 125 typedef class A<int> AI; // { dg-warning "\\\[-Wmismatched-tags" } 126 typedef struct A<int> AI; 127 128 template <class> struct B; 129 template <> class B<int>; 130 template <> struct B<char>; 131 132 extern class B<int> bi; 133 extern struct B<int> bi; // { dg-warning "\\\[-Wmismatched-tags" } 134 135 extern class B<char> bc; // { dg-warning "\\\[-Wmismatched-tags" } 136 extern struct B<char> bc; 137 138 typedef class B<char> BC; // { dg-warning "\\\[-Wmismatched-tags" } 139 typedef struct B<char> BC; 140 141 } 142