[Bug rtl-optimization/36419] [4.3 Regression] Wrong unwind info with -Os -fasynchronous-unwind-tables
jakub at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Mon Jun 2 17:24:00 GMT 2008
------- Comment #3 from jakub at gcc dot gnu dot org 2008-06-02 17:23 -------
Smaller testcase for -m32 -Os -fpic -fasynchronous-unwind-tables -fno-inline:
extern "C"
{
struct FILE;
extern FILE *stderr;
extern int fprintf (FILE *, const char *, ...);
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 (R **, R *) throw ();
void bar6 (R **, R *, R *) throw ();
}
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> inline unsigned char operator >>= (const U &, C &);
struct V;
struct W
{
V *w;
unsigned char is () const;
};
template <class T> struct X : public W
{
static T *xfn1 (V *p);
inline ~X ();
X ();
X (const W &rRef);
T *operator -> () const;
};
struct E
{
E ();
E (const S &, const X <V> &);
E (E const &);
~E ();
E &operator = (E const &);
S e;
X <V> f;
};
struct V
{
virtual void release () throw () = 0;
};
template <class T> X <T>::~X ()
{
if (w)
w->release ();
}
struct Y
{
virtual U yfn1 (const S &aName) = 0;
};
struct Z;
X <V> baz1 (const S &) throw (E);
X <Z> baz2 (const X <Z> &xStream) throw (E);
X <Z> foo () throw ()
{
X <Z> xResult;
X <Y> xNameContainer;
try
{
xNameContainer =
X <Y>
(baz1
(S::sfn3 ("com.sun.star.embed.OLESimpleStorage")));
}
catch (E &)
{
}
if (xNameContainer.is ())
{
for (int nInd = 0; nInd < 10; nInd++)
{
S aStreamName = S::sfn3 ("abcd");
aStreamName += S::sfn2 ((int) nInd);
X <Z> xCachedCopyStream;
try
{
{
fprintf (stderr, "trying %d\n", nInd);
}
if ((xNameContainer->
yfn1 (aStreamName) >>= xCachedCopyStream))
if (xCachedCopyStream.is ())
{
{
fprintf (stderr, "still trying %d\n", nInd);
}
xResult = baz2 (xCachedCopyStream);
if (xResult.is ())
break;
}
{
fprintf (stderr, "success on %d\n", nInd);
}
}
catch (...)
{
fprintf (stderr, "failure on %d\n", nInd);
}
}
}
return xResult;
}
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36419
More information about the Gcc-bugs
mailing list