1 // { dg-do run } 2 // prms-id: 8155 3 4 int fail = 1; 5 6 class CMainWindow; 7 class CFrameWnd; 8 class CWnd; 9 class CCmdTarget; 10 11 typedef void (CCmdTarget::*AFX_PMSG)( void); 12 typedef void (CWnd::*AFX_PMSGW)( void); 13 14 struct AFX_MSGMAP_ENTRY { 15 unsigned int nMessage; 16 AFX_PMSG pfn; 17 }; 18 19 struct AFX_MSGMAP { 20 const AFX_MSGMAP* pBaseMap; 21 const AFX_MSGMAP_ENTRY* lpEntries; 22 }; 23 24 class CCmdTarget { 25 public: 26 CCmdTarget(); 27 private: 28 static AFX_MSGMAP_ENTRY _messageEntries[]; 29 protected: 30 static const AFX_MSGMAP messageMap; 31 virtual const AFX_MSGMAP* GetMessageMap() const; 32 }; 33 34 const AFX_MSGMAP CCmdTarget::messageMap = { 35 0, &CCmdTarget::_messageEntries[0] 36 }; 37 38 const AFX_MSGMAP* CCmdTarget::GetMessageMap() const { 39 return &CCmdTarget::messageMap; 40 } 41 42 AFX_MSGMAP_ENTRY CCmdTarget::_messageEntries[] = 43 { 44 { 0, 0 } 45 }; 46 47 CCmdTarget :: CCmdTarget() { } 48 49 class CWnd : public CCmdTarget { 50 public: 51 CWnd(); 52 53 protected: 54 void OnPaint(); 55 private: 56 static AFX_MSGMAP_ENTRY _messageEntries[]; 57 protected: 58 static const AFX_MSGMAP messageMap; 59 virtual const AFX_MSGMAP* GetMessageMap() const; 60 }; 61 62 CWnd :: CWnd() { 63 } 64 65 void CWnd :: OnPaint() { 66 } 67 68 const AFX_MSGMAP* CWnd ::GetMessageMap() const { 69 return & CWnd ::messageMap; 70 } 71 const AFX_MSGMAP CWnd ::messageMap = { 72 & CCmdTarget ::messageMap, & CWnd ::_messageEntries[0] 73 }; 74 AFX_MSGMAP_ENTRY CWnd ::_messageEntries[] = { 75 {0, (AFX_PMSG)0 } }; 76 77 class CFrameWnd : public CWnd { 78 public: 79 CFrameWnd(); 80 protected: 81 private: 82 static AFX_MSGMAP_ENTRY _messageEntries[]; 83 protected: 84 static const AFX_MSGMAP messageMap; 85 virtual const AFX_MSGMAP* GetMessageMap() const; 86 }; 87 88 CFrameWnd :: CFrameWnd() { } 89 90 const AFX_MSGMAP* CFrameWnd ::GetMessageMap() const { 91 return & CFrameWnd ::messageMap; 92 } 93 const AFX_MSGMAP CFrameWnd ::messageMap = { 94 & CWnd ::messageMap, & CFrameWnd ::_messageEntries[0] 95 }; 96 AFX_MSGMAP_ENTRY CFrameWnd ::_messageEntries[] = { 97 {0, (AFX_PMSG)0 } }; 98 99 class CMainWindow : public CFrameWnd { 100 public: 101 CMainWindow(); 102 void OnPaint(); 103 void callProc(); 104 private: 105 static AFX_MSGMAP_ENTRY _messageEntries[]; 106 protected: 107 static const AFX_MSGMAP messageMap; 108 virtual const AFX_MSGMAP* GetMessageMap() const; 109 }; 110 111 CMainWindow :: CMainWindow() 112 { 113 } 114 void CMainWindow :: OnPaint() 115 { 116 fail = 0; 117 } 118 119 void CMainWindow :: callProc() 120 { 121 const AFX_MSGMAP* pMessageMap; 122 const AFX_MSGMAP_ENTRY *lpEntry; 123 124 pMessageMap = GetMessageMap(); 125 lpEntry = pMessageMap->lpEntries; 126 127 if( lpEntry->nMessage == 100) { 128 (this->*lpEntry->pfn)(); 129 } 130 } 131 132 const AFX_MSGMAP* CMainWindow ::GetMessageMap() const { 133 return & CMainWindow ::messageMap; 134 } 135 const AFX_MSGMAP CMainWindow ::messageMap = { 136 & CFrameWnd ::messageMap, & CMainWindow ::_messageEntries[0] 137 }; 138 AFX_MSGMAP_ENTRY CMainWindow ::_messageEntries[] = { 139 { 100, (AFX_PMSG)(AFX_PMSGW)(void (CWnd::*)(void))&CMainWindow::OnPaint }, 140 {0, (AFX_PMSG)0 } 141 }; 142 143 int main( int argc, char **argv) { 144 CMainWindow myWindow; 145 146 myWindow.callProc(); 147 return fail; 148 } 149