aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-04-26 10:33:10 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-04-26 10:33:10 +0000
commite78a87f724bc83fa6dab383742ec82f3b28a92eb (patch)
treed4f07be6bc47beccfe2a18adf7c4fd4762e2865a
parent4ef8a24ca5416226d82ca272dea88e460ae2ce86 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/c-family/c-warn.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/alias-16.c46
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;
+}