OSDN Git Service

PR c/41673
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Oct 2009 12:18:42 +0000 (12:18 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Oct 2009 12:18:42 +0000 (12:18 +0000)
* alias.c (get_alias_set): Call langhook before returning 0 for
types with structural equality.
* c-common.c (c_common_get_alias_set): Use alias set of element
type for arrays with structural comparison.

testsuite:
* gcc.dg/Wstrict-aliasing-bogus-vla-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153496 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/alias.c
gcc/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-vla-1.c [new file with mode: 0644]

index b0a45ab..7e51d68 100644 (file)
@@ -1,3 +1,11 @@
+2009-10-23  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/41673
+       * alias.c (get_alias_set): Call langhook before returning 0 for
+       types with structural equality.
+       * c-common.c (c_common_get_alias_set): Use alias set of element
+       type for arrays with structural comparison.
+
 2009-10-23  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/41805
index 694498a..09ec775 100644 (file)
@@ -691,7 +691,14 @@ get_alias_set (tree t)
      requires structural comparisons to identify compatible types
      use alias set zero.  */
   if (TYPE_STRUCTURAL_EQUALITY_P (t))
-    return 0;
+    {
+      /* Allow the language to specify another alias set for this
+        type.  */
+      set = lang_hooks.get_alias_set (t);
+      if (set != -1)
+       return set;
+      return 0;
+    }
   t = TYPE_CANONICAL (t);
   /* Canonical types shouldn't form a tree nor should the canonical
      type require structural equality checks.  */
index 16e17b3..8a6d15b 100644 (file)
@@ -4183,6 +4183,15 @@ c_common_get_alias_set (tree t)
   tree u;
   PTR *slot;
 
+  /* For VLAs, use the alias set of the element type rather than the
+     default of alias set 0 for types compared structurally.  */
+  if (TYPE_P (t) && TYPE_STRUCTURAL_EQUALITY_P (t))
+    {
+      if (TREE_CODE (t) == ARRAY_TYPE)
+       return get_alias_set (TREE_TYPE (t));
+      return -1;
+    }
+
   /* Permit type-punning when accessing a union, provided the access
      is directly through the union.  For example, this code does not
      permit taking the address of a union member and then storing
index aa25228..81d39b5 100644 (file)
@@ -1,3 +1,8 @@
+2009-10-23  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/41673
+       * gcc.dg/Wstrict-aliasing-bogus-vla-1.c: New test.
+
 2009-10-23  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/41778
diff --git a/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-vla-1.c b/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-vla-1.c
new file mode 100644 (file)
index 0000000..e9f63d3
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR 41673: bogus -Wstrict-aliasing warning from VLA dereference.  */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -O2 -Wall" } */
+
+int main(int argc, char *argv[])
+{
+    float x[argc];
+    float y[argc];
+    return 0 == __builtin_memcpy(y, x, argc * sizeof(*x));
+}