gcc7/gcc7-pr80593.patch

65 lines
2.2 KiB
Diff

2017-05-18 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.
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" } */
}