blob: 7570264b1d33b5228a17b29dbbec4774bdef5aa1 [file] [log] [blame]
/* PR c++/94078 - bogus and missing -Wmismatched-tags on an instance
of a template
Verify that -Wmismatched-tags is issued for redeclarations and
instances of the appropriate primary template or specialization.
{ dg-do compile }
{ dg-options "-Wmismatched-tags" } */
// Exercise explicit specialization.
template <class> class S1;
template <> struct S1<int>;
template <class> class S1;
template <class> struct S1; // { dg-warning "\\\[-Wmismatched-tags" }
template <> class S1<char>;
template <> struct S1<char>; // { dg-warning "\\\[-Wmismatched-tags" }
template <> class S1<int>; // { dg-warning "\\\[-Wmismatched-tags" }
template <> struct S1<int>;
extern S1<void> s1v;
extern class S1<void> s1v;
extern struct S1<void> s1v; // { dg-warning "\\\[-Wmismatched-tags" }
extern S1<int> s1i;
extern class S1<int> s1i; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct S1<int> s1i;
extern S1<char> s1c;
extern class S1<char> s1c;
extern struct S1<char> s1c; // { dg-warning "\\\[-Wmismatched-tags" }
// Exercise partial specialization.
template <class> struct S2;
template <class T> class S2<const T>;
template <class> class S2; // { dg-warning "\\\[-Wmismatched-tags" }
template <class> struct S2;
template <class T> class S2<const T>;
template <class T> struct S2<const T>;// { dg-warning "\\\[-Wmismatched-tags" }
extern S2<int> s2i;
extern class S2<int> s2i; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct S2<int> s2i;
extern S2<const int> s2ci;
extern class S2<const int> s2ci;
extern struct S2<const int> s2ci; // { dg-warning "\\\[-Wmismatched-tags" }
template <class> struct S3;
template <class T> class S3<T*>;
template <class T> struct S3<T&>;
template <class> class S3; // { dg-warning "\\\[-Wmismatched-tags" }
template <class> struct S3;
template <class T> class S3<T*>;
template <class T> struct S3<T*>; // { dg-warning "\\\[-Wmismatched-tags" }
template <class T> class S3<T&>; // { dg-warning "\\\[-Wmismatched-tags" }
template <class T> struct S3<T&>;
extern S3<int> s3i;
extern class S3<int> s3i; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct S3<int> s3i;
extern S3<int*> s3p;
extern class S3<int*> s3p;
extern struct S3<int*> s3p; // { dg-warning "\\\[-Wmismatched-tags" }
extern S3<int&> s3r;
extern class S3<int&> s3r; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct S3<int&> s3r;
// Repeat exactly the same as above.
extern S3<int> s3i;
extern class S3<int> s3i; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct S3<int> s3i;
extern S3<int*> s3p;
extern class S3<int*> s3p;
extern struct S3<int*> s3p; // { dg-warning "\\\[-Wmismatched-tags" }
extern S3<int&> s3r;
extern class S3<int&> s3r; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct S3<int&> s3r;
// Repeat the same as above just with different type.
extern S3<long> s3l;
extern class S3<long> s3l; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct S3<long> s3l;
extern S3<long*> s3lp;
extern class S3<long*> s3lp;
extern struct S3<long*> s3lp; // { dg-warning "\\\[-Wmismatched-tags" }
extern S3<long&> s3lr;
extern class S3<long&> s3lr; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct S3<long&> s3lr;
// Repeat with the class-keys swapped.
extern S3<long> s3l;
extern struct S3<long> s3l;
extern class S3<long> s3l; // { dg-warning "\\\[-Wmismatched-tags" }
extern S3<long*> s3lp;
extern struct S3<long*> s3lp; // { dg-warning "\\\[-Wmismatched-tags" }
extern class S3<long*> s3lp;
extern S3<long&> s3lr;
extern struct S3<long&> s3lr;
extern class S3<long&> s3lr; // { dg-warning "\\\[-Wmismatched-tags" }
namespace N
{
template <class> struct A;
extern class A<int> ai; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct A<int> ai;
typedef class A<int> AI; // { dg-warning "\\\[-Wmismatched-tags" }
typedef struct A<int> AI;
template <class> struct B;
template <> class B<int>;
template <> struct B<char>;
extern class B<int> bi;
extern struct B<int> bi; // { dg-warning "\\\[-Wmismatched-tags" }
extern class B<char> bc; // { dg-warning "\\\[-Wmismatched-tags" }
extern struct B<char> bc;
typedef class B<char> BC; // { dg-warning "\\\[-Wmismatched-tags" }
typedef struct B<char> BC;
}