diff mbox series

Fix use of COMPLETE_TYPE_P for -Wstrict-aliasing=1

Message ID mpth8bwqsya.fsf@arm.com
State New
Headers show
Series Fix use of COMPLETE_TYPE_P for -Wstrict-aliasing=1 | expand

Commit Message

Richard Sandiford March 21, 2019, 1:04 p.m. UTC
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?

Richard


2019-03-21  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.

Comments

Richard Biener March 21, 2019, 1:14 p.m. UTC | #1
On Thu, Mar 21, 2019 at 2:04 PM Richard Sandiford
<richard.sandiford@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.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.
>
> 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;
> +}
diff mbox series

Patch

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;
+}