diff options
author | Richard Biener <rguenther@suse.de> | 2016-03-09 14:01:16 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-03-09 14:01:16 +0000 |
commit | c06d25bb3377e99191c0517b86ba210673bc9cf1 (patch) | |
tree | 856dd388eca493e1a07eeffc5445802c06df4ea4 | |
parent | 8e80c4d476053c4f0eee6bd9d10465e405b73e4a (diff) | |
download | gcc-c06d25bb3377e99191c0517b86ba210673bc9cf1.zip gcc-c06d25bb3377e99191c0517b86ba210673bc9cf1.tar.gz gcc-c06d25bb3377e99191c0517b86ba210673bc9cf1.tar.bz2 |
re PR c/70143 (false strict-aliasing warning)
2016-03-09 Richard Biener <rguenther@suse.de>
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
-rw-r--r-- | gcc/c-family/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-upcast.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-member.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wstrict-aliasing-struct-with-char-member.c | 16 |
6 files changed, 49 insertions, 7 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 464297b..534d605 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2016-03-09 Richard Biener <rguenther@suse.de> + + PR c/70143 + * c-common.c (strict_aliasing_warning): Add back + alias_sets_conflict_p check. + 2016-03-08 Jason Merrill <jason@redhat.com> * 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 965cf49..08b761c 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 2136f7f..9ea56a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-03-09 Richard Biener <rguenther@suse.de> + + 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 <ro@CeBiTec.Uni-Bielefeld.DE> * 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 0000000..cb70838 --- /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 6c5e88d..0000000 --- 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 0000000..0da9a16 --- /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" } */ +} |