diff mbox

libstdc++/70503 Ensure std::thread helpers have internal linkage

Message ID 20160407142701.GU5814@redhat.com
State New
Headers show

Commit Message

Jonathan Wakely April 7, 2016, 2:27 p.m. UTC
On 07/04/16 15:42 +0200, Jakub Jelinek wrote:
>Or perhaps instead change the test, so that instead of testing for
>undefined symbols it provides some definition of those 2 symbols
>and makes sure libstdc++.a(thread.o) is linked in too (such as
>using std::thread::detach or similar somewhere).
>Then in the buggy libstdc++ case, because those old definitions
>were strong rather than weak, it should fail to link, while with
>fixed libstdc++ succeed.

That'll work. Tested x86_64-linux, committed to trunk.
diff mbox

Patch

commit 0f47894e015b05f43391a353777a2ad5b74c05fa
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Apr 7 15:25:47 2016 +0100

    	* testsuite/30_threads/thread/70503.cc: Adjust from xfail to pass.

diff --git a/libstdc++-v3/testsuite/30_threads/thread/70503.cc b/libstdc++-v3/testsuite/30_threads/thread/70503.cc
index 950d754..3b64ef8 100644
--- a/libstdc++-v3/testsuite/30_threads/thread/70503.cc
+++ b/libstdc++-v3/testsuite/30_threads/thread/70503.cc
@@ -16,19 +16,23 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do link }
-// { dg-options " -std=gnu++11 -static" { target *-*-*gnu* } }
+// { dg-options "-std=gnu++11 -static" { target *-*-*gnu* } }
 // { dg-require-cstdint "" }
 // { dg-require-gthreads "" }
 // { dg-require-effective-target static }
 
+#include <thread>
+
 extern "C" {
-  void execute_native_thread_routine(void);
-  void execute_native_thread_routine_compat(void);
+  // 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(); // { dg-error "undefined reference" }
-  execute_native_thread_routine_compat(); // { dg-error "undefined reference" }
+  execute_native_thread_routine();
+  execute_native_thread_routine_compat();
+
+  std::thread{}.detach();  // ensure libstdc++.a(thread.o) is linked in
 }
-// { dg-prune-output "collect2: error: ld returned" }