From: Brendan Kehoe Date: Wed, 25 Mar 1998 13:47:06 +0000 (-0500) Subject: new test for EH w/ opt on X-Git-Tag: prereleases/egcs-1.1-prerelease~1958 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dba21b324a641191fbca5a481ec23b1d765cb718;p=thirdparty%2Fgcc.git new test for EH w/ opt on From-SVN: r18829 --- diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/eh1.C b/gcc/testsuite/g++.old-deja/g++.brendan/eh1.C new file mode 100644 index 000000000000..a6683060c259 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.brendan/eh1.C @@ -0,0 +1,62 @@ +// Special g++ Options: -O +// PRMS Id: 10776 + +extern "C" void printf (char *, ...); + +class Foo +{ + public: + Foo(int n) : n_(n) { } + int f() { return n_; } + + int badTest(); + int goodTest(); + + private: + + int n_; +}; + +int Foo::badTest() +{ + try { + throw int(99); + } + + catch (int &i) { + n_ = 16; + } + + return n_; + // On the sparc, the return will use a ld [%l0],%i0 instruction. + // However %l0 was clobbered at the end of the catch block. It was + // used to do an indirect call. +} + + +int Foo::goodTest() +{ + int n; + + try { + throw int(99); + } + + catch (int &i) { + n = 16; + } + + return n_; + // The return will use a ld [%l2],%i0 instruction. Since %l2 + // contains the "this" pointer this works. +} + +int main() +{ + Foo foo(5); + foo.goodTest(); + foo.badTest(); + + // the badTest will have failed + printf ("PASS\n"); +}