diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-04-26 10:33:10 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-04-26 10:33:10 +0000 |
commit | e78a87f724bc83fa6dab383742ec82f3b28a92eb (patch) | |
tree | d4f07be6bc47beccfe2a18adf7c4fd4762e2865a | |
parent | 4ef8a24ca5416226d82ca272dea88e460ae2ce86 (diff) | |
download | gcc-e78a87f724bc83fa6dab383742ec82f3b28a92eb.zip gcc-e78a87f724bc83fa6dab383742ec82f3b28a92eb.tar.gz gcc-e78a87f724bc83fa6dab383742ec82f3b28a92eb.tar.bz2 |
Fix use of COMPLETE_TYPE_P for -Wstrict-aliasing=1
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).
2019-04-26 Richard Sandiford <richard.sandiford@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.
From-SVN: r270594
-rw-r--r-- | gcc/c-family/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-family/c-warn.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/alias-16.c | 46 |
4 files changed, 56 insertions, 1 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 12d4587..9a662f0 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2019-04-26 Richard Sandiford <richard.sandiford@arm.com> + + * c-warn.c (strict_aliasing_warning): Apply COMPLETE_TYPE_P to + the pointer target rather than the pointer itself. + 2019-04-19 Jakub Jelinek <jakub@redhat.com> PR c/89888 diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c index 322cf98..f95eba9 100644 --- a/gcc/c-family/c-warn.c +++ b/gcc/c-family/c-warn.c @@ -746,7 +746,7 @@ strict_aliasing_warning (location_t loc, tree type, tree expr) 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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5ea04dc..90e8d8b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-04-26 Richard Sandiford <richard.sandiford@arm.com> + + * gcc.dg/alias-16.c: New test. + 2019-04-25 Martin Liska <mliska@suse.cz> H.J. Lu <hongjiu.lu@intel.com> diff --git a/gcc/testsuite/gcc.dg/alias-16.c b/gcc/testsuite/gcc.dg/alias-16.c new file mode 100644 index 0000000..8f5aa35 --- /dev/null +++ b/gcc/testsuite/gcc.dg/alias-16.c @@ -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; +} |