diff options
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r-- | gcc/varasm.c | 30 |
1 files changed, 18 insertions, 12 deletions
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: |