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