On Thu, Mar 21, 2019 at 2:04 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > The handling of -Wstrict-aliasing=1 applied COMPLETE_TYPE_P to the > pointer type rather than the pointer target, so missed the warnings > for "struct incomplete" in the testcase. > > I couldn't find any existing C tests for -Wstrict-aliasing=1, > so I added a few extra tests besides the ones fixed by the patch. > I'm sure there's lots more we could test -- this is just supposed > to be better than the status quo (i.e. nothing). > > Tested on aarch64-linux-gnu. Not sure this is a regression in any > meaningful sense, so I guess it should wait for GCC 10. OK for stage 1?
OK for stage 1. Richard. > Richard > > > 2019-03-21 Richard Sandiford <richard.sandif...@arm.com> > > gcc/c-family/ > * c-warn.c (strict_aliasing_warning): Apply COMPLETE_TYPE_P to > the pointer target rather than the pointer itself. > > gcc/testsuite/ > * gcc.dg/alias-16.c: New test. > > Index: gcc/c-family/c-warn.c > =================================================================== > --- gcc/c-family/c-warn.c 2019-03-21 13:01:18.000000000 +0000 > +++ gcc/c-family/c-warn.c 2019-03-21 13:01:18.453582721 +0000 > @@ -746,7 +746,7 @@ strict_aliasing_warning (location_t loc, > are not revealed at higher levels. */ > alias_set_type set1 = get_alias_set (TREE_TYPE (otype)); > alias_set_type set2 = get_alias_set (TREE_TYPE (type)); > - if (!COMPLETE_TYPE_P (type) > + if (!COMPLETE_TYPE_P (TREE_TYPE (type)) > || !alias_sets_must_conflict_p (set1, set2)) > { > warning_at (loc, OPT_Wstrict_aliasing, > Index: gcc/testsuite/gcc.dg/alias-16.c > =================================================================== > --- /dev/null 2019-03-08 11:40:14.606883727 +0000 > +++ gcc/testsuite/gcc.dg/alias-16.c 2019-03-21 13:01:18.453582721 +0000 > @@ -0,0 +1,46 @@ > +/* { dg-do compile } */ > +/* { dg-options "-Wstrict-aliasing=1 -fstrict-aliasing" } */ > + > +struct incomplete; > +struct s1 { int i; }; > +struct s2 { double d; }; > + > +void > +f (int *i, double *d, struct s1 *s1, struct s2 *s2, char *c) > +{ > + (char *) i; > + (char *) d; > + (char *) s1; > + (char *) s2; > + (char *) c; > + > + (int *) i; > + (int *) d; /* { dg-warning "dereferencing type-punned pointer might break > strict-aliasing rules" } */ > + (int *) s1; /* { dg-warning "dereferencing type-punned pointer might break > strict-aliasing rules" } */ > + (int *) s2; /* { dg-warning "dereferencing type-punned pointer might break > strict-aliasing rules" } */ > + (int *) c; > + > + (double *) i; /* { dg-warning "dereferencing type-punned pointer might > break strict-aliasing rules" } */ > + (double *) d; > + (double *) s1; /* { dg-warning "dereferencing type-punned pointer might > break strict-aliasing rules" } */ > + (double *) s2; /* { dg-warning "dereferencing type-punned pointer might > break strict-aliasing rules" } */ > + (double *) c; > + > + (struct incomplete *) i; /* { dg-warning "dereferencing type-punned > pointer might break strict-aliasing rules" } */ > + (struct incomplete *) d; /* { dg-warning "dereferencing type-punned > pointer might break strict-aliasing rules" } */ > + (struct incomplete *) s1; /* { dg-warning "dereferencing type-punned > pointer might break strict-aliasing rules" } */ > + (struct incomplete *) s2; /* { dg-warning "dereferencing type-punned > pointer might break strict-aliasing rules" } */ > + (struct incomplete *) c; /* { dg-warning "dereferencing type-punned > pointer might break strict-aliasing rules" } */ > + > + (struct s1 *) i; /* { dg-warning "dereferencing type-punned pointer might > break strict-aliasing rules" } */ > + (struct s1 *) d; /* { dg-warning "dereferencing type-punned pointer might > break strict-aliasing rules" } */ > + (struct s1 *) s1; > + (struct s1 *) s2; /* { dg-warning "dereferencing type-punned pointer might > break strict-aliasing rules" } */ > + (struct s1 *) c; > + > + (struct s2 *) i; /* { dg-warning "dereferencing type-punned pointer might > break strict-aliasing rules" } */ > + (struct s2 *) d; /* { dg-warning "dereferencing type-punned pointer might > break strict-aliasing rules" } */ > + (struct s2 *) s1; /* { dg-warning "dereferencing type-punned pointer might > break strict-aliasing rules" } */ > + (struct s2 *) s2; > + (struct s2 *) c; > +}