diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2015-05-02 12:20:03 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2015-05-02 12:20:03 +0100 |
commit | cb2ef49e8387eb8b454e6d8d27c9909ca3964341 (patch) | |
tree | f9ef02a302aac053d48477d7d5ff10120254b0fb | |
parent | 58f270df2501206548bc691b93d18b3844aef550 (diff) | |
download | gcc-cb2ef49e8387eb8b454e6d8d27c9909ca3964341.zip gcc-cb2ef49e8387eb8b454e6d8d27c9909ca3964341.tar.gz gcc-cb2ef49e8387eb8b454e6d8d27c9909ca3964341.tar.bz2 |
re PR libstdc++/65978 (missing constexpr on std::forward_as_tuple and std::tie (LWG issues 2275 and 2301))
PR libstdc++/65978
* include/std/tuple (forward_as_tuple, tie): Add constexpr.
* testsuite/20_util/tuple/creation_functions/constexpr.cc: Uncomment
and fix tests for forward_as_tuple and tie.
From-SVN: r222719
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/std/tuple | 8 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc | 34 |
3 files changed, 30 insertions, 17 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 521ca9c..9ba7c30 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 2015-05-02 Jonathan Wakely <jwakely@redhat.com> + PR libstdc++/65978 + * include/std/tuple (forward_as_tuple, tie): Add constexpr. + * testsuite/20_util/tuple/creation_functions/constexpr.cc: Uncomment + and fix tests for forward_as_tuple and tie. + * src/filesystem/ops.cc (last_write_time) [_GLIBCXX_USE_UTIMENSAT]: Set timespec members explicitly instead of with a braced-init-list. [_GLIBCXX_HAVE_UTIME_H]: Use lambda to handle st_atime being a macro. diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple index e500a76..ad132bd 100644 --- a/libstdc++-v3/include/std/tuple +++ b/libstdc++-v3/include/std/tuple @@ -970,8 +970,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __result_type(std::forward<_Elements>(__args)...); } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2275. Why is forward_as_tuple not constexpr? template<typename... _Elements> - tuple<_Elements&&...> + constexpr tuple<_Elements&&...> forward_as_tuple(_Elements&&... __args) noexcept { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); } @@ -1120,9 +1122,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __concater::_S_do(std::forward<_Tpls>(__tpls)...); } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2301. Why is tie not constexpr? /// tie template<typename... _Elements> - inline tuple<_Elements&...> + constexpr tuple<_Elements&...> tie(_Elements&... __args) noexcept { return tuple<_Elements&...>(__args...); } diff --git a/libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc b/libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc index 2c47fbb..3ededfc 100644 --- a/libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc +++ b/libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc @@ -45,49 +45,51 @@ test_make_tuple() } } -#if 0 // forward_as_tuple void test_forward_as_tuple() { { - typedef std::tuple<int, float> tuple_type; + static int i(22); + static float f(22.222); + typedef std::tuple<int&, float&&> tuple_type; constexpr tuple_type p1 __attribute__((unused)) - = std::forward_as_tuple(22, 22.222); + = std::forward_as_tuple(i, std::move(f)); } { - typedef std::tuple<int, float, int> tuple_type; + static int i(22); + static float f(22.222); + static int ii(77799); + + typedef std::tuple<int&, float&, int&&> tuple_type; constexpr tuple_type p1 __attribute__((unused)) - = std::forward_as_tuple(22, 22.222, 77799); + = std::forward_as_tuple(i, f, std::move(ii)); } } -#endif -#if 0 // tie void test_tie() { { - int i(22); - float f(22.222); - typedef std::tuple<int, float> tuple_type; + static int i(22); + static float f(22.222); + typedef std::tuple<int&, float&> tuple_type; constexpr tuple_type p1 __attribute__((unused)) = std::tie(i, f); } { - int i(22); - float f(22.222); - int ii(77799); + static int i(22); + static float f(22.222); + static const int ii(77799); - typedef std::tuple<int, float, int> tuple_type; + typedef std::tuple<int&, float&, const int&> tuple_type; constexpr tuple_type p1 __attribute__((unused)) = std::tie(i, f, ii); } } -#endif // get void @@ -124,6 +126,8 @@ int main() { test_make_tuple(); + test_forward_as_tuple(); + test_tie(); test_get(); test_tuple_cat(); |