From c06d25bb3377e99191c0517b86ba210673bc9cf1 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 9 Mar 2016 14:01:16 +0000 Subject: [PATCH] re PR c/70143 (false strict-aliasing warning) 2016-03-09 Richard Biener c-family/ PR c/70143 * c-common.c (strict_aliasing_warning): Add back alias_sets_conflict_p check. * gcc.dg/Wstrict-aliasing-bogus-upcast.c: New testcase. * gcc.dg/Wstrict-aliasing-struct-with-char-member.c: Likewise. * gcc.dg/Wstrict-aliasing-struct-member.c: Remove again. From-SVN: r234084 --- gcc/c-family/ChangeLog | 6 ++++++ gcc/c-family/c-common.c | 4 +++- gcc/testsuite/ChangeLog | 7 +++++++ .../gcc.dg/Wstrict-aliasing-bogus-upcast.c | 17 +++++++++++++++++ .../gcc.dg/Wstrict-aliasing-struct-member.c | 6 ------ .../Wstrict-aliasing-struct-with-char-member.c | 16 ++++++++++++++++ 6 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-upcast.c delete mode 100644 gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-member.c create mode 100644 gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-with-char-member.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 464297b6539..534d6058870 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2016-03-09 Richard Biener + + PR c/70143 + * c-common.c (strict_aliasing_warning): Add back + alias_sets_conflict_p check. + 2016-03-08 Jason Merrill * c-opts.c (set_std_cxx1z): Don't enable concepts. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 965cf493699..08b761c4776 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -1568,7 +1568,9 @@ strict_aliasing_warning (tree otype, tree type, tree expr) alias_set_type set2 = get_alias_set (TREE_TYPE (type)); if (set1 != set2 && set2 != 0 - && (set1 == 0 || !alias_set_subset_of (set2, set1))) + && (set1 == 0 + || (!alias_set_subset_of (set2, set1) + && !alias_sets_conflict_p (set1, set2)))) { warning (OPT_Wstrict_aliasing, "dereferencing type-punned " "pointer will break strict-aliasing rules"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2136f7f92f9..9ea56a7b9fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-03-09 Richard Biener + + PR c/70143 + * gcc.dg/Wstrict-aliasing-bogus-upcast.c: New testcase. + * gcc.dg/Wstrict-aliasing-struct-with-char-member.c: Likewise. + * gcc.dg/Wstrict-aliasing-struct-member.c: Remove again. + 2016-03-09 Rainer Orth * gcc.dg/vect/bb-slp-34.c: Really don't xfail on aarch64-*-*, diff --git a/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-upcast.c b/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-upcast.c new file mode 100644 index 00000000000..cb70838809a --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-upcast.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wall" } */ + +struct a { + int i; +}; +struct b { + struct a a; + int j; +}; +int main(void) +{ + static struct b b; + struct a *ap=(struct a *)&b; + return ((struct b *)&ap->i)->j; /* { dg-bogus "will break strict-aliasing" } */ +} + diff --git a/gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-member.c b/gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-member.c deleted file mode 100644 index 6c5e88d856c..00000000000 --- a/gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-member.c +++ /dev/null @@ -1,6 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O2 -Wall" } */ - -struct S { int i; long l; }; -long x; -struct S foo () { return *(struct S *)&x; } /* { dg-warning "will break strict-aliasing" } */ diff --git a/gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-with-char-member.c b/gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-with-char-member.c new file mode 100644 index 00000000000..0da9a163781 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-with-char-member.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wall" } */ + +struct a { + int i; + char c; +}; +struct b { + float f; + float g; +}; +int main(void) +{ + static struct b b; + return ((struct a *)&b)->i; /* { dg-warning "will break strict-aliasing" } */ +}