The following reverts an earlier change of mine (2008) to explicitely warn about accessing alias-set zero memory with alias-set non-zero. That was supposed to catch the case in g++.dg/warn/Wstrict-aliasing-6.C which is
int foo () { char buf[8]; return *((int *)buf); /* { dg-warning "strict-aliasing" } */ } but at least since the typeless storage work this is considered valid and thus this warning is really bogus. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Ok for trunk and GCC 7 branch? Thanks, Richard. 2017-05-18 Richard Biener <rguent...@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. Index: gcc/c-family/c-warn.c =================================================================== --- gcc/c-family/c-warn.c (revision 248179) +++ gcc/c-family/c-warn.c (working copy) @@ -537,10 +537,10 @@ strict_aliasing_warning (tree otype, tre = 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"); Index: gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-2.C =================================================================== --- gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-2.C (nonexistent) +++ gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-2.C (working copy) @@ -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" } +} Index: gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C =================================================================== --- gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C (revision 248179) +++ gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C (working copy) @@ -4,6 +4,6 @@ int foo () { char buf[8]; - return *((int *)buf); /* { dg-warning "strict-aliasing" } */ + return *((int *)buf); /* { dg-bogus "strict-aliasing" } */ }