diff options
author | Richard Biener <rguenther@suse.de> | 2017-05-19 12:34:54 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-05-19 12:34:54 +0000 |
commit | 39aac208ab684854886fb72835c538ea1e11d8a1 (patch) | |
tree | b8bc6b10af07105735e75380f433a969f291869f /gcc | |
parent | f00e3d4e655069121d9cca74d6b70219a9c6378f (diff) | |
download | gcc-39aac208ab684854886fb72835c538ea1e11d8a1.zip gcc-39aac208ab684854886fb72835c538ea1e11d8a1.tar.gz gcc-39aac208ab684854886fb72835c538ea1e11d8a1.tar.bz2 |
re PR c++/80593 (GCC 7, aligned_storage and “dereferencing type-punned pointer will break strict-aliasing rules”)
2017-05-19 Richard Biener <rguenther@suse.de>
PR c++/80593
* c-warn.c (strict_aliasing_warning): Do not warn for accesses
to alias-set zero memory.
* g++.dg/warn/Wstrict-aliasing-bogus-char-2.C: New testcase.
* g++.dg/warn/Wstrict-aliasing-6.C: Adjust expected outcome.
From-SVN: r248269
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-warn.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-2.C | 19 |
5 files changed, 36 insertions, 5 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 8287876..4ce70e4 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2017-05-19 Richard Biener <rguenther@suse.de> + + PR c++/80593 + * c-warn.c (strict_aliasing_warning): Do not warn for accesses + to alias-set zero memory. + 2017-05-18 Bernd Edlinger <bernd.edlinger@hotmail.de> * c-format.c (local_tree_type_node): Add GTY attribute. diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c index 1b2a8d8..e67ffb7 100644 --- a/gcc/c-family/c-warn.c +++ b/gcc/c-family/c-warn.c @@ -537,10 +537,10 @@ strict_aliasing_warning (tree otype, tree type, tree expr) = get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0))); alias_set_type set2 = get_alias_set (TREE_TYPE (type)); - if (set1 != set2 && set2 != 0 - && (set1 == 0 - || (!alias_set_subset_of (set2, set1) - && !alias_sets_conflict_p (set1, set2)))) + if (set2 != 0 + && set1 != set2 + && !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 29a19cc..a8adc91 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2017-05-19 Richard Biener <rguenther@suse.de> + PR c++/80593 + * g++.dg/warn/Wstrict-aliasing-bogus-char-2.C: New testcase. + * g++.dg/warn/Wstrict-aliasing-6.C: Adjust expected outcome. + +2017-05-19 Richard Biener <rguenther@suse.de> + PR middle-end/80764 * gcc.dg/torture/pr80764.c: New testcase. diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C index 6f935c8..2d1a95b 100644 --- a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C @@ -4,6 +4,6 @@ int foo () { char buf[8]; - return *((int *)buf); /* { dg-warning "strict-aliasing" } */ + return *((int *)buf); /* { dg-bogus "strict-aliasing" } */ } diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-2.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-2.C new file mode 100644 index 0000000..0f04bf1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-2.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options "-O2 -Wstrict-aliasing" } + +template<unsigned _Len, unsigned _Align> +struct aligned_storage +{ + union type + { + unsigned char __data[_Len]; + struct __attribute__((__aligned__((_Align)))) { } __align; + }; +}; + +aligned_storage<sizeof(int), __alignof__(int)>::type storage; + +int main() +{ + *reinterpret_cast<int*>(&storage) = 42; // { dg-bogus "break strict-aliasing" } +} |