diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-typeck.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/alias-8.c | 12 |
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" } */ +} |