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); }

Reply via email to