From 25c036a76d946bbac4c81da270068b996b81f33d Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 13 Apr 2016 20:11:29 +0000 Subject: Warn about empty parameter ABI with -Wabi=9. * call.c (empty_class_msg, mark_for_abi_warning) (warn_empty_class_abi): New. (build_call_a): Use them. * decl.c (store_parm_decls): Use mark_for_abi_warning. * error.c (pp_format_to_string): New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234960 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/testsuite/g++.dg/abi/empty12.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/empty12.h | 9 ++++++ gcc/testsuite/g++.dg/abi/empty12a.c | 6 ++++ gcc/testsuite/g++.dg/abi/empty13.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/empty13.h | 9 ++++++ gcc/testsuite/g++.dg/abi/empty13a.c | 6 ++++ gcc/testsuite/g++.dg/abi/empty14.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/empty14.h | 10 ++++++ gcc/testsuite/g++.dg/abi/empty14a.c | 6 ++++ gcc/testsuite/g++.dg/abi/empty15.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/empty15.h | 30 ++++++++++++++++++ gcc/testsuite/g++.dg/abi/empty15a.c | 6 ++++ gcc/testsuite/g++.dg/abi/empty16.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/empty16.h | 16 ++++++++++ gcc/testsuite/g++.dg/abi/empty16a.c | 6 ++++ gcc/testsuite/g++.dg/abi/empty17.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/empty17.h | 27 +++++++++++++++++ gcc/testsuite/g++.dg/abi/empty17a.c | 6 ++++ gcc/testsuite/g++.dg/abi/empty18.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/empty18.h | 9 ++++++ gcc/testsuite/g++.dg/abi/empty18a.c | 6 ++++ gcc/testsuite/g++.dg/abi/empty19.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/empty19.h | 10 ++++++ gcc/testsuite/g++.dg/abi/empty19a.c | 6 ++++ gcc/testsuite/g++.dg/abi/empty20.C | 25 +++++++++++++++ gcc/testsuite/g++.dg/abi/empty21.C | 21 +++++++++++++ gcc/testsuite/g++.dg/abi/pr60336-1.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/pr60336-10.C | 50 ++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/abi/pr60336-11.C | 56 ++++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/abi/pr60336-12.C | 57 +++++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/abi/pr60336-2.C | 48 +++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/abi/pr60336-3.C | 15 +++++++++ gcc/testsuite/g++.dg/abi/pr60336-4.C | 48 +++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/abi/pr60336-5.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/pr60336-6.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/pr60336-7.C | 17 +++++++++++ gcc/testsuite/g++.dg/abi/pr60336-8.C | 15 +++++++++ gcc/testsuite/g++.dg/abi/pr60336-9.C | 28 +++++++++++++++++ gcc/testsuite/g++.dg/abi/pr68355.C | 24 +++++++++++++++ 39 files changed, 759 insertions(+) create mode 100644 gcc/testsuite/g++.dg/abi/empty12.C create mode 100644 gcc/testsuite/g++.dg/abi/empty12.h create mode 100644 gcc/testsuite/g++.dg/abi/empty12a.c create mode 100644 gcc/testsuite/g++.dg/abi/empty13.C create mode 100644 gcc/testsuite/g++.dg/abi/empty13.h create mode 100644 gcc/testsuite/g++.dg/abi/empty13a.c create mode 100644 gcc/testsuite/g++.dg/abi/empty14.C create mode 100644 gcc/testsuite/g++.dg/abi/empty14.h create mode 100644 gcc/testsuite/g++.dg/abi/empty14a.c create mode 100644 gcc/testsuite/g++.dg/abi/empty15.C create mode 100644 gcc/testsuite/g++.dg/abi/empty15.h create mode 100644 gcc/testsuite/g++.dg/abi/empty15a.c create mode 100644 gcc/testsuite/g++.dg/abi/empty16.C create mode 100644 gcc/testsuite/g++.dg/abi/empty16.h create mode 100644 gcc/testsuite/g++.dg/abi/empty16a.c create mode 100644 gcc/testsuite/g++.dg/abi/empty17.C create mode 100644 gcc/testsuite/g++.dg/abi/empty17.h create mode 100644 gcc/testsuite/g++.dg/abi/empty17a.c create mode 100644 gcc/testsuite/g++.dg/abi/empty18.C create mode 100644 gcc/testsuite/g++.dg/abi/empty18.h create mode 100644 gcc/testsuite/g++.dg/abi/empty18a.c create mode 100644 gcc/testsuite/g++.dg/abi/empty19.C create mode 100644 gcc/testsuite/g++.dg/abi/empty19.h create mode 100644 gcc/testsuite/g++.dg/abi/empty19a.c create mode 100644 gcc/testsuite/g++.dg/abi/empty20.C create mode 100644 gcc/testsuite/g++.dg/abi/empty21.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-1.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-10.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-11.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-12.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-2.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-3.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-4.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-5.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-6.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-7.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-8.C create mode 100644 gcc/testsuite/g++.dg/abi/pr60336-9.C create mode 100644 gcc/testsuite/g++.dg/abi/pr68355.C (limited to 'gcc/testsuite/g++.dg') diff --git a/gcc/testsuite/g++.dg/abi/empty12.C b/gcc/testsuite/g++.dg/abi/empty12.C new file mode 100644 index 00000000000..ce1f6f2ae9c --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty12.C @@ -0,0 +1,17 @@ +// PR c++/60336 +// { dg-do run } +// { dg-options "-Wabi=9 -x c" } +// { dg-additional-sources "empty12a.c" } +// { dg-prune-output "command line option" } + +#include "empty12.h" +extern "C" void fun(struct dummy, struct foo); + +int main() +{ + struct dummy d; + struct foo f = { -1, -2, -3, -4, -5 }; + + fun(d, f); // { dg-warning "empty" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/empty12.h b/gcc/testsuite/g++.dg/abi/empty12.h new file mode 100644 index 00000000000..c61afcda0fb --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty12.h @@ -0,0 +1,9 @@ +struct dummy { }; +struct foo +{ + int i1; + int i2; + int i3; + int i4; + int i5; +}; diff --git a/gcc/testsuite/g++.dg/abi/empty12a.c b/gcc/testsuite/g++.dg/abi/empty12a.c new file mode 100644 index 00000000000..34a25bad75d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty12a.c @@ -0,0 +1,6 @@ +#include "empty12.h" +void fun(struct dummy d, struct foo f) +{ + if (f.i1 != -1) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/abi/empty13.C b/gcc/testsuite/g++.dg/abi/empty13.C new file mode 100644 index 00000000000..d1e094685de --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty13.C @@ -0,0 +1,17 @@ +// PR c++/60336 +// { dg-do run } +// { dg-options "-x c -fabi-version=9" } +// { dg-additional-sources "empty13a.c" } +// { dg-prune-output "command line option" } + +#include "empty13.h" +extern "C" void fun(struct dummy, struct foo); + +int main() +{ + struct dummy d; + struct foo f = { -1, -2, -3, -4, -5 }; + + fun(d, f); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/empty13.h b/gcc/testsuite/g++.dg/abi/empty13.h new file mode 100644 index 00000000000..c61afcda0fb --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty13.h @@ -0,0 +1,9 @@ +struct dummy { }; +struct foo +{ + int i1; + int i2; + int i3; + int i4; + int i5; +}; diff --git a/gcc/testsuite/g++.dg/abi/empty13a.c b/gcc/testsuite/g++.dg/abi/empty13a.c new file mode 100644 index 00000000000..b4303a63826 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty13a.c @@ -0,0 +1,6 @@ +#include "empty13.h" +void fun(struct dummy d, struct foo f) +{ + if (f.i1 == -1) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/abi/empty14.C b/gcc/testsuite/g++.dg/abi/empty14.C new file mode 100644 index 00000000000..1b9c3975753 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty14.C @@ -0,0 +1,17 @@ +// PR c++/60336 +// { dg-do run } +// { dg-options "-Wabi=9 -x c" } +// { dg-additional-sources "empty14a.c" } +// { dg-prune-output "command line option" } + +#include "empty14.h" +extern "C" void fun(struct dummy, struct foo); + +int main() +{ + struct dummy d; + struct foo f = { -1, -2, -3, -4, -5 }; + + fun(d, f); // { dg-warning "empty" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/empty14.h b/gcc/testsuite/g++.dg/abi/empty14.h new file mode 100644 index 00000000000..5842279cf37 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty14.h @@ -0,0 +1,10 @@ +struct dummy0 { }; +struct dummy { struct dummy0 d[140]; }; +struct foo +{ + int i1; + int i2; + int i3; + int i4; + int i5; +}; diff --git a/gcc/testsuite/g++.dg/abi/empty14a.c b/gcc/testsuite/g++.dg/abi/empty14a.c new file mode 100644 index 00000000000..8b3d7800c36 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty14a.c @@ -0,0 +1,6 @@ +#include "empty14.h" +void fun(struct dummy d, struct foo f) +{ + if (f.i1 != -1) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/abi/empty15.C b/gcc/testsuite/g++.dg/abi/empty15.C new file mode 100644 index 00000000000..ac0a8681dc9 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty15.C @@ -0,0 +1,17 @@ +// PR c++/60336 +// { dg-do run } +// { dg-options "-Wabi=9 -x c" } +// { dg-additional-sources "empty15a.c" } +// { dg-prune-output "command line option" } + +#include "empty15.h" +extern "C" void fun(struct dummy, struct foo); + +int main() +{ + struct dummy d; + struct foo f = { -1, -2, -3, -4, -5 }; + + fun(d, f); // { dg-warning "empty" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/empty15.h b/gcc/testsuite/g++.dg/abi/empty15.h new file mode 100644 index 00000000000..1c6f26f5ae8 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty15.h @@ -0,0 +1,30 @@ +struct A1 {}; +struct A2 {}; +struct B1 { struct A1 a; struct A2 b; }; +struct B2 { struct A1 a; struct A2 b; }; +struct C1 { struct B1 a; struct B2 b; }; +struct C2 { struct B1 a; struct B2 b; }; +struct D1 { struct C1 a; struct C2 b; }; +struct D2 { struct C1 a; struct C2 b; }; +struct E1 { struct D1 a; struct D2 b; }; +struct E2 { struct D1 a; struct D2 b; }; +struct F1 { struct E1 a; struct E2 b; }; +struct F2 { struct E1 a; struct E2 b; }; +struct G1 { struct F1 a; struct F2 b; }; +struct G2 { struct F1 a; struct F2 b; }; +struct H1 { struct G1 a; struct G2 b; }; +struct H2 { struct G1 a; struct G2 b; }; +struct I1 { struct H1 a; struct H2 b; }; +struct I2 { struct H1 a; struct H2 b; }; +struct J1 { struct I1 a; struct I2 b; }; +struct J2 { struct I1 a; struct I2 b; }; +struct dummy { struct J1 a; struct J2 b; }; + +struct foo +{ + int i1; + int i2; + int i3; + int i4; + int i5; +}; diff --git a/gcc/testsuite/g++.dg/abi/empty15a.c b/gcc/testsuite/g++.dg/abi/empty15a.c new file mode 100644 index 00000000000..325b2c5ba09 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty15a.c @@ -0,0 +1,6 @@ +#include "empty15.h" +void fun(struct dummy d, struct foo f) +{ + if (f.i1 != -1) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/abi/empty16.C b/gcc/testsuite/g++.dg/abi/empty16.C new file mode 100644 index 00000000000..de2bf5cd51d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty16.C @@ -0,0 +1,17 @@ +// PR c++/60336 +// { dg-do run } +// { dg-options "-Wabi=9 -x c" } +// { dg-additional-sources "empty16a.c" } +// { dg-prune-output "command line option" } + +#include "empty16.h" +extern "C" void fun(struct dummy, struct foo); + +int main() +{ + struct dummy d; + struct foo f = { -1, -2, -3, -4, -5 }; + + fun(d, f); // { dg-warning "empty" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/empty16.h b/gcc/testsuite/g++.dg/abi/empty16.h new file mode 100644 index 00000000000..7552ae06576 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty16.h @@ -0,0 +1,16 @@ +#ifdef __cplusplus +struct A1 {}; +struct A2 {}; +struct dummy : A1, A2 {} ; +#else +struct dummy {}; +#endif + +struct foo +{ + int i1; + int i2; + int i3; + int i4; + int i5; +}; diff --git a/gcc/testsuite/g++.dg/abi/empty16a.c b/gcc/testsuite/g++.dg/abi/empty16a.c new file mode 100644 index 00000000000..6cb7fbccecc --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty16a.c @@ -0,0 +1,6 @@ +#include "empty16.h" +void fun(struct dummy d, struct foo f) +{ + if (f.i1 != -1) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/abi/empty17.C b/gcc/testsuite/g++.dg/abi/empty17.C new file mode 100644 index 00000000000..c7a37c093d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty17.C @@ -0,0 +1,17 @@ +// PR c++/60336 +// { dg-do run } +// { dg-options "-Wabi=9 -x c" } +// { dg-additional-sources "empty17a.c" } +// { dg-prune-output "command line option" } + +#include "empty17.h" +extern "C" void fun(struct dummy, struct foo); + +int main() +{ + struct dummy d; + struct foo f = { -1, -2, -3, -4, -5 }; + + fun(d, f); // { dg-warning "empty" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/empty17.h b/gcc/testsuite/g++.dg/abi/empty17.h new file mode 100644 index 00000000000..9cf72baca2e --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty17.h @@ -0,0 +1,27 @@ +#ifdef __cplusplus +struct A1 +{ + void foo (void); + unsigned int : 15; +}; +struct A2 +{ + void bar (void); + unsigned int : 15; +}; +struct dummy : A1, A2 +{ + unsigned int : 15; +}; +#else +struct dummy {}; +#endif + +struct foo +{ + int i1; + int i2; + int i3; + int i4; + int i5; +}; diff --git a/gcc/testsuite/g++.dg/abi/empty17a.c b/gcc/testsuite/g++.dg/abi/empty17a.c new file mode 100644 index 00000000000..24408fde09c --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty17a.c @@ -0,0 +1,6 @@ +#include "empty17.h" +void fun(struct dummy d, struct foo f) +{ + if (f.i1 != -1) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/abi/empty18.C b/gcc/testsuite/g++.dg/abi/empty18.C new file mode 100644 index 00000000000..6cad33c8dd3 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty18.C @@ -0,0 +1,17 @@ +// PR c++/60336 +// { dg-do run } +// { dg-options "-Wabi=9 -x c" } +// { dg-additional-sources "empty18a.c" } +// { dg-prune-output "command line option" } + +#include "empty18.h" +extern "C" void fun(struct dummy, struct foo); + +int main() +{ + struct dummy d; + struct foo f = { -1, -2, -3, -4, -5 }; + + fun(d, f); // { dg-warning "empty" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/empty18.h b/gcc/testsuite/g++.dg/abi/empty18.h new file mode 100644 index 00000000000..86e7ecdd211 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty18.h @@ -0,0 +1,9 @@ +struct dummy { int d[0]; }; +struct foo +{ + int i1; + int i2; + int i3; + int i4; + int i5; +}; diff --git a/gcc/testsuite/g++.dg/abi/empty18a.c b/gcc/testsuite/g++.dg/abi/empty18a.c new file mode 100644 index 00000000000..902860bdc01 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty18a.c @@ -0,0 +1,6 @@ +#include "empty18.h" +void fun(struct dummy d, struct foo f) +{ + if (f.i1 != -1) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/abi/empty19.C b/gcc/testsuite/g++.dg/abi/empty19.C new file mode 100644 index 00000000000..e3e855a99bb --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty19.C @@ -0,0 +1,17 @@ +// PR c++/60336 +// { dg-do run } +// { dg-options "-Wabi=9 -x c" } +// { dg-additional-sources "empty19a.c" } +// { dg-prune-output "command line option" } + +#include "empty19.h" +extern "C" void fun(struct dummy, struct foo); + +int main() +{ + struct dummy d; + struct foo f = { -1, -2, -3, -4, -5 }; + + fun(d, f); // { dg-warning "empty" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/empty19.h b/gcc/testsuite/g++.dg/abi/empty19.h new file mode 100644 index 00000000000..616b87bdd93 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty19.h @@ -0,0 +1,10 @@ +struct dummy0 { }; +struct dummy { struct dummy0 d[0]; }; +struct foo +{ + int i1; + int i2; + int i3; + int i4; + int i5; +}; diff --git a/gcc/testsuite/g++.dg/abi/empty19a.c b/gcc/testsuite/g++.dg/abi/empty19a.c new file mode 100644 index 00000000000..767b1eb7320 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty19a.c @@ -0,0 +1,6 @@ +#include "empty19.h" +void fun(struct dummy d, struct foo f) +{ + if (f.i1 != -1) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/abi/empty20.C b/gcc/testsuite/g++.dg/abi/empty20.C new file mode 100644 index 00000000000..be1e826c838 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty20.C @@ -0,0 +1,25 @@ +// { dg-options "-Wabi=9 -O0" } + +struct A { }; + +void f(A, A) { } // No warning, trailing parms all empty +void f(A, A, int) { } // { dg-warning "ABI" } +__attribute__ ((always_inline)) +inline void f(A a, int i) { } // No warning, always inlined +__attribute__ ((always_inline)) +inline void f2(A a, int i) // But the call within the fn gets a warning +{ // when it's inlined into main + f(a,a,i); // { dg-warning "ABI" } +} +inline void f3(A a, int i) // This one is never called +{ + f(a,a,i); +} +int main() +{ + A a; + f(a,a); + f(a,a,42); // { dg-warning "ABI" } + f(a,42); + f2(a,42); +} diff --git a/gcc/testsuite/g++.dg/abi/empty21.C b/gcc/testsuite/g++.dg/abi/empty21.C new file mode 100644 index 00000000000..7538dd80c32 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/empty21.C @@ -0,0 +1,21 @@ +// { dg-options "-Wabi=9" } + +#include + +struct A { }; + +void f(int i, ...) +{ + va_list ap; + va_start (ap, i); + if (i >= 1) + va_arg (ap, A); // { dg-warning "ABI" } + if (i >= 2) + va_arg (ap, int); +} + +int main() +{ + f(0); + f(2, A(), 42); // { dg-warning "ABI" } +} diff --git a/gcc/testsuite/g++.dg/abi/pr60336-1.C b/gcc/testsuite/g++.dg/abi/pr60336-1.C new file mode 100644 index 00000000000..af0863887a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-1.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O2 -std=c++11 -fno-pic" } +// { dg-require-effective-target fpic } + +struct dummy { }; +struct true_type { struct dummy i; }; + +extern true_type y; +extern void xxx (true_type c); + +void +yyy (void) +{ + xxx (y); +} + +// { dg-final { scan-assembler "jmp\[\t \]+\[^\$\]*?_Z3xxx9true_type" { target i?86-*-* x86_64-*-* } } } diff --git a/gcc/testsuite/g++.dg/abi/pr60336-10.C b/gcc/testsuite/g++.dg/abi/pr60336-10.C new file mode 100644 index 00000000000..6c9c990dad6 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-10.C @@ -0,0 +1,50 @@ +// { dg-do run } +// { dg-options "-O2" } + +#include + +struct dummy0 { }; +struct dummy1 { }; +struct dummy : dummy0, dummy1 { }; + +void +test (struct dummy a, int m, ...) +{ + va_list va_arglist; + int i; + int count = 0; + + if (m == 0) + count++; + va_start (va_arglist, m); + i = va_arg (va_arglist, int); + if (i == 1) + count++; + i = va_arg (va_arglist, int); + if (i == 2) + i = va_arg (va_arglist, int); + count++; + if (i == 3) + count++; + i = va_arg (va_arglist, int); + if (i == 4) + count++; + i = va_arg (va_arglist, int); + if (i == 5) + count++; + i = va_arg (va_arglist, int); + if (i == 6) + count++; + va_end (va_arglist); + if (count != 7) + __builtin_abort (); +} + +struct dummy a0; + +int +main () +{ + test (a0, 0, 1, 2, 3, 4, 5, 6); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pr60336-11.C b/gcc/testsuite/g++.dg/abi/pr60336-11.C new file mode 100644 index 00000000000..c92f3d43a5b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-11.C @@ -0,0 +1,56 @@ +// { dg-do run } +// { dg-options "-O2" } + +#include + +struct dummy0 +{ + void bar (void); +}; +struct dummy1 +{ + void foo (void); +}; +struct dummy : dummy0, dummy1 { }; + +void +test (struct dummy a, int m, ...) +{ + va_list va_arglist; + int i; + int count = 0; + + if (m == 0) + count++; + va_start (va_arglist, m); + i = va_arg (va_arglist, int); + if (i == 1) + count++; + i = va_arg (va_arglist, int); + if (i == 2) + i = va_arg (va_arglist, int); + count++; + if (i == 3) + count++; + i = va_arg (va_arglist, int); + if (i == 4) + count++; + i = va_arg (va_arglist, int); + if (i == 5) + count++; + i = va_arg (va_arglist, int); + if (i == 6) + count++; + va_end (va_arglist); + if (count != 7) + __builtin_abort (); +} + +struct dummy a0; + +int +main () +{ + test (a0, 0, 1, 2, 3, 4, 5, 6); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pr60336-12.C b/gcc/testsuite/g++.dg/abi/pr60336-12.C new file mode 100644 index 00000000000..83a7bb0cfa0 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-12.C @@ -0,0 +1,57 @@ +// { dg-do run } +// { dg-options "-O2" } + +#include + +struct dummy0 +{ +}; +struct dummy1 +{ + unsigned : 15; +}; +struct dummy : dummy0, dummy1 +{ +}; + +void +test (struct dummy a, int m, ...) +{ + va_list va_arglist; + int i; + int count = 0; + + if (m == 0) + count++; + va_start (va_arglist, m); + i = va_arg (va_arglist, int); + if (i == 1) + count++; + i = va_arg (va_arglist, int); + if (i == 2) + i = va_arg (va_arglist, int); + count++; + if (i == 3) + count++; + i = va_arg (va_arglist, int); + if (i == 4) + count++; + i = va_arg (va_arglist, int); + if (i == 5) + count++; + i = va_arg (va_arglist, int); + if (i == 6) + count++; + va_end (va_arglist); + if (count != 7) + __builtin_abort (); +} + +struct dummy a0; + +int +main () +{ + test (a0, 0, 1, 2, 3, 4, 5, 6); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pr60336-2.C b/gcc/testsuite/g++.dg/abi/pr60336-2.C new file mode 100644 index 00000000000..32eecb32a67 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-2.C @@ -0,0 +1,48 @@ +// { dg-do run } +// { dg-options "-O2 -Wabi=9" } + +#include + +struct dummy { }; + +void +test (struct dummy a, int m, ...) // { dg-message "empty" } +{ + va_list va_arglist; + int i; + int count = 0; + + if (m == 0) + count++; + va_start (va_arglist, m); + i = va_arg (va_arglist, int); + if (i == 1) + count++; + i = va_arg (va_arglist, int); + if (i == 2) + i = va_arg (va_arglist, int); + count++; + if (i == 3) + count++; + i = va_arg (va_arglist, int); + if (i == 4) + count++; + i = va_arg (va_arglist, int); + if (i == 5) + count++; + i = va_arg (va_arglist, int); + if (i == 6) + count++; + va_end (va_arglist); + if (count != 7) + __builtin_abort (); +} + +struct dummy a0; + +int +main () +{ + test (a0, 0, 1, 2, 3, 4, 5, 6); // { dg-message "empty" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pr60336-3.C b/gcc/testsuite/g++.dg/abi/pr60336-3.C new file mode 100644 index 00000000000..8ebd4dda0e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-3.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-O2 -Wabi=9" } + +struct dummy { struct{}__attribute__((aligned (4))) a[7]; }; + +extern void test1 (struct dummy, ...); +extern void (*test2) (struct dummy, ...); + +void +foo () +{ + struct dummy a0; + test1 (a0, 42); // { dg-message "empty" } + test2 (a0, 42); // { dg-message "empty" } +} diff --git a/gcc/testsuite/g++.dg/abi/pr60336-4.C b/gcc/testsuite/g++.dg/abi/pr60336-4.C new file mode 100644 index 00000000000..8790a663d2b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-4.C @@ -0,0 +1,48 @@ +// { dg-do run { target { { i?86-*-* x86_64-*-* } && { ! { ia32 } } } } } +// { dg-options "-O2 -fabi-version=9" } + +#include + +struct dummy { }; + +void +test (struct dummy a, int m, ...) +{ + va_list va_arglist; + int i; + int count = 0; + + if (m == 0) + count++; + va_start (va_arglist, m); + i = va_arg (va_arglist, int); + if (i == 1) + count++; + i = va_arg (va_arglist, int); + if (i == 2) + i = va_arg (va_arglist, int); + count++; + if (i == 3) + count++; + i = va_arg (va_arglist, int); + if (i == 4) + count++; + i = va_arg (va_arglist, int); + if (i == 5) + count++; + i = va_arg (va_arglist, int); + if (i == 6) + count++; + va_end (va_arglist); + if (count == 7) + __builtin_abort (); +} + +struct dummy a0; + +int +main () +{ + test (a0, 0, 1, 2, 3, 4, 5, 6); + return 0; +} diff --git a/gcc/testsuite/g++.dg/abi/pr60336-5.C b/gcc/testsuite/g++.dg/abi/pr60336-5.C new file mode 100644 index 00000000000..b0c76ad5aa2 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-5.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O2 -std=c++11 -fno-pic" } +// { dg-require-effective-target fpic } + +struct dummy { }; +struct true_type { struct dummy i; struct dummy j; }; + +extern true_type y; +extern void xxx (true_type c); + +void +yyy (void) +{ + xxx (y); +} + +// { dg-final { scan-assembler "jmp\[\t \]+\[^\$\]*?_Z3xxx9true_type" { target i?86-*-* x86_64-*-* } } } diff --git a/gcc/testsuite/g++.dg/abi/pr60336-6.C b/gcc/testsuite/g++.dg/abi/pr60336-6.C new file mode 100644 index 00000000000..58796519334 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-6.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O2 -std=c++11 -fno-pic" } +// { dg-require-effective-target fpic } + +struct dummy { }; +struct true_type { struct dummy i1; struct dummy i2; }; + +extern true_type y; +extern void xxx (true_type c); + +void +yyy (void) +{ + xxx (y); +} + +// { dg-final { scan-assembler "jmp\[\t \]+\[^\$\]*?_Z3xxx9true_type" { target i?86-*-* x86_64-*-* } } } diff --git a/gcc/testsuite/g++.dg/abi/pr60336-7.C b/gcc/testsuite/g++.dg/abi/pr60336-7.C new file mode 100644 index 00000000000..0e5d2ef2f11 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-7.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O2 -std=c++11 -fno-pic" } +// { dg-require-effective-target fpic } + +struct dummy { }; +struct true_type { struct dummy i[120]; }; + +extern true_type y; +extern void xxx (true_type c); + +void +yyy (void) +{ + xxx (y); +} + +// { dg-final { scan-assembler "jmp\[\t \]+\[^\$\]*?_Z3xxx9true_type" { target i?86-*-* x86_64-*-* } } } diff --git a/gcc/testsuite/g++.dg/abi/pr60336-8.C b/gcc/testsuite/g++.dg/abi/pr60336-8.C new file mode 100644 index 00000000000..fdfc924bfc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-8.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-O2 -Wabi=9" } + +struct dummy { struct{} a[7][3]; }; + +extern void test1 (struct dummy, ...); +extern void (*test2) (struct dummy, ...); + +void +foo () +{ + struct dummy a0; + test1 (a0, 42); // { dg-message "empty" } + test2 (a0, 42); // { dg-message "empty" } +} diff --git a/gcc/testsuite/g++.dg/abi/pr60336-9.C b/gcc/testsuite/g++.dg/abi/pr60336-9.C new file mode 100644 index 00000000000..4ad333f6b9c --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr60336-9.C @@ -0,0 +1,28 @@ +// { dg-do compile } +// { dg-options "-O2 -std=c++11 -fno-pic" } +// { dg-require-effective-target fpic } + +struct A1 {}; struct A2 {}; +struct B1 { A1 a; A2 b; }; struct B2 { A1 a; A2 b; }; +struct C1 { B1 a; B2 b; }; struct C2 { B1 a; B2 b; }; +struct D1 { C1 a; C2 b; }; struct D2 { C1 a; C2 b; }; +struct E1 { D1 a; D2 b; }; struct E2 { D1 a; D2 b; }; +struct F1 { E1 a; E2 b; }; struct F2 { E1 a; E2 b; }; +struct G1 { F1 a; F2 b; }; struct G2 { F1 a; F2 b; }; +struct H1 { G1 a; G2 b; }; struct H2 { G1 a; G2 b; }; +struct I1 { H1 a; H2 b; }; struct I2 { H1 a; H2 b; }; +struct J1 { I1 a; I2 b; }; struct J2 { I1 a; I2 b; }; +struct dummy { J1 a; J2 b; }; + +struct true_type { struct dummy i; }; + +extern true_type y; +extern void xxx (true_type c); + +void +yyy (void) +{ + xxx (y); +} + +// { dg-final { scan-assembler "jmp\[\t \]+\[^\$\]*?_Z3xxx9true_type" { target i?86-*-* x86_64-*-* } } } diff --git a/gcc/testsuite/g++.dg/abi/pr68355.C b/gcc/testsuite/g++.dg/abi/pr68355.C new file mode 100644 index 00000000000..1354fc497b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/pr68355.C @@ -0,0 +1,24 @@ +// { dg-do compile } +// { dg-options "-O2 -std=c++11 -fno-pic" } +// { dg-require-effective-target fpic } + +template +struct integral_constant +{ + static constexpr _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + constexpr operator value_type() const { return value; } +}; + +typedef integral_constant true_type; +extern void xxx (true_type c); + +void +yyy (void) +{ + true_type y; + xxx (y); +} + +// { dg-final { scan-assembler "jmp\[\t \]+\[^\$\]*?_Z3xxx17integral_constantIbLb1EE" { target i?86-*-* x86_64-*-* } } } -- cgit v1.2.1