aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2005-06-09 11:36:12 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2005-06-09 11:36:12 +0000
commit5878b92f9edefa7c60d5508fbba8441dc1358df9 (patch)
tree787ca8df932d5209b49a6b6917d989cc4a5c0b20
parent9df3d545d50e1c6440491c48f01840edd4346a19 (diff)
downloadgcc-5878b92f9edefa7c60d5508fbba8441dc1358df9.zip
gcc-5878b92f9edefa7c60d5508fbba8441dc1358df9.tar.gz
gcc-5878b92f9edefa7c60d5508fbba8441dc1358df9.tar.bz2
c-typeck.c (build_c_cast): Check type punning on COMPONENT_REF too.
/: * c-typeck.c (build_c_cast): Check type punning on COMPONENT_REF too. testsuite: * gcc.dg/alias-8.c: New. From-SVN: r100799
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-typeck.c9
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/alias-8.c12
4 files changed, 26 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 25004af..b419524 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-06-09 Nathan Sidwell <nathan@codesourcery.com>
+
+ * c-typeck.c (build_c_cast): Check type punning on COMPONENT_REF
+ too.
+
2005-06-09 Bernd Schmidt <bernd.schmidt@analog.com>
* config/bfin/bfin.c (enum bfin_builtins): Moved here from...
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index a1c7e56..9429b73 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -3304,14 +3304,15 @@ build_c_cast (tree type, tree expr)
&& !TREE_CONSTANT (value))
warning (0, "cast to pointer from integer of different size");
- if (TREE_CODE (type) == POINTER_TYPE
+ if (flag_strict_aliasing && warn_strict_aliasing
+ && TREE_CODE (type) == POINTER_TYPE
&& TREE_CODE (otype) == POINTER_TYPE
&& TREE_CODE (expr) == ADDR_EXPR
- && DECL_P (TREE_OPERAND (expr, 0))
- && flag_strict_aliasing && warn_strict_aliasing
+ && (DECL_P (TREE_OPERAND (expr, 0))
+ || TREE_CODE (TREE_OPERAND (expr, 0)) == COMPONENT_REF)
&& !VOID_TYPE_P (TREE_TYPE (type)))
{
- /* Casting the address of a decl to non void pointer. Warn
+ /* Casting the address of an object to non void pointer. Warn
if the cast breaks type based aliasing. */
if (!COMPLETE_TYPE_P (TREE_TYPE (type)))
warning (0, "type-punning to incomplete type might break strict-aliasing rules");
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0facf7f..fe3197c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-06-09 Nathan Sidwell <nathan@codesourcery.com>
+
+ * gcc.dg/alias-8.c: New.
+
2005-06-08 Joseph S. Myers <joseph@codesourcery.com>
* gcc.dg/format/cmn_err-1.c: Update.
diff --git a/gcc/testsuite/gcc.dg/alias-8.c b/gcc/testsuite/gcc.dg/alias-8.c
new file mode 100644
index 0000000..690f1b6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/alias-8.c
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-Wstrict-aliasing=2 -fstrict-aliasing" }
+
+struct s {
+ char *p;
+};
+
+void
+func(struct s *ptr)
+{
+ *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" } */
+}