1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // XFAIL: libcpp-no-exceptions 11 // <string> 12 13 // double stod(const string& str, size_t *idx = 0); 14 // double stod(const wstring& str, size_t *idx = 0); 15 16 #include <string> 17 #include <cmath> 18 #include <cassert> 19 20 int main() 21 { 22 assert(std::stod("0") == 0); 23 assert(std::stod(L"0") == 0); 24 assert(std::stod("-0") == 0); 25 assert(std::stod(L"-0") == 0); 26 assert(std::stod("-10") == -10); 27 assert(std::stod(L"-10.5") == -10.5); 28 assert(std::stod(" 10") == 10); 29 assert(std::stod(L" 10") == 10); 30 size_t idx = 0; 31 assert(std::stod("10g", &idx) == 10); 32 assert(idx == 2); 33 idx = 0; 34 assert(std::stod(L"10g", &idx) == 10); 35 assert(idx == 2); 36 try 37 { 38 assert(std::stod("1.e60", &idx) == 1.e60); 39 assert(idx == 5); 40 } 41 catch (const std::out_of_range&) 42 { 43 assert(false); 44 } 45 try 46 { 47 assert(std::stod(L"1.e60", &idx) == 1.e60); 48 assert(idx == 5); 49 } 50 catch (const std::out_of_range&) 51 { 52 assert(false); 53 } 54 idx = 0; 55 try 56 { 57 assert(std::stod("1.e360", &idx) == INFINITY); 58 assert(false); 59 } 60 catch (const std::out_of_range&) 61 { 62 assert(idx == 0); 63 } 64 try 65 { 66 assert(std::stod(L"1.e360", &idx) == INFINITY); 67 assert(false); 68 } 69 catch (const std::out_of_range&) 70 { 71 assert(idx == 0); 72 } 73 try 74 { 75 assert(std::stod("INF", &idx) == INFINITY); 76 assert(idx == 3); 77 } 78 catch (const std::out_of_range&) 79 { 80 assert(false); 81 } 82 idx = 0; 83 try 84 { 85 assert(std::stod(L"INF", &idx) == INFINITY); 86 assert(idx == 3); 87 } 88 catch (const std::out_of_range&) 89 { 90 assert(false); 91 } 92 idx = 0; 93 try 94 { 95 assert(std::isnan(std::stod("NAN", &idx))); 96 assert(idx == 3); 97 } 98 catch (const std::out_of_range&) 99 { 100 assert(false); 101 } 102 idx = 0; 103 try 104 { 105 assert(std::isnan(std::stod(L"NAN", &idx))); 106 assert(idx == 3); 107 } 108 catch (const std::out_of_range&) 109 { 110 assert(false); 111 } 112 idx = 0; 113 try 114 { 115 std::stod("", &idx); 116 assert(false); 117 } 118 catch (const std::invalid_argument&) 119 { 120 assert(idx == 0); 121 } 122 try 123 { 124 std::stod(L"", &idx); 125 assert(false); 126 } 127 catch (const std::invalid_argument&) 128 { 129 assert(idx == 0); 130 } 131 try 132 { 133 std::stod(" - 8", &idx); 134 assert(false); 135 } 136 catch (const std::invalid_argument&) 137 { 138 assert(idx == 0); 139 } 140 try 141 { 142 std::stod(L" - 8", &idx); 143 assert(false); 144 } 145 catch (const std::invalid_argument&) 146 { 147 assert(idx == 0); 148 } 149 try 150 { 151 std::stod("a1", &idx); 152 assert(false); 153 } 154 catch (const std::invalid_argument&) 155 { 156 assert(idx == 0); 157 } 158 try 159 { 160 std::stod(L"a1", &idx); 161 assert(false); 162 } 163 catch (const std::invalid_argument&) 164 { 165 assert(idx == 0); 166 } 167 } 168