111
|
1 // { dg-options "-w" }
|
|
2 // { dg-do run { target c++11 } }
|
|
3
|
|
4 #include<typeinfo>
|
|
5 #include<cassert>
|
|
6
|
|
7 // A simple typelist
|
|
8 template<typename... _Elements> struct types {};
|
|
9
|
|
10 // Simple bases implementation
|
|
11 template<typename T> struct b {
|
|
12 typedef types<__bases(T)...> type;
|
|
13 };
|
|
14
|
|
15 // Simple direct_bases implementation
|
|
16 template<typename T> struct db {
|
|
17 typedef types<__direct_bases(T)...> type;
|
|
18 };
|
|
19
|
|
20 template <class,class> struct assert_same_type;
|
|
21 template <class T> struct assert_same_type<T,T> {};
|
|
22
|
|
23 struct A {};
|
|
24 struct C : virtual A {};
|
|
25 struct D : public C {};
|
|
26 struct B : D, virtual A {};
|
|
27 struct E : C, virtual D, B {};
|
|
28 struct F : A, B, E {};
|
|
29
|
|
30 int main() {
|
|
31 assert_same_type<b<F>::type, types<A,C,D,A,C,D,B,C,C,D,B,E>>();
|
|
32 assert_same_type<db<F>::type, types<A,B,E>>();
|
|
33 assert_same_type<db<int>::type, types<>>();
|
|
34 return 0;
|
|
35 }
|