1 /* Bug 20198: Do not call object destructors at exit. 2 Copyright (C) 2016-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #include <errno.h> 20 #include <pthread.h> 21 #include <stdio.h> 22 #include <stdlib.h> 23 24 struct A 25 { ~AA26 ~A () { abort (); } 27 }; 28 29 thread_local A a1; 30 thread_local A a2; 31 32 void 33 __attribute__ ((noinline, noclone)) optimization_barrier(A &)34optimization_barrier (A &) 35 { 36 } 37 38 /* Call std::quick_exit from a non-main thread. */ 39 void * non_main_thread(void *)40non_main_thread (void *) 41 { 42 optimization_barrier (a1); 43 /* The C++11 standard in 18.5.12 says: 44 "Objects shall not be destroyed as a result of calling 45 quick_exit." 46 If quick_exit calls the destructors the test aborts. */ 47 quick_exit (0); 48 } 49 50 static int do_test()51do_test() 52 { 53 optimization_barrier (a2); 54 pthread_t thr; 55 int ret = pthread_create (&thr, NULL, non_main_thread, NULL); 56 if (ret != 0) 57 { 58 errno = ret; 59 printf ("error: pthread_create: %m\n"); 60 } 61 pthread_join (thr, NULL); 62 return 1; 63 } 64 65 #define TEST_FUNCTION do_test () 66 #include "../test-skeleton.c" 67