summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg
diff options
context:
space:
mode:
authoremsr <emsr@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-01 23:00:48 +0000
committeremsr <emsr@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-01 23:00:48 +0000
commit1b877311222c05bd8a3e5df2518d514f32a0102e (patch)
tree235f6f34f7f71fe3e8c571751e62d95f1d95ffe0 /gcc/testsuite/g++.dg
parent51b0c824619867572826bbe669546eac45110897 (diff)
downloadgcc-1b877311222c05bd8a3e5df2518d514f32a0102e.tar.gz
gcc/cp:
2013-11-01 Edward Smith-Rowland <3dw4rd@verizon.net> PR c++/58708 * parser.c (make_string_pack): Discover non-const type and size of character and build parm pack with correct type and chars. gcc/testsuite: 2013-11-01 Edward Smith-Rowland <3dw4rd@verizon.net> PR c++/58708 * g++.dg/cpp1y/pr58708.C: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204305 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/g++.dg')
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr58708.C60
1 files changed, 60 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr58708.C b/gcc/testsuite/g++.dg/cpp1y/pr58708.C
new file mode 100644
index 00000000000..a9c19ebb6c3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr58708.C
@@ -0,0 +1,60 @@
+// { dg-options -std=c++1y }
+// { dg-do run }
+
+template<typename, typename>
+ struct is_same
+ {
+ static constexpr bool value = false;
+ };
+
+template<typename _Tp>
+ struct is_same<_Tp, _Tp>
+ {
+ static constexpr bool value = true;
+ };
+
+template<typename CharT, CharT... Str>
+ struct Foo
+ {
+ using char_type = CharT;
+ char_type chars[sizeof...(Str)]{Str...};
+ };
+
+template<typename CharT, CharT... Str>
+ Foo<CharT, Str...>
+ operator""_foo()
+ {
+ return Foo<CharT, Str...>();
+ }
+
+int
+main()
+{
+ auto fooU = U"\x10000\x10001\x10002"_foo;
+ if (is_same<decltype(fooU)::char_type, char32_t>::value != true) __builtin_abort();
+ if (sizeof(fooU.chars)/sizeof(char32_t) != 3) __builtin_abort();
+ if (fooU.chars[0] != 65536) __builtin_abort();
+ if (fooU.chars[1] != 65537) __builtin_abort();
+ if (fooU.chars[2] != 65538) __builtin_abort();
+
+ auto foo = "\x61\x62\x63"_foo;
+ if (is_same<decltype(foo)::char_type, char>::value != true) __builtin_abort();
+ if (sizeof(foo.chars)/sizeof(char) != 3) __builtin_abort();
+ if (foo.chars[0] != 97) __builtin_abort();
+ if (foo.chars[1] != 98) __builtin_abort();
+ if (foo.chars[2] != 99) __builtin_abort();
+
+ auto wfoo = L"\x01020304\x05060708"_foo;
+ if (is_same<decltype(wfoo)::char_type, wchar_t>::value != true) __builtin_abort();
+ if (sizeof(wfoo.chars)/sizeof(wchar_t) != 2) __builtin_abort();
+ if (wfoo.chars[0] != 16909060) __builtin_abort();
+ if (wfoo.chars[1] != 84281096) __builtin_abort();
+
+ auto foou = u"\x0102\x0304\x0506\x0708"_foo;
+ if (is_same<decltype(foou)::char_type, char16_t>::value != true) __builtin_abort();
+ if (sizeof(foou.chars)/sizeof(char16_t) != 4) __builtin_abort();
+ if (foou.chars[0] != 258) __builtin_abort();
+ if (foou.chars[1] != 772) __builtin_abort();
+ if (foou.chars[2] != 1286) __builtin_abort();
+ if (foou.chars[3] != 1800) __builtin_abort();
+}