1 // { dg-do run { target c++14 } } 2 // { dg-options -w } 3 4 template<typename, typename> 5 struct is_same 6 { 7 static constexpr bool value = false; 8 }; 9 10 template<typename _Tp> 11 struct is_same<_Tp, _Tp> 12 { 13 static constexpr bool value = true; 14 }; 15 16 template<typename CharT, CharT... Str> 17 struct Foo 18 { 19 using char_type = CharT; 20 char_type chars[sizeof...(Str)]{Str...}; 21 }; 22 23 template<typename CharT, CharT... Str> 24 Foo<CharT, Str...> 25 operator""_foo() 26 { 27 return Foo<CharT, Str...>(); 28 } 29 30 int 31 main() 32 { 33 auto fooU = U"\x10000\x10001\x10002"_foo; 34 if (is_same<decltype(fooU)::char_type, char32_t>::value != true) __builtin_abort(); 35 if (sizeof(fooU.chars)/sizeof(char32_t) != 3) __builtin_abort(); 36 if (fooU.chars[0] != 65536) __builtin_abort(); 37 if (fooU.chars[1] != 65537) __builtin_abort(); 38 if (fooU.chars[2] != 65538) __builtin_abort(); 39 40 auto foo = "\x61\x62\x63"_foo; 41 if (is_same<decltype(foo)::char_type, char>::value != true) __builtin_abort(); 42 if (sizeof(foo.chars)/sizeof(char) != 3) __builtin_abort(); 43 if (foo.chars[0] != 97) __builtin_abort(); 44 if (foo.chars[1] != 98) __builtin_abort(); 45 if (foo.chars[2] != 99) __builtin_abort(); 46 47 #if __SIZEOF_WCHAR_T__ == 2 48 auto wfoo = L"\x0102\x0304"_foo; 49 #else 50 auto wfoo = L"\x01020304\x05060708"_foo; 51 #endif 52 if (is_same<decltype(wfoo)::char_type, wchar_t>::value != true) __builtin_abort(); 53 if (sizeof(wfoo.chars)/sizeof(wchar_t) != 2) __builtin_abort(); 54 #if __SIZEOF_WCHAR_T__ == 2 55 if (wfoo.chars[0] != 258) __builtin_abort(); 56 if (wfoo.chars[1] != 772) __builtin_abort(); 57 #else 58 if (wfoo.chars[0] != 16909060) __builtin_abort(); 59 if (wfoo.chars[1] != 84281096) __builtin_abort(); 60 #endif 61 62 auto foou = u"\x0102\x0304\x0506\x0708"_foo; 63 if (is_same<decltype(foou)::char_type, char16_t>::value != true) __builtin_abort(); 64 if (sizeof(foou.chars)/sizeof(char16_t) != 4) __builtin_abort(); 65 if (foou.chars[0] != 258) __builtin_abort(); 66 if (foou.chars[1] != 772) __builtin_abort(); 67 if (foou.chars[2] != 1286) __builtin_abort(); 68 if (foou.chars[3] != 1800) __builtin_abort(); 69 } 70