From 569f419bd5a535f9fa15bbbb2041ea98a863878e Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 20 Apr 2016 15:30:33 +0100 Subject: [PATCH] Ensure std::thread helpers have internal linkage Backport from mainline 2016-04-05 Jonathan Wakely PR libstdc++/70503 * src/c++11/thread.cc (execute_native_thread_routine, execute_native_thread_routine_compat): Give internal linkage. * testsuite/30_threads/thread/70503.cc: New test. From-SVN: r235284 --- libstdc++-v3/ChangeLog | 10 +++++ libstdc++-v3/src/c++11/thread.cc | 6 +-- .../testsuite/30_threads/thread/70503.cc | 38 +++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 libstdc++-v3/testsuite/30_threads/thread/70503.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 39b0558cd2f6..1a23632d338a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2016-04-20 Jonathan Wakely + + Backport from mainline + 2016-04-05 Jonathan Wakely + + PR libstdc++/70503 + * src/c++11/thread.cc (execute_native_thread_routine, + execute_native_thread_routine_compat): Give internal linkage. + * testsuite/30_threads/thread/70503.cc: New test. + 2016-03-18 Jonathan Wakely Backport from mainline diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc index 49aacb5a96da..d65744893764 100644 --- a/libstdc++-v3/src/c++11/thread.cc +++ b/libstdc++-v3/src/c++11/thread.cc @@ -70,9 +70,9 @@ static inline int get_nprocs() namespace std _GLIBCXX_VISIBILITY(default) { - namespace + extern "C" { - extern "C" void* + static void* execute_native_thread_routine(void* __p) { thread::_Impl_base* __t = static_cast(__p); @@ -94,7 +94,7 @@ namespace std _GLIBCXX_VISIBILITY(default) return 0; } - } + } // extern "C" _GLIBCXX_BEGIN_NAMESPACE_VERSION diff --git a/libstdc++-v3/testsuite/30_threads/thread/70503.cc b/libstdc++-v3/testsuite/30_threads/thread/70503.cc new file mode 100644 index 000000000000..3b64ef8d2de8 --- /dev/null +++ b/libstdc++-v3/testsuite/30_threads/thread/70503.cc @@ -0,0 +1,38 @@ +// 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-do link } +// { dg-options "-std=gnu++11 -static" { target *-*-*gnu* } } +// { dg-require-cstdint "" } +// { dg-require-gthreads "" } +// { dg-require-effective-target static } + +#include + +extern "C" { + // Should not get multiple definition errors from libstdc++.a(thread.o) + void execute_native_thread_routine(void) { } + void execute_native_thread_routine_compat(void) { } +} + +int main() +{ + execute_native_thread_routine(); + execute_native_thread_routine_compat(); + + std::thread{}.detach(); // ensure libstdc++.a(thread.o) is linked in +} -- 2.47.2