diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 8287876d38eb9294f8f1d7855487731f69c4079d..4ce70e4d67a35996d5c503e5e528eb1973da9ddd 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 1b2a8d89ff2bc784de9aa08d369bd2f6f1220aa0..e67ffb77bd9aa61a7a38892973dab4cdcccf1530 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 29a19ccbf2a2df79d7eaaa371986b4956941d793..a8adc9195061ba54374ee5279b9f5b8d67540984 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +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 diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C index 6f935c8540bf8aefd4aa3312777816b96fbc0f7e..2d1a95bde1295c4a43442a9f88a3b81364b7aab9 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 0000000000000000000000000000000000000000..0f04bf19f0bfe7a3aa247c76b1be03eb67722691 --- /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" } +}