(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
cleanup-5.c
       1  /* HP-UX libunwind.so doesn't provide _UA_END_OF_STACK */
       2  /* { dg-do run } */
       3  /* { dg-options "-fexceptions" } */
       4  /* { dg-skip-if "" { "ia64-*-hpux11.*" } } */
       5  /* { dg-skip-if "" { ! nonlocal_goto } } */
       6  /* { dg-require-effective-target exceptions } */
       7  /* Verify that cleanups work with exception handling.  */
       8  
       9  #include <unwind.h>
      10  #include <stdlib.h>
      11  #include <string.h>
      12  
      13  static _Unwind_Reason_Code
      14  force_unwind_stop (int version, _Unwind_Action actions,
      15                     _Unwind_Exception_Class exc_class,
      16                     struct _Unwind_Exception *exc_obj,
      17                     struct _Unwind_Context *context,
      18                     void *stop_parameter)
      19  {
      20    if (actions & _UA_END_OF_STACK)
      21      abort ();
      22    return _URC_NO_REASON;
      23  }
      24  
      25  static void force_unwind ()
      26  {
      27    struct _Unwind_Exception *exc = malloc (sizeof (*exc));
      28    memset (&exc->exception_class, 0, sizeof (exc->exception_class));
      29    exc->exception_cleanup = 0;
      30                     
      31  #ifndef __USING_SJLJ_EXCEPTIONS__
      32    _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
      33  #else
      34    _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
      35  #endif
      36                     
      37    abort ();
      38  }
      39  
      40  static void handler (void *p __attribute__((unused)))
      41  {
      42    exit (0);
      43  }
      44  
      45  static void doit ()
      46  {
      47    char dummy __attribute__((cleanup (handler)));
      48    force_unwind ();
      49  }
      50  
      51  int main()
      52  { 
      53    doit ();
      54    abort ();
      55  }