struct X { int v; typedef int t; }; struct YB { typedef YB Y; int value; typedef int type; }; struct YBRev { typedef int value; int type; }; template struct C : X, T { using T::value; using typename T::type; using X::v; using typename X::t; }; template struct D : X, T { // Mismatch in type/non-type-ness. using typename T::value; using T::type; using X::v; using typename X::t; }; #if __cplusplus <= 199711L // C++11 does not allow access declarations template struct E : X, T { // Mismatch in using/access-declaration-ness. T::value; X::v; }; #endif template struct F : X, T { // Mismatch in nested-name-specifier. using T::Y::value; using typename T::Y::type; using ::X::v; using typename ::X::t; }; // Force instantiation. typedef C::type I; typedef D::t I; #if __cplusplus <= 199711L // C++11 does not allow access declarations typedef E::type I; #endif typedef F::type I;