65 lines
2.2 KiB
Diff
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" } */
|
|
}
|
|
|