summaryrefslogtreecommitdiff
path: root/libchrome_tools/patches/Fix-TimeDelta.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libchrome_tools/patches/Fix-TimeDelta.patch')
-rw-r--r--libchrome_tools/patches/Fix-TimeDelta.patch164
1 files changed, 164 insertions, 0 deletions
diff --git a/libchrome_tools/patches/Fix-TimeDelta.patch b/libchrome_tools/patches/Fix-TimeDelta.patch
new file mode 100644
index 0000000000..65ab874a03
--- /dev/null
+++ b/libchrome_tools/patches/Fix-TimeDelta.patch
@@ -0,0 +1,164 @@
+commit db5f2b6e74d6d2e2a9c6f530199067c1d6eff7b6
+Author: Max Morin <maxmorin@chromium.org>
+Date: Mon Aug 27 09:45:24 2018 +0000
+
+ Make TimeDelta TriviallyCopyable for std::atomic.
+
+ We're having some awkwardness with working around the issue with stuff
+ like std::atomic<int64_t> and conversions back and forth. It would be
+ preferable to use std::atomic<TimeDelta> directly.
+
+ Removes the workaround added for bug 635974, since that was a bug in
+ vs 2015 and we use clang now.
+
+ Also fixes a couple of lint issues in time.h.
+
+ Bug: 635974, 851959, 761570
+ Change-Id: I4683f960b0c348748c5f0aaf222da4dda40256ec
+ Reviewed-on: https://chromium-review.googlesource.com/1184781
+ Commit-Queue: Max Morin <maxmorin@chromium.org>
+ Reviewed-by: Yuri Wiitala <miu@chromium.org>
+ Reviewed-by: Bruce Dawson <brucedawson@chromium.org>
+ Cr-Commit-Position: refs/heads/master@{#586219}
+
+diff --git a/base/time/time.h b/base/time/time.h
+index f4c2f93f30b4..7d4f308545c9 100644
+--- a/base/time/time.h
++++ b/base/time/time.h
+@@ -199,11 +199,6 @@ class BASE_EXPORT TimeDelta {
+ double InMicrosecondsF() const;
+ int64_t InNanoseconds() const;
+
+- constexpr TimeDelta& operator=(TimeDelta other) {
+- delta_ = other.delta_;
+- return *this;
+- }
+-
+ // Computations with other deltas. Can easily be made constexpr with C++17 but
+ // hard to do until then per limitations around
+ // __builtin_(add|sub)_overflow in safe_math_clang_gcc_impl.h :
+@@ -283,11 +278,6 @@ class BASE_EXPORT TimeDelta {
+ return delta_ >= other.delta_;
+ }
+
+-#if defined(OS_WIN)
+- // This works around crbug.com/635974
+- constexpr TimeDelta(const TimeDelta& other) : delta_(other.delta_) {}
+-#endif
+-
+ private:
+ friend int64_t time_internal::SaturatedAdd(TimeDelta delta, int64_t value);
+ friend int64_t time_internal::SaturatedSub(TimeDelta delta, int64_t value);
+@@ -375,7 +365,7 @@ class TimeBase {
+ //
+ // DEPRECATED - Do not use in new code. For serializing Time values, prefer
+ // Time::ToDeltaSinceWindowsEpoch().InMicroseconds(). http://crbug.com/634507
+- int64_t ToInternalValue() const { return us_; }
++ constexpr int64_t ToInternalValue() const { return us_; }
+
+ // The amount of time since the origin (or "zero") point. This is a syntactic
+ // convenience to aid in code readability, mainly for debugging/testing use
+@@ -799,7 +789,7 @@ constexpr TimeDelta TimeDelta::FromDouble(double value) {
+ // static
+ constexpr TimeDelta TimeDelta::FromProduct(int64_t value,
+ int64_t positive_value) {
+- DCHECK(positive_value > 0);
++ DCHECK(positive_value > 0); // NOLINT, DCHECK_GT isn't constexpr.
+ return value > std::numeric_limits<int64_t>::max() / positive_value
+ ? Max()
+ : value < std::numeric_limits<int64_t>::min() / positive_value
+@@ -903,8 +893,8 @@ class BASE_EXPORT TimeTicks : public time_internal::TimeBase<TimeTicks> {
+ return TimeTicks(us);
+ }
+
+-#if defined(OS_WIN)
+ protected:
++#if defined(OS_WIN)
+ typedef DWORD (*TickFunctionType)(void);
+ static TickFunctionType SetMockTickFunction(TickFunctionType ticker);
+ #endif
+@@ -926,8 +916,7 @@ BASE_EXPORT std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks);
+ // thread is running.
+ class BASE_EXPORT ThreadTicks : public time_internal::TimeBase<ThreadTicks> {
+ public:
+- ThreadTicks() : TimeBase(0) {
+- }
++ constexpr ThreadTicks() : TimeBase(0) {}
+
+ // Returns true if ThreadTicks::Now() is supported on this system.
+ static bool IsSupported() WARN_UNUSED_RESULT {
+diff --git a/base/time/time_unittest.cc b/base/time/time_unittest.cc
+index 5dc8888a3297..ce8cc39cbaec 100644
+--- a/base/time/time_unittest.cc
++++ b/base/time/time_unittest.cc
+@@ -1542,6 +1542,70 @@ TEST(TimeDelta, Overflows) {
+ EXPECT_EQ(kOneSecond, (ticks_now + kOneSecond) - ticks_now);
+ }
+
++constexpr TimeTicks TestTimeTicksConstexprCopyAssignment() {
++ TimeTicks a = TimeTicks::FromInternalValue(12345);
++ TimeTicks b;
++ b = a;
++ return b;
++}
++
++TEST(TimeTicks, ConstexprAndTriviallyCopiable) {
++ // "Trivially copyable" is necessary for use in std::atomic<TimeTicks>.
++ static_assert(std::is_trivially_copyable<TimeTicks>(), "");
++
++ // Copy ctor.
++ constexpr TimeTicks a = TimeTicks::FromInternalValue(12345);
++ constexpr TimeTicks b{a};
++ static_assert(a.ToInternalValue() == b.ToInternalValue(), "");
++
++ // Copy assignment.
++ static_assert(a.ToInternalValue() ==
++ TestTimeTicksConstexprCopyAssignment().ToInternalValue(),
++ "");
++}
++
++constexpr ThreadTicks TestThreadTicksConstexprCopyAssignment() {
++ ThreadTicks a = ThreadTicks::FromInternalValue(12345);
++ ThreadTicks b;
++ b = a;
++ return b;
++}
++
++TEST(ThreadTicks, ConstexprAndTriviallyCopiable) {
++ // "Trivially copyable" is necessary for use in std::atomic<ThreadTicks>.
++ static_assert(std::is_trivially_copyable<ThreadTicks>(), "");
++
++ // Copy ctor.
++ constexpr ThreadTicks a = ThreadTicks::FromInternalValue(12345);
++ constexpr ThreadTicks b{a};
++ static_assert(a.ToInternalValue() == b.ToInternalValue(), "");
++
++ // Copy assignment.
++ static_assert(a.ToInternalValue() ==
++ TestThreadTicksConstexprCopyAssignment().ToInternalValue(),
++ "");
++}
++
++constexpr TimeDelta TestTimeDeltaConstexprCopyAssignment() {
++ TimeDelta a = TimeDelta::FromSeconds(1);
++ TimeDelta b;
++ b = a;
++ return b;
++}
++
++TEST(TimeDelta, ConstexprAndTriviallyCopiable) {
++ // "Trivially copyable" is necessary for use in std::atomic<TimeDelta>.
++ static_assert(std::is_trivially_copyable<TimeDelta>(), "");
++
++ // Copy ctor.
++ constexpr TimeDelta a = TimeDelta::FromSeconds(1);
++ constexpr TimeDelta b{a};
++ static_assert(a == b, "");
++
++ // Copy assignment.
++ static_assert(a == TestTimeDeltaConstexprCopyAssignment(), "");
++}
++
+ TEST(TimeDeltaLogging, DCheckEqCompiles) {
+ DCHECK_EQ(TimeDelta(), TimeDelta());
+ }