On Wed, Apr 13, 2016 at 1:12 PM, Jason Merrill <ja...@redhat.com> wrote: > On 04/13/2016 03:18 PM, Jakub Jelinek wrote: >> >> On Wed, Apr 13, 2016 at 03:11:34PM -0400, Jason Merrill wrote: >>> >>> commit 761983a023b5217ef831a43f423779940c788ecf >>> Author: Jason Merrill <ja...@redhat.com> >>> Date: Tue Apr 12 13:16:50 2016 -0400 >>> >>> gcc/ >>> * cfgexpand.c (pass_expand::execute): Handle attribute >>> abi_warning. >>> * expr.c (expand_expr_real_1): Likewise. >>> gcc/cp/ >>> * call.c (empty_class_msg, mark_for_abi_warning): New. >>> (build_call_a): Use them. >>> * decl.c (store_parm_decls): Use mark_for_abi_warning. >>> * error.c (pp_format_to_string): New. >> >> >> I think you should put a space into the attribute name instead of _ >> to make it clear that it is not an attribute users can use directly in >> their >> code through __attribute__. >> >> Otherwise it looks reasonable to me. > > > Thanks, applied with that change. > > Jason >
Here are tests from PR 60336 and PR 68355. They pass on Linux/x86-64 with -m32/-mx32/-m64. OK for trunk? Thanks. -- H.J.
From d6420be9ce4f5e9e5c6a97ca66fa07309bfc11f7 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.to...@gmail.com> Date: Sun, 15 Nov 2015 13:19:05 -0800 Subject: [PATCH] Add more tests for empty C++ class passing PR c++/60336 PR middle-end/67239 PR target/68355 * g++.dg/pr60336-1.C: Likewise. * g++.dg/pr60336-2.C: Likewise. * g++.dg/pr60336-3.C: Likewise. * g++.dg/pr60336-4.C: Likewise. * g++.dg/pr60336-5.C: Likewise. * g++.dg/pr60336-6.C: Likewise. * g++.dg/pr60336-7.C: Likewise. * g++.dg/pr60336-8.C: Likewise. * g++.dg/pr60336-9.C: Likewise. * g++.dg/pr60336-10.C: Likewise. * g++.dg/pr60336-11.C: Likewise. * g++.dg/pr60336-12.C: Likewise. * g++.dg/pr68355.C: Likewise. --- gcc/testsuite/g++.dg/pr60336-1.C | 17 ++++++++++++ gcc/testsuite/g++.dg/pr60336-10.C | 50 ++++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/pr60336-11.C | 56 ++++++++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/pr60336-12.C | 57 +++++++++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/pr60336-2.C | 48 +++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/pr60336-3.C | 15 +++++++++++ gcc/testsuite/g++.dg/pr60336-4.C | 48 +++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/pr60336-5.C | 17 ++++++++++++ gcc/testsuite/g++.dg/pr60336-6.C | 17 ++++++++++++ gcc/testsuite/g++.dg/pr60336-7.C | 17 ++++++++++++ gcc/testsuite/g++.dg/pr60336-8.C | 15 +++++++++++ gcc/testsuite/g++.dg/pr60336-9.C | 28 +++++++++++++++++++ gcc/testsuite/g++.dg/pr68355.C | 24 +++++++++++++++++ 13 files changed, 409 insertions(+) create mode 100644 gcc/testsuite/g++.dg/pr60336-1.C create mode 100644 gcc/testsuite/g++.dg/pr60336-10.C create mode 100644 gcc/testsuite/g++.dg/pr60336-11.C create mode 100644 gcc/testsuite/g++.dg/pr60336-12.C create mode 100644 gcc/testsuite/g++.dg/pr60336-2.C create mode 100644 gcc/testsuite/g++.dg/pr60336-3.C create mode 100644 gcc/testsuite/g++.dg/pr60336-4.C create mode 100644 gcc/testsuite/g++.dg/pr60336-5.C create mode 100644 gcc/testsuite/g++.dg/pr60336-6.C create mode 100644 gcc/testsuite/g++.dg/pr60336-7.C create mode 100644 gcc/testsuite/g++.dg/pr60336-8.C create mode 100644 gcc/testsuite/g++.dg/pr60336-9.C create mode 100644 gcc/testsuite/g++.dg/pr68355.C diff --git a/gcc/testsuite/g++.dg/pr60336-1.C b/gcc/testsuite/g++.dg/pr60336-1.C new file mode 100644 index 0000000..946f8accd --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-1.C @@ -0,0 +1,17 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { 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/pr60336-10.C b/gcc/testsuite/g++.dg/pr60336-10.C new file mode 100644 index 0000000..58de85b --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-10.C @@ -0,0 +1,50 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-options "-O2" } + +#include <stdarg.h> + +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) + count++; + i = va_arg (va_arglist, int); + 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/pr60336-11.C b/gcc/testsuite/g++.dg/pr60336-11.C new file mode 100644 index 0000000..5b03b26 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-11.C @@ -0,0 +1,56 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-options "-O2" } + +#include <stdarg.h> + +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) + count++; + i = va_arg (va_arglist, int); + 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/pr60336-12.C b/gcc/testsuite/g++.dg/pr60336-12.C new file mode 100644 index 0000000..1cae768 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-12.C @@ -0,0 +1,57 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-options "-O2" } + +#include <stdarg.h> + +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) + count++; + i = va_arg (va_arglist, int); + 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/pr60336-2.C b/gcc/testsuite/g++.dg/pr60336-2.C new file mode 100644 index 0000000..f18cf1e --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-2.C @@ -0,0 +1,48 @@ +// { dg-do run } +// { dg-options "-O2 -Wabi=9" } + +#include <stdarg.h> + +struct dummy { }; + +void +test (struct dummy a, int m, ...) // { dg-warning "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) + count++; + i = va_arg (va_arglist, int); + 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-warning "empty" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/pr60336-3.C b/gcc/testsuite/g++.dg/pr60336-3.C new file mode 100644 index 0000000..334a879 --- /dev/null +++ b/gcc/testsuite/g++.dg/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, 1); // { dg-warning "empty" } + test2 (a0, 1); // { dg-warning "empty" } +} diff --git a/gcc/testsuite/g++.dg/pr60336-4.C b/gcc/testsuite/g++.dg/pr60336-4.C new file mode 100644 index 0000000..b103724 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-4.C @@ -0,0 +1,48 @@ +// { dg-do run } +// { dg-options "-O2" } + +#include <stdarg.h> + +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) + count++; + i = va_arg (va_arglist, int); + 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/pr60336-5.C b/gcc/testsuite/g++.dg/pr60336-5.C new file mode 100644 index 0000000..a051f6e --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-5.C @@ -0,0 +1,17 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { 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/pr60336-6.C b/gcc/testsuite/g++.dg/pr60336-6.C new file mode 100644 index 0000000..22728d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-6.C @@ -0,0 +1,17 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { 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/pr60336-7.C b/gcc/testsuite/g++.dg/pr60336-7.C new file mode 100644 index 0000000..5fc8320 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-7.C @@ -0,0 +1,17 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { 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/pr60336-8.C b/gcc/testsuite/g++.dg/pr60336-8.C new file mode 100644 index 0000000..38b6d34 --- /dev/null +++ b/gcc/testsuite/g++.dg/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, 1); // { dg-warning "empty" } + test2 (a0, 1); // { dg-warning "empty" } +} diff --git a/gcc/testsuite/g++.dg/pr60336-9.C b/gcc/testsuite/g++.dg/pr60336-9.C new file mode 100644 index 0000000..3d768c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60336-9.C @@ -0,0 +1,28 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { 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/pr68355.C b/gcc/testsuite/g++.dg/pr68355.C new file mode 100644 index 0000000..5c2f0da --- /dev/null +++ b/gcc/testsuite/g++.dg/pr68355.C @@ -0,0 +1,24 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-O2 -std=c++11 -fno-pic" } +// { dg-require-effective-target fpic } + +template<typename _Tp, _Tp __v> +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<bool, true> 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-*-* } } } -- 2.5.5