| // { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } } |
| |
| #define ATTR0 __attribute__((__regparm__(0))) |
| #define ATTR1 __attribute__((__regparm__(1))) |
| #define ATTR2 __attribute__((__regparm__(2))) |
| #define ATTR3 __attribute__((__regparm__(3))) |
| #define ATTR4 __attribute__((__fastcall__)) |
| #define ATTR5 __attribute__((__stdcall__)) |
| #define ATTR6 __attribute__((__cdecl__)) |
| #define ATTR7 |
| #define ATTR8 __attribute__((__thiscall__)) |
| |
| extern "C" void abort (void); |
| |
| struct long_struct |
| { |
| int a[3]; |
| }; |
| |
| struct long_struct ret; |
| |
| class c3 *this3; |
| |
| class c1 |
| { |
| int val1; |
| public: |
| virtual void foo () { } |
| }; |
| |
| class c2 |
| { |
| public: |
| virtual ATTR0 struct long_struct method0 () |
| { |
| return ret; |
| } |
| |
| virtual ATTR1 struct long_struct method1 () |
| { |
| return ret; |
| } |
| |
| virtual ATTR2 struct long_struct method2 () |
| { |
| return ret; |
| } |
| |
| virtual ATTR3 struct long_struct method3 () |
| { |
| return ret; |
| } |
| |
| virtual ATTR4 struct long_struct method4 () |
| { |
| return ret; |
| } |
| |
| virtual ATTR5 struct long_struct method5 () |
| { |
| return ret; |
| } |
| |
| virtual ATTR6 struct long_struct method6 () |
| { |
| return ret; |
| } |
| |
| virtual ATTR7 struct long_struct method7 () |
| { |
| return ret; |
| } |
| |
| virtual ATTR8 struct long_struct method8 () |
| { |
| return ret; |
| } |
| }; |
| |
| class c3:c1, public c2 |
| { |
| public: |
| c3 () |
| { |
| this3 = this; |
| } |
| |
| struct long_struct check_this (int a) |
| { |
| if (this3 != this) |
| abort (); |
| |
| return ret; |
| } |
| |
| virtual ATTR0 struct long_struct method0 () |
| { |
| return check_this (0); |
| } |
| |
| virtual ATTR1 struct long_struct method1 () |
| { |
| return check_this (1); |
| } |
| |
| virtual ATTR2 struct long_struct method2 () |
| { |
| return check_this (2); |
| } |
| |
| virtual ATTR3 struct long_struct method3 () |
| { |
| return check_this (3); |
| } |
| |
| virtual ATTR4 struct long_struct method4 () |
| { |
| return check_this (4); |
| } |
| |
| virtual ATTR5 struct long_struct method5 () |
| { |
| return check_this (5); |
| } |
| |
| virtual ATTR6 struct long_struct method6 () |
| { |
| return check_this (6); |
| } |
| |
| virtual ATTR7 struct long_struct method7 () |
| { |
| return check_this (7); |
| } |
| |
| virtual ATTR8 struct long_struct method8 () |
| { |
| return check_this (7); |
| } |
| }; |
| |
| class c3 c3_instance; |
| class c2 *c2_ptr = &c3_instance; |
| |
| int |
| main () |
| { |
| c2_ptr->method0 (); |
| c2_ptr->method1 (); |
| c2_ptr->method2 (); |
| c2_ptr->method3 (); |
| c2_ptr->method4 (); |
| c2_ptr->method5 (); |
| c2_ptr->method6 (); |
| c2_ptr->method7 (); |
| c2_ptr->method8 (); |
| |
| return 0; |
| } |