Commit e78a87f7 by Richard Sandiford Committed by Richard Sandiford

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
parent 4ef8a24c
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
......
......@@ -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,
......
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>
......
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment