From 125f2a50c9e0c994dc2642c41dc597e03618c3cc Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sat, 24 Dec 2005 08:51:05 +0000 Subject: [PATCH] re PR c++/23171 (ICE on pointer initialization with C99 initializer) PR c++/23171 * varasm.c (initializer_constant_valid_p): An ADDR_EXPR of a CONSTRUCTOR is invalid. PR c++/23171 * g++.dg/opt/init1.C: New test. From-SVN: r109035 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/init1.C | 4 ++++ gcc/varasm.c | 30 ++++++++++++++++++------------ 4 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/init1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 19c11a7130e..7a3fccff175 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-12-24 Mark Mitchell + + PR c++/23171 + * varasm.c (initializer_constant_valid_p): An ADDR_EXPR of a + CONSTRUCTOR is invalid. + 2005-12-23 Daniel Berlin * tree-pass.h (pass_eliminate_useless_stores): Remove. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd0d3336607..46f37f0c960 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-12-24 Mark Mitchell + + PR c++/23171 + * g++.dg/opt/init1.C: New test. + 2005-12-23 Mark Mitchell 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 00000000000..d9a139e72a8 --- /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 f304bb76e3f..f39b07ccc9a 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: -- 2.30.2