// RUN: %clang_cc1 -emit-llvm %s -o - -triple i386-apple-macosx10.7.2
// PR1084

extern "C"
{
  typedef unsigned char PRUint8;
  typedef unsigned int PRUint32;
}
typedef PRUint32 nsresult;
struct nsID
{
};
typedef nsID nsIID;
class nsISupports
{
};
extern "C++"
{
  template < class T > struct nsCOMTypeInfo
  {
    static const nsIID & GetIID ()
    {
      static const nsIID i = {};
      return i;
    }
  };
}

class nsIDOMEvent:public nsISupports
{
};
class nsIDOMEventListener:public nsISupports
{
public:static const nsIID & GetIID ()
  {
    static const nsIID i = {};
    return i;
  }
  virtual nsresult
    __attribute__ ((regparm (0), cdecl)) HandleEvent (nsIDOMEvent * event) =
    0;
};
class nsIDOMMouseListener:public nsIDOMEventListener
{
public:static const nsIID & GetIID ()
  {
    static const nsIID iid = {
    };
    return iid;
  }
  virtual nsresult
    __attribute__ ((regparm (0),
		    cdecl)) MouseDown (nsIDOMEvent * aMouseEvent) = 0;
};
typedef
typeof (&nsIDOMEventListener::HandleEvent)
  GenericHandler;
     struct EventDispatchData
     {
       PRUint32 message;
       GenericHandler method;
       PRUint8 bits;
     };
     struct EventTypeData
     {
       const EventDispatchData *events;
       int numEvents;
       const nsIID *iid;
     };
     static const EventDispatchData sMouseEvents[] = {
       {
	(300 + 2),
	reinterpret_cast < GenericHandler > (&nsIDOMMouseListener::MouseDown),
	0x01}
     };
static const EventTypeData sEventTypes[] = {
  {
   sMouseEvents, (sizeof (sMouseEvents) / sizeof (sMouseEvents[0])),
   &nsCOMTypeInfo < nsIDOMMouseListener >::GetIID ()}
};
