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 >