async-unwind2.c

来自「用于进行gcc测试」· C语言 代码 · 共 255 行

C
255
字号
// PR rtl-optimization/36419// { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } }// { dg-options "-Os -fasynchronous-unwind-tables -fpic -fno-inline" }#include <stdarg.h>extern "C" void abort ();extern "C"{  struct R { int r1; unsigned short r2[1]; };  int bar1 (unsigned short *, int, short) throw ();  void bar2 (R *) throw ();  void bar3 (R **, const unsigned short *, int) throw ();  void bar4 (R **, const char *) throw ();  void bar5 (void *, const char *, ...);}struct S{  R *s;  struct T { };  S (R *x, T *) { s = x; }  ~S () { bar2 (s); }  S &operator= (const S &x);  S &operator+= (const S &x);  S sfn1 (const S &x) const;  friend S operator+ (const S &x1, const S &x2);  static S sfn2 (int i)  {    unsigned short q[33];    R *p = 0;    bar3 (&p, q, bar1 (q, i, 10));    return S (p, (T *) 0);  }  static S sfn3 (const char *x)  {    R *p = 0;    bar4 (&p, x);    return S (p, (T *) 0);  }};struct U { };template <class C> unsigned char operator >>= (const U &, C &);struct V;struct W{  V *w;  unsigned char is () const;};template <class T> struct X : public W{  inline ~X ();  X ();  X (const W &);  T *operator -> () const;};struct E{  E ();  E (const S &, const X <V> &);  E (E const &);  ~E ();  E &operator = (E const &);};struct V{  virtual void release () throw ();};template <class T> X <T>::~X (){  if (w)    w->release ();}struct Y{  virtual U yfn1 (const S &);};struct Z;X <V> baz1 (const S &) throw (E);X <Z> baz2 (const X <Z> &) throw (E);template <typename T> X<T>::X (){  w = __null;}template <typename T> X<T>::X (W const &){  w = __null;}U Y::yfn1 (const S &){  throw 12;}Y y;template <typename T> T *X<T>::operator -> () const{  return &y;}X <V> baz1 (const S &) throw (E){  return X<V> ();}E::E (){}E::~E (){}X <Z> baz2 (const X <Z> &) throw (E){  throw E ();}int bar1 (unsigned short *, int, short) throw (){  asm volatile ("" : : : "memory");  return 0;}void bar2 (R *) throw (){  asm volatile ("" : : : "memory");}void bar3 (R **, const unsigned short *, int) throw (){  asm volatile ("" : : : "memory");}void bar4 (R **, const char *) throw (){  asm volatile ("" : : : "memory");}int events[2];void *sp;void bar5 (void *p, const char *s, ...){  va_list ap;  va_start (ap, s);  if (p)    throw 19;  switch (*s)    {    case 't':      if (events[0] != va_arg (ap, int))	abort ();      events[0]++;      break;    case 'f':      abort ();    case 'c':      if (events[1] != va_arg (ap, int))	abort ();      events[1]++;      if (events[1] == 1)	sp = va_arg (ap, void *);      else if (sp != va_arg (ap, void *))	abort ();      break;    }}unsigned char W::is () const{  return 1;}S &S::operator += (const S &){  return *this;}template <class C> unsigned char operator >>= (const U &, C &){  throw 1;}template X<Y>::X ();template X<Z>::X ();template unsigned char operator >>= (const U &, X<Z> &);template X<Y>::X (W const &);template Y *X<Y>::operator-> () const;X <Z> foo () throw (){  X <Z> a;  X <Y> b;  try  {    b = X <Y> (baz1 (S::sfn3 ("defg")));  }  catch (E &)  {  }  if (b.is ())    {      for (int n = 0; n < 10; n++)	{	  S c = S::sfn3 ("abcd");	  c += S::sfn2 (n);	  X <Z> d;	  try	  {	    bar5 ((void *) 0, "trying %d\n", n);	    if ((b->yfn1 (c) >>= d))	      if (d.is ())		{		  bar5 ((void *) 0, "failure1 on %d\n", n);		  a = baz2 (d);		  if (a.is ())		    break;		}	      bar5 ((void *) 0, "failure2 on %d\n", n);	  }	  catch (...)	  {	    void *p;	    asm volatile ("movl %%esp, %0" : "=r" (p));	    bar5 ((void *) 0, "caught %d %p\n", n, p);	  }	}    }  return a;}intmain (){  foo ();  if (events[0] != 10 || events[1] != 10)    abort ();  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?