On Thu, Jun 23, 2022 at 11:24 PM Dimitar Dimitrov <dimi...@dinux.eu> wrote:
>
> The gcc.dg/builtin-object-size-20.c test case assumes that the target
> inserts padding between structure members.  Obviously it fails for
> targets which pack structures by default.
>
> Split the cases into two tests, so that the ones requiring structure
> padding can be skipped for default_packed targets.
>
> Ok for trunk?

OK

> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/builtin-object-size-20.c: Remove cases which
>         work on default_packed targets.
>         * gcc.dg/builtin-object-size-22.c: New test with the cases
>         removed above.
>
> Signed-off-by: Dimitar Dimitrov <dimi...@dinux.eu>
> ---
>  gcc/testsuite/gcc.dg/builtin-object-size-20.c | 64 +--------------
>  gcc/testsuite/gcc.dg/builtin-object-size-22.c | 79 +++++++++++++++++++
>  2 files changed, 81 insertions(+), 62 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/builtin-object-size-22.c
>
> diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-20.c 
> b/gcc/testsuite/gcc.dg/builtin-object-size-20.c
> index bed973c2c77..f40e3dcc1a9 100644
> --- a/gcc/testsuite/gcc.dg/builtin-object-size-20.c
> +++ b/gcc/testsuite/gcc.dg/builtin-object-size-20.c
> @@ -1,7 +1,8 @@
>  /* PR middle-end/92815 - spurious -Wstringop-overflow writing into
>     a flexible array of an extern struct
>     { dg-do compile }
> -   { dg-options "-O -Wall -fdump-tree-optimized" } */
> +   { dg-options "-O -Wall -fdump-tree-optimized" }
> +   { dg-skip-if "test assumes that structs have padding" { default_packed } 
> } */
>
>  #define ASSERT(expr) ((expr) ? (void)0 : fail (__LINE__))
>  #define bos0(expr) __builtin_object_size (expr, 1)
> @@ -18,44 +19,6 @@ typedef __SIZE_TYPE__  size_t;
>  extern void fail (int);
>
>
> -/* Verify sizes of a struct with a flexible array member and no padding.  */
> -
> -struct ACX { char n, a[]; };
> -
> -struct ACX ac0 = { };
> -struct ACX ac1 = { 1, { 1 } };
> -struct ACX ac2 = { 2, { 1, 2 } };
> -struct ACX ac3 = { 3, { 1, 2, 3 } };
> -
> -extern struct ACX eacx;
> -
> -void facx (void)
> -{
> -  ASSERT (bos0 (&ac0) == sizeof ac0);
> -  ASSERT (bos0 (&ac1) == 2);
> -  ASSERT (bos0 (&ac2) == 3);
> -  ASSERT (bos0 (&ac3) == 4);
> -  ASSERT (bos0 (&eacx) == (size_t)-1);
> -
> -  ASSERT (bos1 (&ac0) == sizeof ac0);
> -  ASSERT (bos1 (&ac1) == 2);
> -  ASSERT (bos1 (&ac2) == 3);
> -  ASSERT (bos1 (&ac3) == 4);
> -  ASSERT (bos1 (&eacx) == (size_t)-1);
> -
> -  ASSERT (bos2 (&ac0) == sizeof ac0);
> -  ASSERT (bos2 (&ac1) == 2);
> -  ASSERT (bos2 (&ac2) == 3);
> -  ASSERT (bos2 (&ac3) == 4);
> -  ASSERT (bos2 (&eacx) == sizeof eacx);
> -
> -  ASSERT (bos3 (&ac0) == sizeof ac0);
> -  ASSERT (bos3 (&ac1) == 2);
> -  ASSERT (bos3 (&ac2) == 3);
> -  ASSERT (bos3 (&ac3) == 4);
> -  ASSERT (bos3 (&eacx) == sizeof eacx);
> -}
> -
>
>
>  /* Verify sizes of a struct with a flexible array member and 1 byte
> @@ -289,27 +252,4 @@ void fai64cx (void)
>    ASSERT (bos3 (&eai64cx) == sizeof eai64cx);
>  }
>
> -
> -/* Also verify sizes of a struct with a zero length array member.  */
> -
> -struct A0C0 { char n, a[0]; };
> -
> -struct A0C0 a0c0 = { };
> -extern struct A0C0 ea0c0;
> -
> -void fa0c0 (void)
> -{
> -  ASSERT (bos0 (&a0c0) == sizeof a0c0);
> -  ASSERT (bos0 (&ea0c0) == sizeof ea0c0);
> -
> -  ASSERT (bos1 (&a0c0) == sizeof a0c0);
> -  ASSERT (bos1 (&a0c0) == sizeof ea0c0);
> -
> -  ASSERT (bos2 (&a0c0) == sizeof a0c0);
> -  ASSERT (bos2 (&a0c0) == sizeof ea0c0);
> -
> -  ASSERT (bos3 (&a0c0) == sizeof a0c0);
> -  ASSERT (bos3 (&a0c0) == sizeof ea0c0);
> -}
> -
>  /* { dg-final { scan-tree-dump-not "fail" "optimized" } } */
> diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-22.c 
> b/gcc/testsuite/gcc.dg/builtin-object-size-22.c
> new file mode 100644
> index 00000000000..1e55229c949
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/builtin-object-size-22.c
> @@ -0,0 +1,79 @@
> +/* PR middle-end/92815 - a variant of gcc.dg/builtin-object-size-20.c
> +   prepared for all targets, irregardless if they pack or not
> +   the structs by default.
> +   { dg-do compile }
> +   { dg-options "-O -Wall -fdump-tree-optimized" } */
> +
> +#define ASSERT(expr) ((expr) ? (void)0 : fail (__LINE__))
> +#define bos0(expr) __builtin_object_size (expr, 1)
> +#define bos1(expr) __builtin_object_size (expr, 1)
> +#define bos2(expr) __builtin_object_size (expr, 2)
> +#define bos3(expr) __builtin_object_size (expr, 3)
> +
> +typedef __SIZE_TYPE__  size_t;
> +
> +
> +extern void fail (int);
> +
> +
> +/* Verify sizes of a struct with a flexible array member and no padding.  */
> +
> +struct ACX { char n, a[]; };
> +
> +struct ACX ac0 = { };
> +struct ACX ac1 = { 1, { 1 } };
> +struct ACX ac2 = { 2, { 1, 2 } };
> +struct ACX ac3 = { 3, { 1, 2, 3 } };
> +
> +extern struct ACX eacx;
> +
> +void facx (void)
> +{
> +  ASSERT (bos0 (&ac0) == sizeof ac0);
> +  ASSERT (bos0 (&ac1) == 2);
> +  ASSERT (bos0 (&ac2) == 3);
> +  ASSERT (bos0 (&ac3) == 4);
> +  ASSERT (bos0 (&eacx) == (size_t)-1);
> +
> +  ASSERT (bos1 (&ac0) == sizeof ac0);
> +  ASSERT (bos1 (&ac1) == 2);
> +  ASSERT (bos1 (&ac2) == 3);
> +  ASSERT (bos1 (&ac3) == 4);
> +  ASSERT (bos1 (&eacx) == (size_t)-1);
> +
> +  ASSERT (bos2 (&ac0) == sizeof ac0);
> +  ASSERT (bos2 (&ac1) == 2);
> +  ASSERT (bos2 (&ac2) == 3);
> +  ASSERT (bos2 (&ac3) == 4);
> +  ASSERT (bos2 (&eacx) == sizeof eacx);
> +
> +  ASSERT (bos3 (&ac0) == sizeof ac0);
> +  ASSERT (bos3 (&ac1) == 2);
> +  ASSERT (bos3 (&ac2) == 3);
> +  ASSERT (bos3 (&ac3) == 4);
> +  ASSERT (bos3 (&eacx) == sizeof eacx);
> +}
> +
> +/* Also verify sizes of a struct with a zero length array member.  */
> +
> +struct A0C0 { char n, a[0]; };
> +
> +struct A0C0 a0c0 = { };
> +extern struct A0C0 ea0c0;
> +
> +void fa0c0 (void)
> +{
> +  ASSERT (bos0 (&a0c0) == sizeof a0c0);
> +  ASSERT (bos0 (&ea0c0) == sizeof ea0c0);
> +
> +  ASSERT (bos1 (&a0c0) == sizeof a0c0);
> +  ASSERT (bos1 (&a0c0) == sizeof ea0c0);
> +
> +  ASSERT (bos2 (&a0c0) == sizeof a0c0);
> +  ASSERT (bos2 (&a0c0) == sizeof ea0c0);
> +
> +  ASSERT (bos3 (&a0c0) == sizeof a0c0);
> +  ASSERT (bos3 (&a0c0) == sizeof ea0c0);
> +}
> +
> +/* { dg-final { scan-tree-dump-not "fail" "optimized" } } */
> --
> 2.36.1
>

Reply via email to