summaryrefslogtreecommitdiff
path: root/test/std/strings/string.conversions
diff options
context:
space:
mode:
Diffstat (limited to 'test/std/strings/string.conversions')
-rw-r--r--test/std/strings/string.conversions/stod.pass.cpp166
-rw-r--r--test/std/strings/string.conversions/stof.pass.cpp170
-rw-r--r--test/std/strings/string.conversions/stoi.pass.cpp108
-rw-r--r--test/std/strings/string.conversions/stol.pass.cpp111
-rw-r--r--test/std/strings/string.conversions/stold.pass.cpp168
-rw-r--r--test/std/strings/string.conversions/stoll.pass.cpp110
-rw-r--r--test/std/strings/string.conversions/stoul.pass.cpp109
-rw-r--r--test/std/strings/string.conversions/stoull.pass.cpp110
-rw-r--r--test/std/strings/string.conversions/to_string.pass.cpp126
-rw-r--r--test/std/strings/string.conversions/to_wstring.pass.cpp126
10 files changed, 1304 insertions, 0 deletions
diff --git a/test/std/strings/string.conversions/stod.pass.cpp b/test/std/strings/string.conversions/stod.pass.cpp
new file mode 100644
index 0000000000000..026d2301e0710
--- /dev/null
+++ b/test/std/strings/string.conversions/stod.pass.cpp
@@ -0,0 +1,166 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <string>
+
+// double stod(const string& str, size_t *idx = 0);
+// double stod(const wstring& str, size_t *idx = 0);
+
+#include <string>
+#include <cmath>
+#include <cassert>
+
+int main()
+{
+ assert(std::stod("0") == 0);
+ assert(std::stod(L"0") == 0);
+ assert(std::stod("-0") == 0);
+ assert(std::stod(L"-0") == 0);
+ assert(std::stod("-10") == -10);
+ assert(std::stod(L"-10.5") == -10.5);
+ assert(std::stod(" 10") == 10);
+ assert(std::stod(L" 10") == 10);
+ size_t idx = 0;
+ assert(std::stod("10g", &idx) == 10);
+ assert(idx == 2);
+ idx = 0;
+ assert(std::stod(L"10g", &idx) == 10);
+ assert(idx == 2);
+ try
+ {
+ assert(std::stod("1.e60", &idx) == 1.e60);
+ assert(idx == 5);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ try
+ {
+ assert(std::stod(L"1.e60", &idx) == 1.e60);
+ assert(idx == 5);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::stod("1.e360", &idx) == INFINITY);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ assert(std::stod(L"1.e360", &idx) == INFINITY);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ assert(std::stod("INF", &idx) == INFINITY);
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::stod(L"INF", &idx) == INFINITY);
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::isnan(std::stod("NAN", &idx)));
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::isnan(std::stod(L"NAN", &idx)));
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ std::stod("", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stod(L"", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stod(" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stod(L" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stod("a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stod(L"a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+}
diff --git a/test/std/strings/string.conversions/stof.pass.cpp b/test/std/strings/string.conversions/stof.pass.cpp
new file mode 100644
index 0000000000000..3e9b681ddeb1d
--- /dev/null
+++ b/test/std/strings/string.conversions/stof.pass.cpp
@@ -0,0 +1,170 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin11
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin12
+
+// <string>
+
+// float stof(const string& str, size_t *idx = 0);
+// float stof(const wstring& str, size_t *idx = 0);
+
+#include <string>
+#include <cmath>
+#include <cassert>
+
+int main()
+{
+ assert(std::stof("0") == 0);
+ assert(std::stof(L"0") == 0);
+ assert(std::stof("-0") == 0);
+ assert(std::stof(L"-0") == 0);
+ assert(std::stof("-10") == -10);
+ assert(std::stof(L"-10.5") == -10.5);
+ assert(std::stof(" 10") == 10);
+ assert(std::stof(L" 10") == 10);
+ size_t idx = 0;
+ assert(std::stof("10g", &idx) == 10);
+ assert(idx == 2);
+ idx = 0;
+ assert(std::stof(L"10g", &idx) == 10);
+ assert(idx == 2);
+ idx = 0;
+ try
+ {
+ assert(std::stof("1.e60", &idx) == INFINITY);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ assert(std::stof(L"1.e60", &idx) == INFINITY);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::stof("1.e360", &idx) == INFINITY);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ assert(std::stof(L"1.e360", &idx) == INFINITY);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ assert(std::stof("INF", &idx) == INFINITY);
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::stof(L"INF", &idx) == INFINITY);
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::isnan(std::stof("NAN", &idx)));
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::isnan(std::stof(L"NAN", &idx)));
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ std::stof("", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stof(L"", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stof(" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stof(L" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stof("a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stof(L"a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+}
diff --git a/test/std/strings/string.conversions/stoi.pass.cpp b/test/std/strings/string.conversions/stoi.pass.cpp
new file mode 100644
index 0000000000000..c2fc2103579da
--- /dev/null
+++ b/test/std/strings/string.conversions/stoi.pass.cpp
@@ -0,0 +1,108 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <string>
+
+// int stoi(const string& str, size_t *idx = 0, int base = 10);
+// int stoi(const wstring& str, size_t *idx = 0, int base = 10);
+
+#include <string>
+#include <cassert>
+
+int main()
+{
+ assert(std::stoi("0") == 0);
+ assert(std::stoi(L"0") == 0);
+ assert(std::stoi("-0") == 0);
+ assert(std::stoi(L"-0") == 0);
+ assert(std::stoi("-10") == -10);
+ assert(std::stoi(L"-10") == -10);
+ assert(std::stoi(" 10") == 10);
+ assert(std::stoi(L" 10") == 10);
+ size_t idx = 0;
+ assert(std::stoi("10g", &idx, 16) == 16);
+ assert(idx == 2);
+ idx = 0;
+ assert(std::stoi(L"10g", &idx, 16) == 16);
+ assert(idx == 2);
+ if (std::numeric_limits<long>::max() > std::numeric_limits<int>::max())
+ {
+ try
+ {
+ std::stoi("0x100000000", &idx, 16);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ }
+ try
+ {
+ std::stoi(L"0x100000000", &idx, 16);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ }
+ }
+ idx = 0;
+ try
+ {
+ std::stoi("", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoi(L"", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoi(" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoi(L" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoi("a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoi(L"a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+}
diff --git a/test/std/strings/string.conversions/stol.pass.cpp b/test/std/strings/string.conversions/stol.pass.cpp
new file mode 100644
index 0000000000000..dbbccc92799cb
--- /dev/null
+++ b/test/std/strings/string.conversions/stol.pass.cpp
@@ -0,0 +1,111 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin11
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin12
+
+// <string>
+
+// long stol(const string& str, size_t *idx = 0, int base = 10);
+// long stol(const wstring& str, size_t *idx = 0, int base = 10);
+
+#include <string>
+#include <cassert>
+
+int main()
+{
+ assert(std::stol("0") == 0);
+ assert(std::stol(L"0") == 0);
+ assert(std::stol("-0") == 0);
+ assert(std::stol(L"-0") == 0);
+ assert(std::stol("-10") == -10);
+ assert(std::stol(L"-10") == -10);
+ assert(std::stol(" 10") == 10);
+ assert(std::stol(L" 10") == 10);
+ size_t idx = 0;
+ assert(std::stol("10g", &idx, 16) == 16);
+ assert(idx == 2);
+ idx = 0;
+ assert(std::stol(L"10g", &idx, 16) == 16);
+ assert(idx == 2);
+ idx = 0;
+ try
+ {
+ std::stol("", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stol(L"", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stol(" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stol(L" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stol("a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stol(L"a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+// LWG issue #2009
+ try
+ {
+ std::stol("9999999999999999999999999999999999999999999999999", &idx);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stol(L"9999999999999999999999999999999999999999999999999", &idx);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+}
diff --git a/test/std/strings/string.conversions/stold.pass.cpp b/test/std/strings/string.conversions/stold.pass.cpp
new file mode 100644
index 0000000000000..93c59fe09a11f
--- /dev/null
+++ b/test/std/strings/string.conversions/stold.pass.cpp
@@ -0,0 +1,168 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <string>
+
+// long double stold(const string& str, size_t *idx = 0);
+// long double stold(const wstring& str, size_t *idx = 0);
+
+#include <iostream>
+
+#include <string>
+#include <cmath>
+#include <cassert>
+
+int main()
+{
+ assert(std::stold("0") == 0);
+ assert(std::stold(L"0") == 0);
+ assert(std::stold("-0") == 0);
+ assert(std::stold(L"-0") == 0);
+ assert(std::stold("-10") == -10);
+ assert(std::stold(L"-10.5") == -10.5);
+ assert(std::stold(" 10") == 10);
+ assert(std::stold(L" 10") == 10);
+ size_t idx = 0;
+ assert(std::stold("10g", &idx) == 10);
+ assert(idx == 2);
+ idx = 0;
+ assert(std::stold(L"10g", &idx) == 10);
+ assert(idx == 2);
+ try
+ {
+ assert(std::stold("1.e60", &idx) == 1.e60L);
+ assert(idx == 5);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ try
+ {
+ assert(std::stold(L"1.e60", &idx) == 1.e60L);
+ assert(idx == 5);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::stold("1.e6000", &idx) == INFINITY);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ assert(std::stold(L"1.e6000", &idx) == INFINITY);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ assert(std::stold("INF", &idx) == INFINITY);
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::stold(L"INF", &idx) == INFINITY);
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::isnan(std::stold("NAN", &idx)));
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ assert(std::isnan(std::stold(L"NAN", &idx)));
+ assert(idx == 3);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(false);
+ }
+ idx = 0;
+ try
+ {
+ std::stold("", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stold(L"", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stold(" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stold(L" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stold("a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stold(L"a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+}
diff --git a/test/std/strings/string.conversions/stoll.pass.cpp b/test/std/strings/string.conversions/stoll.pass.cpp
new file mode 100644
index 0000000000000..f68490ed13ae7
--- /dev/null
+++ b/test/std/strings/string.conversions/stoll.pass.cpp
@@ -0,0 +1,110 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin11
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin12
+
+// <string>
+
+// long long stoll(const string& str, size_t *idx = 0, int base = 10);
+// long long stoll(const wstring& str, size_t *idx = 0, int base = 10);
+
+#include <string>
+#include <cassert>
+
+int main()
+{
+ assert(std::stoll("0") == 0);
+ assert(std::stoll(L"0") == 0);
+ assert(std::stoll("-0") == 0);
+ assert(std::stoll(L"-0") == 0);
+ assert(std::stoll("-10") == -10);
+ assert(std::stoll(L"-10") == -10);
+ assert(std::stoll(" 10") == 10);
+ assert(std::stoll(L" 10") == 10);
+ size_t idx = 0;
+ assert(std::stoll("10g", &idx, 16) == 16);
+ assert(idx == 2);
+ idx = 0;
+ assert(std::stoll(L"10g", &idx, 16) == 16);
+ assert(idx == 2);
+ idx = 0;
+ try
+ {
+ std::stoll("", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoll(L"", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoll(" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoll(L" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoll("a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoll(L"a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoll("99999999999999999999999999", &idx);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoll(L"99999999999999999999999999", &idx);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+}
diff --git a/test/std/strings/string.conversions/stoul.pass.cpp b/test/std/strings/string.conversions/stoul.pass.cpp
new file mode 100644
index 0000000000000..37d33c4a9091f
--- /dev/null
+++ b/test/std/strings/string.conversions/stoul.pass.cpp
@@ -0,0 +1,109 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin11
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin12
+
+// <string>
+
+// unsigned long stoul(const string& str, size_t *idx = 0, int base = 10);
+// unsigned long stoul(const wstring& str, size_t *idx = 0, int base = 10);
+
+#include <string>
+#include <cassert>
+
+int main()
+{
+ assert(std::stoul("0") == 0);
+ assert(std::stoul(L"0") == 0);
+ assert(std::stoul("-0") == 0);
+ assert(std::stoul(L"-0") == 0);
+ assert(std::stoul(" 10") == 10);
+ assert(std::stoul(L" 10") == 10);
+ size_t idx = 0;
+ assert(std::stoul("10g", &idx, 16) == 16);
+ assert(idx == 2);
+ idx = 0;
+ assert(std::stoul(L"10g", &idx, 16) == 16);
+ assert(idx == 2);
+ idx = 0;
+ try
+ {
+ std::stoul("", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoul(L"", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoul(" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoul(L" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoul("a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoul(L"a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+// LWG issue #2009
+ try
+ {
+ std::stoul("9999999999999999999999999999999999999999999999999", &idx);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoul(L"9999999999999999999999999999999999999999999999999", &idx);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+}
diff --git a/test/std/strings/string.conversions/stoull.pass.cpp b/test/std/strings/string.conversions/stoull.pass.cpp
new file mode 100644
index 0000000000000..c0667edb385eb
--- /dev/null
+++ b/test/std/strings/string.conversions/stoull.pass.cpp
@@ -0,0 +1,110 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin11
+// XFAIL: with_system_cxx_lib=x86_64-apple-darwin12
+
+// <string>
+
+// unsigned long long stoull(const string& str, size_t *idx = 0, int base = 10);
+// unsigned long long stoull(const wstring& str, size_t *idx = 0, int base = 10);
+
+#include <string>
+#include <cassert>
+
+int main()
+{
+ assert(std::stoull("0") == 0);
+ assert(std::stoull(L"0") == 0);
+ assert(std::stoull("-0") == 0);
+ assert(std::stoull(L"-0") == 0);
+ assert(std::stoull(" 10") == 10);
+ assert(std::stoull(L" 10") == 10);
+ size_t idx = 0;
+ assert(std::stoull("10g", &idx, 16) == 16);
+ assert(idx == 2);
+ idx = 0;
+ assert(std::stoull(L"10g", &idx, 16) == 16);
+ assert(idx == 2);
+ idx = 0;
+ try
+ {
+ std::stoull("", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ idx = 0;
+ try
+ {
+ std::stoull(L"", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoull(" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoull(L" - 8", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoull("a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoull(L"a1", &idx);
+ assert(false);
+ }
+ catch (const std::invalid_argument&)
+ {
+ assert(idx == 0);
+ }
+// LWG issue #2009
+ try
+ {
+ std::stoull("9999999999999999999999999999999999999999999999999", &idx);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+ try
+ {
+ std::stoull(L"9999999999999999999999999999999999999999999999999", &idx);
+ assert(false);
+ }
+ catch (const std::out_of_range&)
+ {
+ assert(idx == 0);
+ }
+}
diff --git a/test/std/strings/string.conversions/to_string.pass.cpp b/test/std/strings/string.conversions/to_string.pass.cpp
new file mode 100644
index 0000000000000..05e5e4b922a53
--- /dev/null
+++ b/test/std/strings/string.conversions/to_string.pass.cpp
@@ -0,0 +1,126 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <string>
+
+// string to_string(int val);
+// string to_string(unsigned val);
+// string to_string(long val);
+// string to_string(unsigned long val);
+// string to_string(long long val);
+// string to_string(unsigned long long val);
+// string to_string(float val);
+// string to_string(double val);
+// string to_string(long double val);
+
+#include <string>
+#include <cassert>
+#include <sstream>
+
+template <class T>
+void
+test_signed()
+{
+ {
+ std::string s = std::to_string(T(0));
+ assert(s.size() == 1);
+ assert(s[s.size()] == 0);
+ assert(s == "0");
+ }
+ {
+ std::string s = std::to_string(T(12345));
+ assert(s.size() == 5);
+ assert(s[s.size()] == 0);
+ assert(s == "12345");
+ }
+ {
+ std::string s = std::to_string(T(-12345));
+ assert(s.size() == 6);
+ assert(s[s.size()] == 0);
+ assert(s == "-12345");
+ }
+ {
+ std::string s = std::to_string(std::numeric_limits<T>::max());
+ assert(s.size() == std::numeric_limits<T>::digits10 + 1);
+ std::istringstream is(s);
+ T t(0);
+ is >> t;
+ assert(t == std::numeric_limits<T>::max());
+ }
+ {
+ std::string s = std::to_string(std::numeric_limits<T>::min());
+ std::istringstream is(s);
+ T t(0);
+ is >> t;
+ assert(t == std::numeric_limits<T>::min());
+ }
+}
+
+template <class T>
+void
+test_unsigned()
+{
+ {
+ std::string s = std::to_string(T(0));
+ assert(s.size() == 1);
+ assert(s[s.size()] == 0);
+ assert(s == "0");
+ }
+ {
+ std::string s = std::to_string(T(12345));
+ assert(s.size() == 5);
+ assert(s[s.size()] == 0);
+ assert(s == "12345");
+ }
+ {
+ std::string s = std::to_string(std::numeric_limits<T>::max());
+ assert(s.size() == std::numeric_limits<T>::digits10 + 1);
+ std::istringstream is(s);
+ T t(0);
+ is >> t;
+ assert(t == std::numeric_limits<T>::max());
+ }
+}
+
+template <class T>
+void
+test_float()
+{
+ {
+ std::string s = std::to_string(T(0));
+ assert(s.size() == 8);
+ assert(s[s.size()] == 0);
+ assert(s == "0.000000");
+ }
+ {
+ std::string s = std::to_string(T(12345));
+ assert(s.size() == 12);
+ assert(s[s.size()] == 0);
+ assert(s == "12345.000000");
+ }
+ {
+ std::string s = std::to_string(T(-12345));
+ assert(s.size() == 13);
+ assert(s[s.size()] == 0);
+ assert(s == "-12345.000000");
+ }
+}
+
+int main()
+{
+ test_signed<int>();
+ test_signed<long>();
+ test_signed<long long>();
+ test_unsigned<unsigned>();
+ test_unsigned<unsigned long>();
+ test_unsigned<unsigned long long>();
+ test_float<float>();
+ test_float<double>();
+ test_float<long double>();
+}
diff --git a/test/std/strings/string.conversions/to_wstring.pass.cpp b/test/std/strings/string.conversions/to_wstring.pass.cpp
new file mode 100644
index 0000000000000..281aa1a5e79bb
--- /dev/null
+++ b/test/std/strings/string.conversions/to_wstring.pass.cpp
@@ -0,0 +1,126 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <string>
+
+// wstring to_wstring(int val);
+// wstring to_wstring(unsigned val);
+// wstring to_wstring(long val);
+// wstring to_wstring(unsigned long val);
+// wstring to_wstring(long long val);
+// wstring to_wstring(unsigned long long val);
+// wstring to_wstring(float val);
+// wstring to_wstring(double val);
+// wstring to_wstring(long double val);
+
+#include <string>
+#include <cassert>
+#include <sstream>
+
+template <class T>
+void
+test_signed()
+{
+ {
+ std::wstring s = std::to_wstring(T(0));
+ assert(s.size() == 1);
+ assert(s[s.size()] == 0);
+ assert(s == L"0");
+ }
+ {
+ std::wstring s = std::to_wstring(T(12345));
+ assert(s.size() == 5);
+ assert(s[s.size()] == 0);
+ assert(s == L"12345");
+ }
+ {
+ std::wstring s = std::to_wstring(T(-12345));
+ assert(s.size() == 6);
+ assert(s[s.size()] == 0);
+ assert(s == L"-12345");
+ }
+ {
+ std::wstring s = std::to_wstring(std::numeric_limits<T>::max());
+ assert(s.size() == std::numeric_limits<T>::digits10 + 1);
+ std::wistringstream is(s);
+ T t(0);
+ is >> t;
+ assert(t == std::numeric_limits<T>::max());
+ }
+ {
+ std::wstring s = std::to_wstring(std::numeric_limits<T>::min());
+ std::wistringstream is(s);
+ T t(0);
+ is >> t;
+ assert(t == std::numeric_limits<T>::min());
+ }
+}
+
+template <class T>
+void
+test_unsigned()
+{
+ {
+ std::wstring s = std::to_wstring(T(0));
+ assert(s.size() == 1);
+ assert(s[s.size()] == 0);
+ assert(s == L"0");
+ }
+ {
+ std::wstring s = std::to_wstring(T(12345));
+ assert(s.size() == 5);
+ assert(s[s.size()] == 0);
+ assert(s == L"12345");
+ }
+ {
+ std::wstring s = std::to_wstring(std::numeric_limits<T>::max());
+ assert(s.size() == std::numeric_limits<T>::digits10 + 1);
+ std::wistringstream is(s);
+ T t(0);
+ is >> t;
+ assert(t == std::numeric_limits<T>::max());
+ }
+}
+
+template <class T>
+void
+test_float()
+{
+ {
+ std::wstring s = std::to_wstring(T(0));
+ assert(s.size() == 8);
+ assert(s[s.size()] == 0);
+ assert(s == L"0.000000");
+ }
+ {
+ std::wstring s = std::to_wstring(T(12345));
+ assert(s.size() == 12);
+ assert(s[s.size()] == 0);
+ assert(s == L"12345.000000");
+ }
+ {
+ std::wstring s = std::to_wstring(T(-12345));
+ assert(s.size() == 13);
+ assert(s[s.size()] == 0);
+ assert(s == L"-12345.000000");
+ }
+}
+
+int main()
+{
+ test_signed<int>();
+ test_signed<long>();
+ test_signed<long long>();
+ test_unsigned<unsigned>();
+ test_unsigned<unsigned long>();
+ test_unsigned<unsigned long long>();
+ test_float<float>();
+ test_float<double>();
+ test_float<long double>();
+}