// { dg-do run } // prms-id: 8155 int fail = 1; class CMainWindow; class CFrameWnd; class CWnd; class CCmdTarget; typedef void (CCmdTarget::*AFX_PMSG)( void); typedef void (CWnd::*AFX_PMSGW)( void); struct AFX_MSGMAP_ENTRY { unsigned int nMessage; AFX_PMSG pfn; }; struct AFX_MSGMAP { const AFX_MSGMAP* pBaseMap; const AFX_MSGMAP_ENTRY* lpEntries; }; class CCmdTarget { public: CCmdTarget(); private: static AFX_MSGMAP_ENTRY _messageEntries[]; protected: static const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const; }; const AFX_MSGMAP CCmdTarget::messageMap = { 0, &CCmdTarget::_messageEntries[0] }; const AFX_MSGMAP* CCmdTarget::GetMessageMap() const { return &CCmdTarget::messageMap; } AFX_MSGMAP_ENTRY CCmdTarget::_messageEntries[] = { { 0, 0 } }; CCmdTarget :: CCmdTarget() { } class CWnd : public CCmdTarget { public: CWnd(); protected: void OnPaint(); private: static AFX_MSGMAP_ENTRY _messageEntries[]; protected: static const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const; }; CWnd :: CWnd() { } void CWnd :: OnPaint() { } const AFX_MSGMAP* CWnd ::GetMessageMap() const { return & CWnd ::messageMap; } const AFX_MSGMAP CWnd ::messageMap = { & CCmdTarget ::messageMap, & CWnd ::_messageEntries[0] }; AFX_MSGMAP_ENTRY CWnd ::_messageEntries[] = { {0, (AFX_PMSG)0 } }; class CFrameWnd : public CWnd { public: CFrameWnd(); protected: private: static AFX_MSGMAP_ENTRY _messageEntries[]; protected: static const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const; }; CFrameWnd :: CFrameWnd() { } const AFX_MSGMAP* CFrameWnd ::GetMessageMap() const { return & CFrameWnd ::messageMap; } const AFX_MSGMAP CFrameWnd ::messageMap = { & CWnd ::messageMap, & CFrameWnd ::_messageEntries[0] }; AFX_MSGMAP_ENTRY CFrameWnd ::_messageEntries[] = { {0, (AFX_PMSG)0 } }; class CMainWindow : public CFrameWnd { public: CMainWindow(); void OnPaint(); void callProc(); private: static AFX_MSGMAP_ENTRY _messageEntries[]; protected: static const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const; }; CMainWindow :: CMainWindow() { } void CMainWindow :: OnPaint() { fail = 0; } void CMainWindow :: callProc() { const AFX_MSGMAP* pMessageMap; const AFX_MSGMAP_ENTRY *lpEntry; pMessageMap = GetMessageMap(); lpEntry = pMessageMap->lpEntries; if( lpEntry->nMessage == 100) { (this->*lpEntry->pfn)(); } } const AFX_MSGMAP* CMainWindow ::GetMessageMap() const { return & CMainWindow ::messageMap; } const AFX_MSGMAP CMainWindow ::messageMap = { & CFrameWnd ::messageMap, & CMainWindow ::_messageEntries[0] }; AFX_MSGMAP_ENTRY CMainWindow ::_messageEntries[] = { { 100, (AFX_PMSG)(AFX_PMSGW)(void (CWnd::*)(void))&CMainWindow::OnPaint }, {0, (AFX_PMSG)0 } }; int main( int argc, char **argv) { CMainWindow myWindow; myWindow.callProc(); return fail; }