https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84586
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |rejects-valid Status|UNCONFIRMED |NEW Last reconfirmed| |2018-02-27 Ever confirmed|0 |1 --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- Reduced and fixed to compile with clang: namespace std { using size_t = decltype(sizeof(0)); template<typename T> struct tuple { }; template<size_t, typename T> struct tuple_element; template<typename T> struct tuple_element<0, tuple<T>> { using type = T; }; } #ifdef USING_SIMPLE_BASE #define BASE base<T> #else #ifdef USING_DIFFERENT_NAME #define NAME type_ #else #define NAME type #endif #define BASE tuple_element_t<0,std::tuple<base<T>>> #endif //Simple trait for replacement of nested name template<std::size_t I, typename T> struct tuple_element :private std::tuple_element<I,T>::type { using NAME = typename std::tuple_element<I,T>::type; }; template<std::size_t I, typename T> using tuple_element_t = typename tuple_element<I,T>::NAME; template<typename> struct base { protected: using type = int; }; template<typename T> struct derived :private BASE { using typename BASE::type; }; int main() { return derived<int>::type(0); }