1 // PR c++/57734 2 // { dg-do compile { target c++11 } } 3 4 template<typename T, typename U> 5 struct same_type { static const bool value = false; }; 6 7 template<typename T> 8 struct same_type<T, T> { static const bool value = true; }; 9 10 enum e { zero }; 11 enum class eclass { one }; 12 13 template<typename T> 14 using enum_alias = e; 15 16 template<typename T> 17 using eclass_alias = eclass; 18 19 typedef enum_alias<void> etest0; 20 typedef enum_alias<void> etest0; 21 typedef enum_alias<int> etest0; 22 typedef enum_alias<int> etest1; 23 24 static_assert (same_type<etest0, etest1>::value, ""); 25 26 typedef eclass_alias<void> ectest0; 27 typedef eclass_alias<void> ectest0; 28 typedef eclass_alias<int> ectest0; 29 typedef eclass_alias<int> ectest1; 30 31 static_assert (same_type<ectest0, ectest1>::value, ""); 32 33 template<typename T> 34 enum_alias<T> efoo(T f) { return enum_alias<T>::zero; } 35 36 template<typename T> 37 constexpr enum_alias<T> cefoo(T f) { return enum_alias<T>::zero; } 38 39 static_assert ( cefoo(1) == e::zero, ""); 40 41 template<typename T> 42 eclass_alias<T> ecfoo(T f) { return eclass_alias<T>::one; } 43 44 template<typename T> 45 constexpr eclass_alias<T> cecfoo(T f) { return eclass_alias<T>::one; } 46 47 static_assert ( cecfoo(1) == eclass::one, ""); 48