Commit Graph

3131 Commits

Author SHA1 Message Date
Louis Dionne
ffced82bd0 [libc++] Revert "Make vector unconditionally move elements when exceptions are disabled."
This reverts r370502, which broke the use case of a copy-only T (with a
deleted move constructor) when exceptions are disabled. Until we figure
out the right behavior, I'm reverting the commit.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@371068 91177308-0d34-0410-b5e6-96231b3b80d8
2019-09-05 13:50:28 +00:00
Louis Dionne
7de36b7778 [libc++] Add a test for resizing of a vector with copy-only elements
See https://reviews.llvm.org/D62228#1658620

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@371067 91177308-0d34-0410-b5e6-96231b3b80d8
2019-09-05 13:50:18 +00:00
Louis Dionne
87e6185621 [libc++] Move __clamp_to_integral to <cmath>, and harden against min()/max() macros
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@370900 91177308-0d34-0410-b5e6-96231b3b80d8
2019-09-04 13:35:03 +00:00
Louis Dionne
c9ac8d5330 [libc++] Add __truncating_cast for safely casting float types to integers
This is needed anytime we need to clamp an arbitrary floating point
value to an integer type.

Thanks to Eric Fiselier for the patch.

Differential Revision: https://reviews.llvm.org/D66836

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@370891 91177308-0d34-0410-b5e6-96231b3b80d8
2019-09-04 12:48:32 +00:00
Sterling Augustine
1cdafefbbc Revert "Add gdb pretty printers for a wide variety of libc++ data structures."
This reverts commit d8c9f2f572fe06a34ccfc28ee9223b64d7d275d3.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@370553 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-31 00:00:34 +00:00
Sterling Augustine
025042504e Add gdb pretty printers for a wide variety of libc++ data structures.
Summary: Also add a test suite.

Reviewers: EricWF

Subscribers: christof, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D65609

Run a pep8 formatter.

Run pep8 formatter.

Convert to PEP8, address other comments from code review.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@370551 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-30 23:43:34 +00:00
Eric Fiselier
9b0e06fbba Make vector unconditionally move elements when exceptions are disabled.
Summary:
`std::vector<T>` is free choose between using copy or move operations when it needs to resize. The standard only candidates that the correct exception safety guarantees are provided. When exceptions are disabled these guarantees are trivially satisfied. Meaning vector is free to optimize it's implementation by moving instead of copying.

This patch makes `std::vector` unconditionally move elements when exceptions are disabled.

This optimization is conforming according to the current standard wording.

There are concerns that moving in `-fno-noexceptions`mode will be a surprise to users. For example, a user may be surprised to find their code is slower with exceptions enabled than it is disabled. I'm sympathetic to this surprised, but I don't think it should block this optimization.


Reviewers: mclow.lists, ldionne, rsmith

Reviewed By: ldionne

Subscribers: zoecarver, christof, dexonsmith, libcxx-commits

Tags: #libc

Differential Revision: https://reviews.llvm.org/D62228

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@370502 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-30 19:01:03 +00:00
Louis Dionne
11985b4787 [libc++] Add yet another test for inverted character classes
This was reported as part of a bug report that ended up being a
duplicate for r340609, but I'm adding the test case since it's
ever so slightly different from what we had before.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@370109 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-27 20:39:10 +00:00
Louis Dionne
7b663de096 [libc++] Fix broken <random> test
In r369429, I hoisted a floating point computation to a variable in order
to remove a warning. However, it turns out this doesn't play well with
floating point arithmetic. This commit reverts r369429 and instead casts
the result of the floating point computation to remove the warning.

Whether hoisting the computaiton to a variable should give the same
result can be investigated independently.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369693 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-22 19:35:46 +00:00
Louis Dionne
c8e19578f2 [libc++] Mark lock_guard nodiscard test as unsupported in C++03
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369672 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-22 17:24:24 +00:00
Nico Weber
4ef3309d94 libcxx: Rename last two .hpp files in libcxx to .h
Differential Revision: https://reviews.llvm.org/D66544

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369597 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-21 22:38:38 +00:00
Nico Weber
28db4445e2 libcxx: Rename .hpp files in libcxx/test/support to .h
LLVM uses .h as its extension for header files.

Files renamed using:

    for f in libcxx/test/support/*.hpp; do git mv $f ${f%.hpp}.h; done

References to the files updated using:

    for f in $(git diff master | grep 'rename from' | cut -f 3 -d ' '); do
        a=$(basename $f);
        echo $a;
        rg -l $a libcxx | xargs sed -i '' "s/$a/${a%.hpp}.h/";
    done

HPP include guards updated manually using:

    for f in $(git diff master | grep 'rename from' | cut -f 3 -d ' '); do
      echo ${f%.hpp}.h ;
    done | xargs mvim

Differential Revision: https://reviews.llvm.org/D66104

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369481 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-21 00:14:12 +00:00
Marshall Clow
b9f7426583 Fix a couple of unguarded operator, calls in algorithm. Fixes PR#43063. Updated all the heap tests to check this.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369448 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-20 21:31:51 +00:00
Zoe Carver
e44fcf8346 [libc++] Fix std::abs tests
On systems where sizeof(long) == sizeof(int)
the current tests failed. This commit updates
those tests to work on all systems.
std::abs has specific long specializations
which can be used instead.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369437 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-20 20:44:59 +00:00
Louis Dionne
76dbc2cb72 [libc++] Avoid implicit conversion warning in a <random> test
By stashing the computation of `E::max() - E::min()` in a variable, we
avoid the warning introduced in r367497. Note that we use `auto` to
avoid having to deduce the type of the computation, which is not a
problem since Clang provides `auto` as an extension even in C++03 (and
we disable warnings related to using C++11 extensions in the test suite).

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369429 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-20 19:28:26 +00:00
Louis Dionne
4a3529492c [libc++] Implement LWG 3199
Summary:
The resolution of LWG 3199 makes sure that input-streaming into an empty bitset
does not set the failbit on the input stream.

Reviewers: mclow.lists, EricWF

Subscribers: christof, jkorous, dexonsmith, libcxx-commits

Tags: #libc

Differential Revision: https://reviews.llvm.org/D65105

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369422 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-20 18:21:06 +00:00
Louis Dionne
460deb67be [libc++] Precise XFAIL for AppleClang 11
This test doesn't fail on all patch levels of AppleClang 11

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369420 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-20 18:05:06 +00:00
Zoe Carver
3eb5fd97e1 [libc++] fix test for unsigned char
On some systems char is unsigned.
If that is the case, we will now
test signed char twice in std::abs.
NFC. Fixes the build bots.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369413 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-20 17:09:00 +00:00
Louis Dionne
534d2b1146 [libc++] Disable <chrono> ""d and ""y literal tests on AppleClang 10.0.0
In r368882, I enabled those tests for all AppleClang's above version 9.
However, it turns out that the feature is only supported starting with
AppleClang 10.0.1, not AppleClang 10.0.0. This commit fixes that hole.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369409 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-20 16:45:27 +00:00
Zoe Carver
8ed9ff748f [libc++] std::abs should not return double
Implement LWG Issue 2735 by adding std::abs
tests for several types and checking their
return value. NFC.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369394 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-20 15:43:25 +00:00
Louis Dionne
c4fdc11d3a [libc++] Add XFAIL for is_base_of test on AppleClang 11
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@369280 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-19 17:29:42 +00:00
Louis Dionne
5e6dc8fc98 [libc++] Mark <chrono> test as unsupported on AppleClang 9
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@368914 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-14 20:27:56 +00:00
Louis Dionne
6dbf2b76ac [libc++] Mark std::tuple CTAD test as failing on AppleClang 9
Like CTAD for std::unordered_set, AppleClang 9's support for CTAD is
insufficient. I suspect the corresponding LLVM Clang is broken too,
but we don't seem to have testers using that Clang.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@368911 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-14 20:17:18 +00:00
Louis Dionne
c31d5a4ef3 [libc++] Enable <chrono> ""d and ""y literals for AppleClang 10 and up
AppleClang supports those literals starting in version 10.0.1.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@368882 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-14 17:04:31 +00:00
Louis Dionne
72109f5b3e [libc++] Mark two <chrono> tests as unsupported on AppleClang 11
The operator""y and operator""d will eventually be supported by
AppleClang, but no released version supports them at the moment.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@368749 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-13 21:34:49 +00:00
Louis Dionne
e1c08e781c [libc++] Fix incorrect UNSUPPORTED annotation
The test was marked as UNSUPPORTED for clang-6 and clang-6, instead of
clang-6 and clang-7.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@368666 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-13 11:25:16 +00:00
Louis Dionne
22eff1a94a [libc++] Use [[nodiscard]] for lock_guard, as an extension
Summary:
D64914 added support for applying [[nodiscard]] to constructors. This
commit uses that capability to flag incorrect uses of std::lock_guard
where one forgets to actually create a variable for the lock_guard.

rdar://45790820

Reviewers: mclow.lists, EricWF

Subscribers: christof, jkorous, dexonsmith, libcxx-commits, Quuxplusone, lebedev.ri

Tags: #libc

Differential Revision: https://reviews.llvm.org/D65900

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@368664 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-13 11:12:28 +00:00
Louis Dionne
77764d9c0b [libc++] Implement CTAD for std::tuple
Summary:
We were using implicit deduction guides instead of explicit ones,
however the implicit ones don't do work anymore when changing the
constructors.

This commit adds the actual guides specified in the Standard to make
libc++ (1) closer to the Standard and (2) more resistent to changes
in std::tuple's constructors.

Reviewers: Quuxplusone

Subscribers: christof, jkorous, dexonsmith, libcxx-commits

Tags: #libc

Differential Revision: https://reviews.llvm.org/D65225

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@368599 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-12 18:30:31 +00:00
Marshall Clow
a6ac321f01 Implement hh_mm_ss from P1466R3. Reviewed as https://reviews.llvm.org/D65365.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@368299 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-08 14:36:07 +00:00
Louis Dionne
1ec0feb111 [pstl] Add a __pstl_config_site header to record the CMake configuration
This commit adds a __pstl_config_site header that contains the value of
macros specified at CMake configuration time. It works similarly to
libc++'s __config_site header, except we always include it as a separate
file instead of concatenating it to the main configuration header.

It is necessary to thread the includes for that header into libc++'s
lit configuration, otherwise we'd be requiring an installation step
prior to running the test suite.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@368284 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-08 12:43:04 +00:00
Louis Dionne
56c0bbff3a [libc++] Take 2: Integrate the PSTL into libc++
Summary:
This commit allows specifying LIBCXX_ENABLE_PARALLEL_ALGORITHMS when
configuring libc++ in CMake. When that option is enabled, libc++ will
assume that the PSTL can be found somewhere on the CMake module path,
and it will provide the C++17 parallel algorithms based on the PSTL
(that is assumed to be available).

The commit also adds support for running the PSTL tests as part of
the libc++ test suite.

The first attempt to commit this failed because it exposed a bug in the
tests for modules. Now that this has been fixed, it should be safe to
commit this.

Reviewers: EricWF

Subscribers: mgorny, christof, jkorous, dexonsmith, libcxx-commits, mclow.lists, EricWF

Tags: #libc

Differential Revision: https://reviews.llvm.org/D60480

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367903 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-05 18:29:14 +00:00
Eric Fiselier
8279a1399e Revert "Suppress -Wctad-maybe-unsupported on types w/o deduction guides."
Some modules builds are issuing buggy diagnostics. The cause of which is
TBD.

This reverts commit r@367770.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367777 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-04 07:13:43 +00:00
Eric Fiselier
de267ad1f1 Suppress -Wctad-maybe-unsupported on types w/o deduction guides.
There are a handful of standard library types that are intended
to support CTAD but don't need any explicit deduction guides to
do so.

This patch adds a dummy deduction guide to those types to suppress
-Wctad-maybe-unsupported (which gets emitted in user code).

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367770 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-03 23:54:29 +00:00
Eric Fiselier
f033db1b64 Refactor deque to centralize handling of spare blocks.
I have upcoming changes that modify how deque handles spare blocks.
This cleanup is intended to make those changes easier to review
and understand. This patch should have NFC.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367631 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-01 23:11:18 +00:00
Eric Fiselier
590e3405ea Teach malloc_allocator how to count bytes
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367606 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-01 19:52:46 +00:00
Eric Fiselier
30af772fc7 Change default bucket count in hash_set/hash_map.
Previously these types rehashed to a table of 193 elements
upon construction. But this is non-ideal, first because default
constructors should not allocate unless necessary, and second
because 193 is big and can waste a bunch of memory.

This number had previously been chosen to match GCC's implementation.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367605 91177308-0d34-0410-b5e6-96231b3b80d8
2019-08-01 19:48:29 +00:00
Nico Weber
f16e172866 libcxx: Define __STDCPP_THREADS__ to 1, not to __cplusplus.
[cpp.predefined]p2:

   __STDCPP_THREADS__
    Defined, and has the value integer literal 1, if and only if a program
    can have more than one thread of execution .

Also define it only if it's not defined already, since it's supposed
to be defined by the compiler.

Also move it from thread to __config (which requires setting it only
if _LIBCPP_HAS_NO_THREADS is not defined).

Part of PR33230. The intent is to eventually make the compiler define
this instead.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367316 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-30 14:32:47 +00:00
Eric Fiselier
b255afb4ac Fix tests with modules enabled
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367268 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-29 22:48:51 +00:00
Marshall Clow
4bd3f7d588 Fix a bug in std::chrono::abs where it would fail when the duration's period had not been reduced.s
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367120 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-26 15:10:46 +00:00
Marshall Clow
ce2a5ab4c4 Implement change #4 of P1466: Change weekday to accept both 0 and 7 as Sunday. Add accessors 'c_encoding' and 'iso_encoding' to provide different interpretations of the weekday. Remove 'operator unsigned'
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366981 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-25 03:26:05 +00:00
Marshall Clow
fb20aaa0a0 Implement most of P1612R1: Relocate endian. Moves the std::endian functionality from 'type-traits' to 'bit'. No other change. The reason that this is 'partial' is that P1621 also recommends a feature-test macro, but I don't have the value for that one yet. In a month or so, I'll add that
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366776 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-23 04:20:19 +00:00
Petr Hosek
c0e405ec62 [libc++] Set __file_ to 0 in basic_filebuf::close() even if fclose fails
This issue was detected by ASan in one of our tests. This test manually
invokes basic_filebuf::cloe(). fclose(__h.release() returned a non-zero
exit status, so __file_ wasn't set to 0. Later when basic_filebuf
destructor ran, we would enter the if (__file_) block again leading to
heap-use-after-free error.

The POSIX specification for fclose says that independently of the return
value, fclose closes the underlying file descriptor and any further
access (including another call to fclose()) to the stream results in
undefined behavior. This is exactly what happened in our test case.

To avoid this issue, we have to always set __file_ to 0 independently of
the fclose return value.

Differential Revision: https://reviews.llvm.org/D64979

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366730 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-22 19:54:34 +00:00
Louis Dionne
28ee2c5f2d [libc++] Mark libcpp_deallocate.sh.cpp as UNSUPPORTED instead of XFAIL on AppleClang 9
Some minor versions of AppleClang 9 appear not to fail the test. It's
such a mess that the only sane thing to do is to mark the test as
UNSUPPORTED.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366606 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-19 19:41:40 +00:00
Louis Dionne
33f76384d0 Revert "[libc++] Integrate the PSTL into libc++"
This reverts r366593, which caused unforeseen breakage on the build bots.
I'm reverting until the problems have been figured out and fixed.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366603 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-19 18:52:46 +00:00
Louis Dionne
106db235ed [libc++] Integrate the PSTL into libc++
Summary:
This commit allows specifying LIBCXX_ENABLE_PARALLEL_ALGORITHMS when
configuring libc++ in CMake. When that option is enabled, libc++ will
assume that the PSTL can be found somewhere on the CMake module path,
and it will provide the C++17 parallel algorithms based on the PSTL
(that is assumed to be available).

The commit also adds support for running the PSTL tests as part of
the libc++ test suite.

Reviewers: rodgert, EricWF

Subscribers: mgorny, christof, jkorous, dexonsmith, libcxx-commits, mclow.lists, EricWF

Tags: #libc

Differential Revision: https://reviews.llvm.org/D60480

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366593 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-19 17:02:42 +00:00
Louis Dionne
71a0cf47f9 [libc++] Add missing %link_flags to .sh.cpp test
Without the link flags, the test always fails on Linux. For some reason,
however, it works on Darwin -- which is why it wasn't caught at first.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366579 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-19 14:01:48 +00:00
Louis Dionne
48413c895e [libc++] Fix link error with _LIBCPP_HIDE_FROM_ABI_PER_TU and std::string
Summary:
This is effectively a revert of r344616, which was a partial fix for
PR38964 (compilation of <string> with GCC in C++03 mode). However, that
configuration is explicitly not supported anymore and that partial fix
breaks compilation with Clang when per-TU insulation is provided.

PR42676
rdar://52899715

Reviewers: mclow.lists, EricWF

Subscribers: christof, jkorous, dexonsmith, libcxx-commits

Tags: #libc

Differential Revision: https://reviews.llvm.org/D64941

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366567 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-19 11:52:55 +00:00
Louis Dionne
56bc01df8f [libc++] Add C++17 deduction guides for std::function
Summary: http://llvm.org/PR39606

Reviewers: Quuxplusone

Subscribers: christof, dexonsmith, libcxx-commits

Differential Revision: https://reviews.llvm.org/D54410

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366484 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-18 19:50:56 +00:00
Louis Dionne
7524ef5009 [libc++] XFAIL a test that does not behave properly on older Clang
rdar://53015486

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366359 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-17 18:54:29 +00:00
Louis Dionne
e2586fd18f [libcxx] Rejigger test for destroying delete feature-test macros
In r361572, we introduced library support for C++20 destroying delete
and decided to only define the library feature-test macro when the
compiler supports the underlying language feature. This patch reworks
the tests to mirror that.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@366263 91177308-0d34-0410-b5e6-96231b3b80d8
2019-07-16 21:13:40 +00:00