| // Special g++ Options: -fhandle-signatures |
| // GROUPS passed gb sigptr cast |
| // Test casting a class pointer through a chain of signature pointers. |
| |
| extern "C" |
| { |
| int printf (char *, ...); |
| } |
| |
| class C |
| { |
| public: |
| char * f (void) { return "PA"; } |
| char * g (int) { return "SS"; } |
| }; |
| |
| class D : public C |
| { |
| public: |
| char * h (void) { return "FAIL"; } |
| }; |
| |
| class E : public C |
| { |
| public: |
| int foo (int) { return 0; } |
| }; |
| |
| signature S |
| { |
| char * f (void); |
| char * g (int); |
| }; |
| |
| signature T |
| { |
| char * f (void); |
| }; |
| |
| int main (void) |
| { |
| D a; |
| S * p; |
| T * q; |
| signature { char * g (int); } * r; |
| |
| p = &a; |
| q = (T*) (signature { char * f (void); int foo (int); } *) (E*) (S*) (C*) p; |
| r = (signature { char * h (void); char * g (int); } *) &a; |
| |
| printf ("%s%s\n", q->f (), r->g (0)); |
| |
| return 0; |
| } |