aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-05-19 12:34:54 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-05-19 12:34:54 +0000
commit39aac208ab684854886fb72835c538ea1e11d8a1 (patch)
treeb8bc6b10af07105735e75380f433a969f291869f /gcc
parentf00e3d4e655069121d9cca74d6b70219a9c6378f (diff)
downloadgcc-39aac208ab684854886fb72835c538ea1e11d8a1.zip
gcc-39aac208ab684854886fb72835c538ea1e11d8a1.tar.gz
gcc-39aac208ab684854886fb72835c538ea1e11d8a1.tar.bz2
re PR c++/80593 (GCC 7, aligned_storage and “dereferencing type-punned pointer will break strict-aliasing rules”)
2017-05-19 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. From-SVN: r248269
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-warn.c8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C2
-rw-r--r--gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-2.C19
5 files changed, 36 insertions, 5 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 8287876..4ce70e4 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2017-05-19 Richard Biener <rguenther@suse.de>
+
+ PR c++/80593
+ * c-warn.c (strict_aliasing_warning): Do not warn for accesses
+ to alias-set zero memory.
+
2017-05-18 Bernd Edlinger <bernd.edlinger@hotmail.de>
* 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 1b2a8d8..e67ffb7 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 29a19cc..a8adc91 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
2017-05-19 Richard Biener <rguenther@suse.de>
+ 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 <rguenther@suse.de>
+
PR middle-end/80764
* gcc.dg/torture/pr80764.c: New testcase.
diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C
index 6f935c8..2d1a95b 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 0000000..0f04bf1
--- /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<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" }
+}