const_vtable.cc 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // { dg-do run }
  2. extern "C" int printf(const char *,...);
  3. struct V1 {
  4. int v;
  5. virtual int foo();
  6. V1();
  7. ~V1();
  8. };
  9. struct V2 : virtual V1 {
  10. int v2;
  11. virtual int foo();
  12. V2();
  13. ~V2();
  14. };
  15. struct C : virtual V1, virtual V2 {
  16. int c;
  17. virtual int foo();
  18. C();
  19. ~C();
  20. };
  21. struct B {
  22. int b; };
  23. struct D : B, C {
  24. int d;
  25. virtual int bar();
  26. D();
  27. ~D();
  28. };
  29. extern "C" int printf(const char *,...);
  30. main()
  31. {
  32. try {
  33. D *d = new D;
  34. delete d;
  35. } catch (int) {
  36. printf("Int caught\n");
  37. }
  38. }
  39. int V1::foo() {
  40. printf("V1::foo called\n"); return 1; }
  41. V1::V1() : v(5) {
  42. printf("V1 called\n"); }
  43. V1::~V1() {
  44. printf("~V1 called\n"); }
  45. int V2::foo() {
  46. printf("V2::foo called\n"); return 1; }
  47. V2::V2() : v2(6) {
  48. printf("V2 called\n"); }
  49. V2::~V2() {
  50. printf("~V2 called\n"); }
  51. int C::foo() {
  52. printf("C::foo called %d\n", c); return 1; }
  53. C::C() : c(7) {
  54. printf("C called\n");
  55. V1 *vv = this; vv->foo();
  56. C *cp = dynamic_cast<C *>(vv);
  57. if (this == cp) {
  58. printf("PASSED this == cp\n");
  59. } else {
  60. printf("FAILED this != cp\n");
  61. }
  62. }
  63. C::~C() {
  64. printf("~C called\n");
  65. V1 *vv = this; vv->foo();
  66. C *cp = dynamic_cast<C *>(vv);
  67. if (this == cp) {
  68. printf("PASSED this == cp\n");
  69. } else {
  70. printf("FAILED this != cp\n");
  71. }
  72. }
  73. int D::bar() {
  74. printf("D::bar called\n"); return 1; }
  75. D::D() : d(8) {
  76. printf("D called\n"); throw 5; }
  77. D::~D() {
  78. printf("~D called\n"); }