152
|
1 /* PR c++/93810 - missing -Wmismatched-tags and -Wredundant-tags on a typedef
|
|
2 of an implicit class template specialization
|
|
3 { dg-do compile }
|
|
4 { dg-options "-Wall -Wmismatched-tags" }
|
|
5 { dg-require-effective-target c++11 } */
|
|
6
|
|
7 class A; // { dg-message "declared as 'class'" }
|
|
8 typedef A A0;
|
|
9 typedef class A A0;
|
|
10 typedef struct A A0; // { dg-warning "-Wmismatched-tags" }
|
|
11
|
|
12 template <int> struct B; // { dg-message "declared as 'struct'" }
|
|
13 typedef B<0> B0;
|
|
14 typedef class B<0> B0; // { dg-warning "-Wmismatched-tags" }
|
|
15 typedef struct B<0> B0;
|
|
16
|
|
17
|
|
18 // Exercise member types of templates with non-type arguments.
|
|
19 template <int> struct CN; // { dg-message "declared as 'struct'" }
|
|
20
|
|
21 template <int N>
|
|
22 struct X_CNp1 {
|
|
23 typedef CN<N + 1> CNp1;
|
|
24 };
|
|
25
|
|
26 template <int N>
|
|
27 struct X_class_CNp1 {
|
|
28 typedef class CN<N + 1> CNp1; // { dg-warning "-Wmismatched-tags" }
|
|
29 };
|
|
30
|
|
31 template <int N>
|
|
32 struct X_struct_CNp1 {
|
|
33 typedef struct CN<N + 1> CNp1;
|
|
34 };
|
|
35
|
|
36
|
|
37 // Exercise partial specialization of templates with member types.
|
|
38 template <class> class CT1;
|
|
39 template <class T> struct CT1<T*> { };
|
|
40 template <class T> struct CT1<T**> { };
|
|
41 template <class T> class CT1<T***> { };
|
|
42
|
|
43 template <class> struct CT2;
|
|
44 template <class T> struct CT2<T*> {
|
|
45 // Expect class-key to match the primary.
|
|
46 CT1<T> ct1_0;
|
|
47 class CT1<T> ct1_1;
|
|
48 struct CT1<T> ct1_2; // { dg-warning "-Wmismatched-tags" }
|
|
49
|
|
50 // Expect class-key to match the CT1<T*> partial specialization.
|
|
51 CT1<T*> ct1p1_0;
|
|
52 class CT1<T*> ct1p1_1; // { dg-warning "-Wmismatched-tags" }
|
|
53 struct CT1<T*> ct1p1_2;
|
|
54
|
|
55 // Expect class-key to match the CT1<T**> partial specialization.
|
|
56 CT1<T**> ct1p2_0;
|
|
57 class CT1<T**> ct1p2_1; // { dg-warning "-Wmismatched-tags" }
|
|
58 struct CT1<T**> ct1p2_2;
|
|
59
|
|
60 // Expect class-key to match the CT1<T***> partial specialization.
|
|
61 CT1<T***> ct1p3_0;
|
|
62 class CT1<T***> ct1p3_1;
|
|
63 struct CT1<T***> ct1p3_2; // { dg-warning "-Wmismatched-tags" }
|
|
64
|
|
65 // Expect class-key to still match the CT1<T***> partial specialization.
|
|
66 CT1<T****> ct1p4_0;
|
|
67 class CT1<T****> ct1p4_1;
|
|
68 struct CT1<T****> ct1p4_2; // { dg-warning "-Wmismatched-tags" }
|
|
69 };
|
|
70
|
|
71 // Exercise many partial specializations (since the class-key for each
|
|
72 // must be tracked separately from the others).
|
|
73 template <class> class D;
|
|
74 template <class T> struct D<T*>;
|
|
75 template <class T> class D<T&>;
|
|
76 template <class T> struct D<const T*>;
|
|
77 template <class T> class D<const T&>;
|
|
78 template <class T> struct D<volatile T*>;
|
|
79 template <class T> class D<volatile T&>;
|
|
80 template <class T> struct D<const volatile T*>;
|
|
81 template <class T> class D<const volatile T&>;
|
|
82
|
|
83 typedef class D<int*> DIP; // { dg-warning "-Wmismatched-tags" }
|
|
84 typedef struct D<int*> DIP;
|
|
85 typedef class D<int*> DIP; // { dg-warning "-Wmismatched-tags" }
|
|
86 typedef struct D<int*> DIP;
|
|
87
|
|
88 typedef class D<int&> DIR;
|
|
89 typedef struct D<int&> DIR; // { dg-warning "-Wmismatched-tags" }
|
|
90 typedef class D<int&> DIR;
|
|
91
|
|
92
|
|
93 typedef struct D<const int*> DCIP;
|
|
94 typedef class D<const int*> DCIP; // { dg-warning "-Wmismatched-tags" }
|
|
95 typedef struct D<const int*> DCIP;
|
|
96
|
|
97 typedef struct D<const int&> DCIR; // { dg-warning "-Wmismatched-tags" }
|
|
98 typedef class D<const int&> DCIR;
|
|
99 typedef struct D<const int&> DCIR; // { dg-warning "-Wmismatched-tags" }
|
|
100
|
|
101
|
|
102 typedef struct D<volatile int*> DVIP;
|
|
103 typedef class D<volatile int*> DVIP; // { dg-warning "-Wmismatched-tags" }
|
|
104 typedef struct D<volatile int*> DVIP;
|
|
105
|
|
106 typedef struct D<volatile int&> DVIR; // { dg-warning "-Wmismatched-tags" }
|
|
107 typedef class D<volatile int&> DVIR;
|
|
108 typedef struct D<volatile int&> DVIR; // { dg-warning "-Wmismatched-tags" }
|
|
109
|
|
110
|
|
111 typedef struct D<const volatile int*> DCVIP;
|
|
112 typedef class D<const volatile int*> DCVIP; // { dg-warning "-Wmismatched-tags" }
|
|
113 typedef struct D<const volatile int*> DCVIP;
|
|
114
|
|
115 typedef struct D<const volatile int&> DCVIR; // { dg-warning "-Wmismatched-tags" }
|
|
116 typedef class D<const volatile int&> DCVIR;
|
|
117 typedef struct D<const volatile int&> DCVIR; // { dg-warning "-Wmismatched-tags" }
|