diff options
| -rw-r--r-- | gcc/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/gimple-fold.c | 4 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr46866.c | 19 |
4 files changed, 34 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 29c1c32..9dec6e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-12-09 Richard Guenther <rguenther@suse.de> + + PR middle-end/46844 + * gimple-fold.c (canonicalize_constructor_val): Canonicalize + addresses. + 2010-12-09 Joseph Myers <joseph@codesourcery.com> * config/i386/netware.h (TARGET_POSIX_IO): Define. diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index ae4771c..ba51ee8 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -132,6 +132,10 @@ canonicalize_constructor_val (tree cval) return NULL_TREE; if (base && TREE_CODE (base) == VAR_DECL) add_referenced_var (base); + /* We never have the chance to fixup types in global initializers + during gimplification. Do so here. */ + if (TREE_TYPE (TREE_TYPE (cval)) != TREE_TYPE (TREE_OPERAND (cval, 0))) + cval = build_fold_addr_expr (TREE_OPERAND (cval, 0)); } return cval; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ae01a31..e1317fb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-09 Richard Guenther <rguenther@suse.de> + + PR middle-end/46844 + * gcc.c-torture/compile/pr46866.c: New testcase. + 2010-12-09 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> PR testsuite/45068 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr46866.c b/gcc/testsuite/gcc.c-torture/compile/pr46866.c new file mode 100644 index 0000000..4941148 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr46866.c @@ -0,0 +1,19 @@ +extern void *malloc(__SIZE_TYPE__); +typedef struct T T; +struct T { + void (*destroy)(void *); +}; +void destroy(union { void *this; } __attribute__((transparent_union))); +static const typeof(destroy) *_destroy = (const typeof(destroy)*)destroy; +void destroy(void *this); +static T *create_empty(void) +{ + T *this = malloc(sizeof(*this)); + *this = (typeof(*this)){ _destroy }; + return this; +} +void openssl_crl_load(void) +{ + T *this = create_empty(); + destroy(this); +} |
