blob: 29a8689f7ba5d195e3038c74f64f3c156b956287 [file] [log] [blame]
#include <stdio.h>
static int c;
struct A {
A() { ++c; }
A(const A&) { ++c; }
~A() { --c; }
};
struct B {
A a;
B() { A a; throw 1; }
};
int simple() {
try {
B b;
} catch (...) {}
if (!c) printf("Deriv ok!\n");
try {
B* b = new B();
} catch (...) {}
if (!c) printf("Deriv pointer ok!\n");
try {
throw A();
} catch (...) {}
if (!c) printf("Base ok!\n");
try {
throw new A();
} catch (A *a) {delete a;}
if (!c) printf("Base pointer ok!\n");
try {
A a;
throw A(a);
} catch (A &a) {}
if (!c) printf("Copy ok!\n");
try {
A a;
throw new A(a);
} catch (A *a) {delete a;}
if (!c) printf("Copy pointer ok!\n");
return c;
}
static int k;
struct C : public A {
C() : A() { ++k; }
};
struct T {
T(int a) {
if (a < 0)
throw a;
}
};
struct M {
A a;
T t;
C c;
M(int n) : t(n) {}
};
int member() {
try {
M(10);
} catch (...) {
printf("ooops\n");
return 1;
}
if (!c && k == 1) printf("Member positive ok!\n");
try {
M(0);
} catch (...) {
printf("ooops\n");
return 1;
}
if (!c && k == 2) printf("Member zero ok!\n");
try {
M(-10);
printf("ooops\n");
return 1;
} catch (...) {
printf("caught negative T\n");
}
if (!c && k == 2) printf("Member negative ok!\n");
return c;
}
int main() {
return simple() + member();
}