1*c87b03e5Sespie // GROUPS passed vtable
2*c87b03e5Sespie extern "C" int printf (const char *, ...);
3*c87b03e5Sespie enum { vf_request, vf_event } want;
4*c87b03e5Sespie 
5*c87b03e5Sespie int errs = 0;
6*c87b03e5Sespie 
7*c87b03e5Sespie class ivResource {
8*c87b03e5Sespie public:
~ivResource()9*c87b03e5Sespie   virtual ~ivResource () { }
10*c87b03e5Sespie };
11*c87b03e5Sespie 
12*c87b03e5Sespie class ivHandler   : public ivResource   {
13*c87b03e5Sespie public:
event()14*c87b03e5Sespie   virtual void event() { }
15*c87b03e5Sespie };
16*c87b03e5Sespie 
17*c87b03e5Sespie class ivGlyph   : public ivResource   {
18*c87b03e5Sespie public:
~ivGlyph()19*c87b03e5Sespie   virtual ~ivGlyph  () { }
request()20*c87b03e5Sespie   virtual void request () {
21*c87b03e5Sespie     if (want!=vf_request)
22*c87b03e5Sespie       ++errs;
23*c87b03e5Sespie   }
24*c87b03e5Sespie };
25*c87b03e5Sespie 
26*c87b03e5Sespie class ItemView : public ivGlyph, public ivHandler {
27*c87b03e5Sespie public:
event()28*c87b03e5Sespie   virtual void event () {
29*c87b03e5Sespie     if (want!=vf_event)
30*c87b03e5Sespie       ++errs;
31*c87b03e5Sespie   }
32*c87b03e5Sespie } a;
33*c87b03e5Sespie 
bar()34*c87b03e5Sespie ivGlyph *bar() {
35*c87b03e5Sespie   return &a;
36*c87b03e5Sespie }
37*c87b03e5Sespie 
bar2()38*c87b03e5Sespie ivHandler *bar2() {
39*c87b03e5Sespie   return &a;
40*c87b03e5Sespie }
41*c87b03e5Sespie 
main()42*c87b03e5Sespie int main() {
43*c87b03e5Sespie   want=vf_request;
44*c87b03e5Sespie   bar()->request();
45*c87b03e5Sespie   want=vf_event;
46*c87b03e5Sespie   bar2()->event();
47*c87b03e5Sespie   if (errs) {
48*c87b03e5Sespie     printf("FAIL\n");
49*c87b03e5Sespie     return 1;
50*c87b03e5Sespie   }
51*c87b03e5Sespie   printf("PASS\n");
52*c87b03e5Sespie   return 0;
53*c87b03e5Sespie }
54