re PR c/41673 (variable-length array dereference inside sizeof gives "warning: dereferencing type-punned pointer will break strict-aliasing rules")
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. testsuite: * gcc.dg/Wstrict-aliasing-bogus-vla-1.c: New test. From-SVN: r153496
This commit is contained in:
parent
93f28ca73f
commit
cb9c2485b2
5 changed files with 40 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
10
gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-vla-1.c
Normal file
10
gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-vla-1.c
Normal file
|
@ -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));
|
||||
}
|
Loading…
Add table
Reference in a new issue