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:
Joseph Myers 2009-10-23 13:18:42 +01:00 committed by Joseph Myers
parent 93f28ca73f
commit cb9c2485b2
5 changed files with 40 additions and 1 deletions

View 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

View 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. */

View 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

View 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

View 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));
}