From: Richard Biener Date: Fri, 19 May 2017 12:34:54 +0000 (+0000) Subject: re PR c++/80593 (GCC 7, aligned_storage and “dereferencing type-punned pointer will... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=39aac208ab684854886fb72835c538ea1e11d8a1;p=gcc.git re PR c++/80593 (GCC 7, aligned_storage and “dereferencing type-punned pointer will break strict-aliasing rules”) 2017-05-19 Richard Biener 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 --- diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 8287876d38e..4ce70e4d67a 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2017-05-19 Richard Biener + + PR c++/80593 + * c-warn.c (strict_aliasing_warning): Do not warn for accesses + to alias-set zero memory. + 2017-05-18 Bernd Edlinger * 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 1b2a8d89ff2..e67ffb77bd9 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 29a19ccbf2a..a8adc919506 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-05-19 Richard Biener + + 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 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 6f935c8540b..2d1a95bde12 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 00000000000..0f04bf19f0b --- /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 +struct aligned_storage +{ + union type + { + unsigned char __data[_Len]; + struct __attribute__((__aligned__((_Align)))) { } __align; + }; +}; + +aligned_storage::type storage; + +int main() +{ + *reinterpret_cast(&storage) = 42; // { dg-bogus "break strict-aliasing" } +}