1 struct X { 2 int v; 3 typedef int t; 4 }; 5 6 struct YB { 7 typedef YB Y; 8 int value; 9 typedef int type; 10 }; 11 12 struct YBRev { 13 typedef int value; 14 int type; 15 }; 16 17 template<typename T> struct C : X, T { 18 using T::value; 19 using typename T::type; 20 using X::v; 21 using typename X::t; 22 }; 23 24 template<typename T> struct D : X, T { 25 // Mismatch in type/non-type-ness. 26 using typename T::value; 27 using T::type; 28 using X::v; 29 using typename X::t; 30 }; 31 32 #if __cplusplus <= 199711L // C++11 does not allow access declerations 33 template<typename T> struct E : X, T { 34 // Mismatch in using/access-declaration-ness. 35 T::value; 36 X::v; 37 }; 38 #endif 39 40 template<typename T> struct F : X, T { 41 // Mismatch in nested-name-specifier. 42 using T::Y::value; 43 using typename T::Y::type; 44 using ::X::v; 45 using typename ::X::t; 46 }; 47 48 // Force instantiation. 49 typedef C<YB>::type I; 50 typedef D<YBRev>::t I; 51 52 #if __cplusplus <= 199711L // C++11 does not allow access declerations 53 typedef E<YB>::type I; 54 #endif 55 56 typedef F<YB>::type I; 57