From e9d030687da6516d1335e8400e8e709bdb9b00f1 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Thu, 16 Apr 2015 21:36:54 +0000 Subject: [PATCH] A few bits of N2994 didn't get fully implemented a long time ago. Thanks to STL@microsoft.com for the bug report git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@235134 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/iterator | 4 +-- include/ratio | 16 +++++----- .../istream.iterator.cons/default.fail.cpp | 30 +++++++++++++++++++ .../istream.iterator.cons/default.pass.cpp | 13 ++++++-- .../istream.iterator/types.pass.cpp | 14 +++++++++ .../istreambuf.iterator.cons/default.pass.cpp | 21 +++++++++---- .../istreambuf.iterator/types.pass.cpp | 9 ++++++ .../ratio/ratio.ratio/ratio.pass.cpp | 2 +- 8 files changed, 90 insertions(+), 19 deletions(-) create mode 100644 test/std/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.fail.cpp diff --git a/include/iterator b/include/iterator index 7f7e9ee19..c06ef8f67 100644 --- a/include/iterator +++ b/include/iterator @@ -214,7 +214,7 @@ public: typedef traits traits_type; typedef basic_istream istream_type; - istream_iterator(); + constexpr istream_iterator(); istream_iterator(istream_type& s); istream_iterator(const istream_iterator& x); ~istream_iterator(); @@ -765,7 +765,7 @@ private: istream_type* __in_stream_; _Tp __value_; public: - _LIBCPP_INLINE_VISIBILITY istream_iterator() : __in_stream_(0) {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istream_iterator() : __in_stream_(0), __value_() {} _LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(&__s) { if (!(*__in_stream_ >> __value_)) diff --git a/include/ratio b/include/ratio index 48dcd81c1..25ab503ab 100644 --- a/include/ratio +++ b/include/ratio @@ -21,8 +21,8 @@ template class ratio { public: - static const intmax_t num; - static const intmax_t den; + static constexpr intmax_t num; + static constexpr intmax_t den; typedef ratio type; }; @@ -236,13 +236,13 @@ class _LIBCPP_TYPE_VIS_ONLY ratio static_assert(__static_abs<_Num>::value >= 0, "ratio numerator is out of range"); static_assert(_Den != 0, "ratio divide by 0"); static_assert(__static_abs<_Den>::value > 0, "ratio denominator is out of range"); - static const intmax_t __na = __static_abs<_Num>::value; - static const intmax_t __da = __static_abs<_Den>::value; - static const intmax_t __s = __static_sign<_Num>::value * __static_sign<_Den>::value; - static const intmax_t __gcd = __static_gcd<__na, __da>::value; + static _LIBCPP_CONSTEXPR const intmax_t __na = __static_abs<_Num>::value; + static _LIBCPP_CONSTEXPR const intmax_t __da = __static_abs<_Den>::value; + static _LIBCPP_CONSTEXPR const intmax_t __s = __static_sign<_Num>::value * __static_sign<_Den>::value; + static _LIBCPP_CONSTEXPR const intmax_t __gcd = __static_gcd<__na, __da>::value; public: - static const intmax_t num = __s * __na / __gcd; - static const intmax_t den = __da / __gcd; + static _LIBCPP_CONSTEXPR const intmax_t num = __s * __na / __gcd; + static _LIBCPP_CONSTEXPR const intmax_t den = __da / __gcd; typedef ratio type; }; diff --git a/test/std/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.fail.cpp b/test/std/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.fail.cpp new file mode 100644 index 000000000..5e6cc5455 --- /dev/null +++ b/test/std/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.fail.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class istream_iterator + +// constexpr istream_iterator(); + +#include +#include + +struct S { S(); }; // not constexpr + +int main() +{ +#if __cplusplus >= 201103L + { + constexpr std::istream_iterator it; + } +#else +#error "C++11 only test" +#endif +} diff --git a/test/std/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp b/test/std/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp index f6c3dba7a..bea07ec22 100644 --- a/test/std/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp +++ b/test/std/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp @@ -11,13 +11,20 @@ // class istream_iterator -// istream_iterator(); +// constexpr istream_iterator(); #include #include int main() { - std::istream_iterator i; - assert(i == std::istream_iterator()); + { + typedef std::istream_iterator T; + T it; + assert(it == T()); +#if __cplusplus >= 201103L + constexpr T it2; +#endif + } + } diff --git a/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp b/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp index be55c9777..85a70a017 100644 --- a/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp +++ b/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp @@ -19,9 +19,14 @@ // typedef traits traits_type; // typedef basic_istream istream_type; // ... +// +// If T is a literal type, then the default constructor shall be a constexpr constructor. +// If T is a literal type, then this constructor shall be a trivial copy constructor. +// If T is a literal type, then this destructor shall be a trivial destructor. #include #include +#include int main() { @@ -32,6 +37,9 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same >::value), ""); static_assert((std::is_same::value), ""); + static_assert( std::is_trivially_copy_constructible::value, ""); + static_assert( std::is_trivially_destructible::value, ""); + typedef std::istream_iterator I2; static_assert((std::is_convertible::value), ""); static_assert((std::is_same >::value), ""); static_assert((std::is_same::value), ""); + static_assert( std::is_trivially_copy_constructible::value, ""); + static_assert( std::is_trivially_destructible::value, ""); + + typedef std::istream_iterator I3; + static_assert(!std::is_trivially_copy_constructible::value, ""); + static_assert(!std::is_trivially_destructible::value, ""); } diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp index d1eabbace..46ac390d9 100644 --- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp +++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp @@ -10,8 +10,11 @@ // // istreambuf_iterator - +// // istreambuf_iterator() throw(); +// +// All specializations of istreambuf_iterator shall have a trivial copy constructor, +// a constexpr default constructor and a trivial destructor. #include #include @@ -20,11 +23,19 @@ int main() { { - std::istreambuf_iterator i; - assert(i == std::istreambuf_iterator()); + typedef std::istreambuf_iterator T; + T it; + assert(it == T()); +#if __cplusplus >= 201103L + constexpr T it2; +#endif } { - std::istreambuf_iterator i; - assert(i == std::istreambuf_iterator()); + typedef std::istreambuf_iterator T; + T it; + assert(it == T()); +#if __cplusplus >= 201103L + constexpr T it2; +#endif } } diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp index 75894a82f..2ad927cf9 100644 --- a/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp +++ b/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp @@ -22,6 +22,9 @@ // typedef basic_streambuf streambuf_type; // typedef basic_istream istream_type; // ... +// +// All specializations of istreambuf_iterator shall have a trivial copy constructor, +// a constexpr default constructor and a trivial destructor. #include #include @@ -38,6 +41,9 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + static_assert((std::is_nothrow_default_constructible::value), "" ); + static_assert((std::is_trivially_copy_constructible::value), "" ); + static_assert((std::is_trivially_destructible::value), "" ); typedef std::istreambuf_iterator I2; static_assert((std::is_convertible::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + static_assert((std::is_nothrow_default_constructible::value), "" ); + static_assert((std::is_trivially_copy_constructible::value), "" ); + static_assert((std::is_trivially_destructible::value), "" ); } diff --git a/test/std/utilities/ratio/ratio.ratio/ratio.pass.cpp b/test/std/utilities/ratio/ratio.ratio/ratio.pass.cpp index f942c96b4..a7326162f 100644 --- a/test/std/utilities/ratio/ratio.ratio/ratio.pass.cpp +++ b/test/std/utilities/ratio/ratio.ratio/ratio.pass.cpp @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// -// test ratio: The static data members num and den shall have thcommon +// test ratio: The static data members num and den shall have the common // divisor of the absolute values of N and D: #include