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" } */
 }
 

Reply via email to