1 // PR 98116, ICE with stripping typedef array type 2 // { dg-do compile { target c++11 } } 3 // { dg-additional-options {--param=hash-table-verification-limit=10000000 -fchecking=2} } 4 5 // We got confused by alias templates that alias the same type. Their 6 // hashes were different (good), but they compared equal (bad) 7 8 namespace std { 9 struct is_convertible; 10 template <typename _Tp> using remove_pointer_t = typename _Tp ::type; 11 template <bool> struct enable_if; 12 template <typename> void declval(); 13 template <bool _Cond> using enable_if_t = typename enable_if<_Cond>::type; 14 template <typename, typename> class Trans_NS___cxx11_basic_string { 15 long _M_string_length; 16 }; 17 } // namespace std 18 struct string16_char_traits; 19 template class std::Trans_NS___cxx11_basic_string<unsigned short, 20 string16_char_traits>; 21 template <typename, typename> using IsLegalDataConversion = std::is_convertible; 22 template <typename Container, typename T> 23 using ContainerHasConvertibleData = IsLegalDataConversion< 24 std::remove_pointer_t<decltype(std::declval<Container>)>, T>; 25 template <typename Array, typename T, long> 26 using EnableIfSpanCompatibleArray = 27 std::enable_if_t<ContainerHasConvertibleData<Array, T>::value>; 28 template <int Extent> class span { 29 template <long N, EnableIfSpanCompatibleArray< 30 const std::Trans_NS___cxx11_basic_string< 31 unsigned short, string16_char_traits>[N], 32 std::Trans_NS___cxx11_basic_string<short, int>, Extent>> 33 span(); 34 }; 35