From b05cf382e0eb741b7b8ee1f7b02fa6e5a7a3d491 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 18 Apr 2016 17:16:14 +0100 Subject: [PATCH] Define std::thread::id comparison operators at namespace-scope From-SVN: r235155 --- libstdc++-v3/ChangeLog | 5 +++ libstdc++-v3/include/std/thread | 34 +++++++++++-------- .../testsuite/30_threads/thread/id/70294.cc | 24 +++++++++++++ 3 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 libstdc++-v3/testsuite/30_threads/thread/id/70294.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 385363bda88..14c1c2c92c8 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 2016-04-18 Jonathan Wakely + PR libstdc++/70294 + * include/std/thread (operator<, operator==): Move definitions to + namespace-scope. + * testsuite/30_threads/thread/id/70294.cc: New test. + * testsuite/18_support/bad_exception/23591_thread-1.c: Add -Wno-pedantic to dg-options. * testsuite/20_util/align/2.cc: Use type as operand of alignof. diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread index ad31fbc456f..15aa9a9b577 100644 --- a/libstdc++-v3/include/std/thread +++ b/libstdc++-v3/include/std/thread @@ -88,22 +88,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION friend class hash; friend bool - operator==(thread::id __x, thread::id __y) noexcept - { - // pthread_equal is undefined if either thread ID is not valid, so we - // can't safely use __gthread_equal on default-constructed values (nor - // the non-zero value returned by this_thread::get_id() for - // single-threaded programs using GNU libc). Assume EqualityComparable. - return __x._M_thread == __y._M_thread; - } + operator==(thread::id __x, thread::id __y) noexcept; friend bool - operator<(thread::id __x, thread::id __y) noexcept - { - // Pthreads doesn't define any way to do this, so we just have to - // assume native_handle_type is LessThanComparable. - return __x._M_thread < __y._M_thread; - } + operator<(thread::id __x, thread::id __y) noexcept; template friend basic_ostream<_CharT, _Traits>& @@ -230,10 +218,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION swap(thread& __x, thread& __y) noexcept { __x.swap(__y); } + inline bool + operator==(thread::id __x, thread::id __y) noexcept + { + // pthread_equal is undefined if either thread ID is not valid, so we + // can't safely use __gthread_equal on default-constructed values (nor + // the non-zero value returned by this_thread::get_id() for + // single-threaded programs using GNU libc). Assume EqualityComparable. + return __x._M_thread == __y._M_thread; + } + inline bool operator!=(thread::id __x, thread::id __y) noexcept { return !(__x == __y); } + inline bool + operator<(thread::id __x, thread::id __y) noexcept + { + // Pthreads doesn't define any way to do this, so we just have to + // assume native_handle_type is LessThanComparable. + return __x._M_thread < __y._M_thread; + } + inline bool operator<=(thread::id __x, thread::id __y) noexcept { return !(__y < __x); } diff --git a/libstdc++-v3/testsuite/30_threads/thread/id/70294.cc b/libstdc++-v3/testsuite/30_threads/thread/id/70294.cc new file mode 100644 index 00000000000..9717637eef5 --- /dev/null +++ b/libstdc++-v3/testsuite/30_threads/thread/id/70294.cc @@ -0,0 +1,24 @@ +// Copyright (C) 2016 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +#include + +bool (*lt)(std::thread::id, std::thread::id) = &std::operator<; +bool (*eq)(std::thread::id, std::thread::id) = &std::operator==; -- 2.30.2