PR middle-end/77674
[official-gcc.git] / gcc / testsuite / g++.dg / other / pr35504.C
bloba37b8b37160f4c8ed7d32bdae9de600187e6241c
1 // { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } }
3 #define ATTR0 __attribute__((__regparm__(0)))
4 #define ATTR1 __attribute__((__regparm__(1)))
5 #define ATTR2 __attribute__((__regparm__(2)))
6 #define ATTR3 __attribute__((__regparm__(3)))
7 #define ATTR4 __attribute__((__fastcall__))
8 #define ATTR5 __attribute__((__stdcall__))
9 #define ATTR6 __attribute__((__cdecl__))
10 #define ATTR7
11 #define ATTR8 __attribute__((__thiscall__))
13 extern "C" void abort (void);
15 struct long_struct
17   int a[3];
20 struct long_struct ret;
22 class c3 *this3;
24 class c1
26   int val1;
27 public:
28     virtual void foo () { }
31 class c2
33 public:
34   virtual ATTR0 struct long_struct method0 ()
35   {
36     return ret;
37   }
39   virtual ATTR1 struct long_struct method1 ()
40   {
41     return ret;
42   }
44   virtual ATTR2 struct long_struct method2 ()
45   {
46     return ret;
47   }
49   virtual ATTR3 struct long_struct method3 ()
50   {
51     return ret;
52   }
54   virtual ATTR4 struct long_struct method4 ()
55   {
56     return ret;
57   }
59   virtual ATTR5 struct long_struct method5 ()
60   {
61     return ret;
62   }
64   virtual ATTR6 struct long_struct method6 ()
65   {
66     return ret;
67   }
69   virtual ATTR7 struct long_struct method7 ()
70   {
71     return ret;
72   }
74   virtual ATTR8 struct long_struct method8 ()
75   {
76     return ret;
77   }
80 class c3:c1, public c2
82 public:
83   c3 ()
84   {
85     this3 = this;
86   }
88   struct long_struct check_this (int a)
89   {
90     if (this3 != this)
91       abort ();
93     return ret;
94   }
96   virtual ATTR0 struct long_struct method0 ()
97   {
98     return check_this (0);
99   }
101   virtual ATTR1 struct long_struct method1 ()
102   {
103     return check_this (1);
104   }
106   virtual ATTR2 struct long_struct method2 ()
107   {
108     return check_this (2);
109   }
111   virtual ATTR3 struct long_struct method3 ()
112   {
113     return check_this (3);
114   }
116   virtual ATTR4 struct long_struct method4 ()
117   {
118     return check_this (4);
119   }
121   virtual ATTR5 struct long_struct method5 ()
122   {
123     return check_this (5);
124   }
126   virtual ATTR6 struct long_struct method6 ()
127   {
128     return check_this (6);
129   }
131   virtual ATTR7 struct long_struct method7 ()
132   {
133     return check_this (7);
134   }
136   virtual ATTR8 struct long_struct method8 ()
137   {
138     return check_this (7);
139   }
142 class c3 c3_instance;
143 class c2 *c2_ptr = &c3_instance;
146 main ()
148   c2_ptr->method0 ();
149   c2_ptr->method1 ();
150   c2_ptr->method2 ();
151   c2_ptr->method3 ();
152   c2_ptr->method4 ();
153   c2_ptr->method5 ();
154   c2_ptr->method6 ();
155   c2_ptr->method7 ();
156   c2_ptr->method8 ();
158   return 0;