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