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.
commit 0f47894e015b05f43391a353777a2ad5b74c05fa Author: Jonathan Wakely <jwak...@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" }