diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/init1.C | 4 | ||||
-rw-r--r-- | gcc/varasm.c | 30 |
4 files changed, 33 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 19c11a7..7a3fccf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-12-24 Mark Mitchell <mark@codesourcery.com> + + PR c++/23171 + * varasm.c (initializer_constant_valid_p): An ADDR_EXPR of a + CONSTRUCTOR is invalid. + 2005-12-23 Daniel Berlin <dberlin@dberlin.org> * tree-pass.h (pass_eliminate_useless_stores): Remove. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd0d333..46f37f0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-12-24 Mark Mitchell <mark@codesourcery.com> + + PR c++/23171 + * g++.dg/opt/init1.C: New test. + 2005-12-23 Mark Mitchell <mark@codesourcery.com> PR c++/24671 diff --git a/gcc/testsuite/g++.dg/opt/init1.C b/gcc/testsuite/g++.dg/opt/init1.C new file mode 100644 index 0000000..d9a139e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/init1.C @@ -0,0 +1,4 @@ +// PR c++/23171 +// { dg-options "-O" } + +int *p = (int*)(int[1]){0}; diff --git a/gcc/varasm.c b/gcc/varasm.c index f304bb7..f39b07c 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -3477,18 +3477,24 @@ initializer_constant_valid_p (tree value, tree endtype) case ADDR_EXPR: case FDESC_EXPR: value = staticp (TREE_OPERAND (value, 0)); - /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out to - be a constant, this is old-skool offsetof-like nonsense. */ - if (value - && TREE_CODE (value) == INDIRECT_REF - && TREE_CONSTANT (TREE_OPERAND (value, 0))) - return null_pointer_node; - /* Taking the address of a nested function involves a trampoline. */ - if (value - && TREE_CODE (value) == FUNCTION_DECL - && ((decl_function_context (value) && !DECL_NO_STATIC_CHAIN (value)) - || DECL_DLLIMPORT_P (value))) - return NULL_TREE; + if (value) + { + /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out to + be a constant, this is old-skool offsetof-like nonsense. */ + if (TREE_CODE (value) == INDIRECT_REF + && TREE_CONSTANT (TREE_OPERAND (value, 0))) + return null_pointer_node; + /* Taking the address of a nested function involves a trampoline. */ + if (TREE_CODE (value) == FUNCTION_DECL + && ((decl_function_context (value) + && !DECL_NO_STATIC_CHAIN (value)) + || DECL_DLLIMPORT_P (value))) + return NULL_TREE; + /* "&{...}" requires a temporary to hold the constructed + object. */ + if (TREE_CODE (value) == CONSTRUCTOR) + return NULL_TREE; + } return value; case VIEW_CONVERT_EXPR: |