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