diff --git a/libcxx/src/chrono.cpp b/libcxx/src/chrono.cpp --- a/libcxx/src/chrono.cpp +++ b/libcxx/src/chrono.cpp @@ -153,7 +153,10 @@ LARGE_INTEGER counter; (void) QueryPerformanceCounter(&counter); - return steady_clock::time_point(steady_clock::duration(counter.QuadPart * nano::den / freq.QuadPart)); + auto seconds = counter.QuadPart / freq.QuadPart; + auto fractions = counter.QuadPart % freq.QuadPart; + auto dur = seconds * nano::den + fractions * nano::den / freq.QuadPart; + return steady_clock::time_point(steady_clock::duration(dur)); } #elif defined(CLOCK_MONOTONIC) diff --git a/libcxx/test/std/utilities/time/time.clock/time.clock.steady/now.pass.cpp b/libcxx/test/std/utilities/time/time.clock/time.clock.steady/now.pass.cpp --- a/libcxx/test/std/utilities/time/time.clock/time.clock.steady/now.pass.cpp +++ b/libcxx/test/std/utilities/time/time.clock/time.clock.steady/now.pass.cpp @@ -25,6 +25,8 @@ C::time_point t1 = C::now(); C::time_point t2 = C::now(); assert(t2 >= t1); + // make sure t2 didn't wrap around + assert(t2 > std::chrono::time_point()); return 0; }