(root)/
gcc-13.2.0/
libstdc++-v3/
testsuite/
18_support/
bad_exception/
23591_thread-1.c
       1  // { dg-require-sharedlib "" }
       2  // { dg-skip-if "invalid options for C" { *-*-* } { "-std=c++??" "-std=gnu++??" } }
       3  // { dg-options "-g -O2 -pthread -ldl -x c -fvtable-verify=none -Wno-pedantic" { target *-*-linux* *-*-gnu* *-*-solaris2.1[2-9]* } }
       4  
       5  // Copyright (C) 2005-2023 Free Software Foundation, Inc.
       6  //
       7  // This file is part of the GNU ISO C++ Library.  This library is free
       8  // software; you can redistribute it and/or modify it under the
       9  // terms of the GNU General Public License as published by the
      10  // Free Software Foundation; either version 3, or (at your option)
      11  // any later version.
      12  //
      13  // This library is distributed in the hope that it will be useful,
      14  // but WITHOUT ANY WARRANTY; without even the implied warranty of
      15  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16  // GNU General Public License for more details.
      17  //
      18  // You should have received a copy of the GNU General Public License along
      19  // with this library; see the file COPYING3.  If not see
      20  // <http://www.gnu.org/licenses/>.
      21  
      22  #include <pthread.h>
      23  #include <dlfcn.h>
      24  #include <errno.h>
      25  #include <stdio.h>
      26  #include <string.h>
      27  
      28  // NB: This must be compiled and linked as a "C" executable.
      29  static void* run(void* arg)
      30  {
      31    typedef void (*function_type) (void);
      32    void* lib;
      33    void (*cb)();
      34  
      35    lib = dlopen("./testsuite_shared.so", RTLD_NOW);
      36    if (!lib)
      37      {
      38        printf("dlopen failed: %s\n", strerror(errno));
      39        return 0;
      40      }
      41    cb = (function_type) dlsym(lib, "try_throw_exception");
      42    if (!cb)
      43      {
      44        printf("dlsym failed: %s\n", strerror(errno));
      45        return 0;
      46      }
      47    cb();
      48    dlclose(lib);
      49    return 0;
      50  }
      51  
      52  // libstdc++/23591
      53  int main(void)
      54  {
      55    pthread_t pt;
      56  
      57    if (pthread_create(&pt, 0, &run, 0) != 0)
      58      return 1;
      59    if (pthread_join(pt, 0) != 0)
      60      return 1;
      61  
      62    return 0;
      63  }