On Thu, Jul 24, 2025 at 5:35 PM Artemiy Granat <a.gra...@ispras.ru> wrote: > > gcc/ChangeLog: > > * config/i386/i386-options.cc (ix86_handle_cconv_attribute): > Handle simultaneous use of regparm and thiscall attributes in > case when regparm is set before thiscall. > > gcc/testsuite/ChangeLog: > > * gcc.target/i386/attributes-error.c: Add more attributes > combinations.
OK. Thanks, Uros. > --- > gcc/config/i386/i386-options.cc | 4 ++ > .../gcc.target/i386/attributes-error.c | 41 +++++++++++++++---- > 2 files changed, 38 insertions(+), 7 deletions(-) > > diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc > index 755e5dcf9f1..e7b200cd4f1 100644 > --- a/gcc/config/i386/i386-options.cc > +++ b/gcc/config/i386/i386-options.cc > @@ -3729,6 +3729,10 @@ ix86_handle_cconv_attribute (tree *node, tree name, > tree args, int, > { > error ("cdecl and thiscall attributes are not compatible"); > } > + if (lookup_attribute ("regparm", TYPE_ATTRIBUTES (*node))) > + { > + error ("regparm and thiscall attributes are not compatible"); > + } > } > > /* Can combine sseregparm with all attributes. */ > diff --git a/gcc/testsuite/gcc.target/i386/attributes-error.c > b/gcc/testsuite/gcc.target/i386/attributes-error.c > index 405eda50105..935ea4db0af 100644 > --- a/gcc/testsuite/gcc.target/i386/attributes-error.c > +++ b/gcc/testsuite/gcc.target/i386/attributes-error.c > @@ -1,12 +1,39 @@ > /* { dg-do compile } */ > /* { dg-require-effective-target ia32 } */ > > -void foo1(int i, int j) __attribute__((fastcall, cdecl)); /* { dg-error "not > compatible" } */ > -void foo2(int i, int j) __attribute__((fastcall, stdcall)); /* { dg-error > "not compatible" } */ > +void foo1(int i, int j) __attribute__((cdecl, regparm(2))); > +void foo2(int i, int j) __attribute__((stdcall, regparm(2))); > void foo3(int i, int j) __attribute__((fastcall, regparm(2))); /* { dg-error > "not compatible" } */ > -void foo4(int i, int j) __attribute__((stdcall, cdecl)); /* { dg-error "not > compatible" } */ > -void foo5(int i, int j) __attribute__((stdcall, fastcall)); /* { dg-error > "not compatible" } */ > -void foo6(int i, int j) __attribute__((cdecl, fastcall)); /* { dg-error "not > compatible" } */ > -void foo7(int i, int j) __attribute__((cdecl, stdcall)); /* { dg-error "not > compatible" } */ > -void foo8(int i, int j) __attribute__((regparm(2), fastcall)); /* { dg-error > "not compatible" } */ > +void foo4(int i, int j) __attribute__((thiscall, regparm(2))); /* { dg-error > "not compatible" } */ > +void foo5(int i, int j) __attribute__((sseregparm, regparm(2))); > + > +void foo6(int i, int j) __attribute__((stdcall, fastcall)); /* { dg-error > "not compatible" } */ > +void foo7(int i, int j) __attribute__((regparm(2), fastcall)); /* { dg-error > "not compatible" } */ > +void foo8(int i, int j) __attribute__((sseregparm, fastcall)); /* { dg-error > "not compatible" } */ > +void foo9(int i, int j) __attribute__((thiscall, fastcall)); /* { dg-error > "not compatible" } */ > +void foo10(int i, int j) __attribute__((sseregparm, fastcall)); > + > +void foo11(int i, int j) __attribute__((cdecl, stdcall)); /* { dg-error "not > compatible" } */ > +void foo12(int i, int j) __attribute__((fastcall, stdcall)); /* { dg-error > "not compatible" } */ > +void foo13(int i, int j) __attribute__((thiscall, stdcall)); /* { dg-error > "not compatible" } */ > +void foo14(int i, int j) __attribute__((regparm(2), stdcall)); > +void foo15(int i, int j) __attribute__((sseregparm, stdcall)); > + > +void foo16(int i, int j) __attribute__((stdcall, cdecl)); /* { dg-error "not > compatible" } */ > +void foo17(int i, int j) __attribute__((fastcall, cdecl)); /* { dg-error > "not compatible" } */ > +void foo18(int i, int j) __attribute__((thiscall, cdecl)); /* { dg-error > "not compatible" } */ > +void foo19(int i, int j) __attribute__((regparm(2), cdecl)); > +void foo20(int i, int j) __attribute__((sseregparm, cdecl)); > + > +void foo21(int i, int j) __attribute__((stdcall, thiscall)); /* { dg-error > "not compatible" } */ > +void foo22(int i, int j) __attribute__((fastcall, thiscall)); /* { dg-error > "not compatible" } */ > +void foo23(int i, int j) __attribute__((cdecl, thiscall)); /* { dg-error > "not compatible" } */ > +void foo24(int i, int j) __attribute__((regparm(2), thiscall)); /* { > dg-error "not compatible" } */ > +void foo25(int i, int j) __attribute__((sseregparm, thiscall)); > + > +void foo26(int i, int j) __attribute__((cdecl, sseregparm)); > +void foo27(int i, int j) __attribute__((fastcall, sseregparm)); > +void foo28(int i, int j) __attribute__((stdcall, sseregparm)); > +void foo29(int i, int j) __attribute__((thiscall, sseregparm)); > +void foo30(int i, int j) __attribute__((regparm(2), sseregparm)); > > -- > 2.50.1 >