Commit df4ddb11 by Ian Lance Taylor

compiler: Fix taking address of constant outside of function.

From-SVN: r187565
parent 8345ae93
...@@ -4048,6 +4048,8 @@ Unary_expression::do_get_tree(Translate_context* context) ...@@ -4048,6 +4048,8 @@ Unary_expression::do_get_tree(Translate_context* context)
&& TREE_CODE(expr) != INDIRECT_REF && TREE_CODE(expr) != INDIRECT_REF
&& TREE_CODE(expr) != COMPONENT_REF) && TREE_CODE(expr) != COMPONENT_REF)
{ {
if (current_function_decl != NULL)
{
tree tmp = create_tmp_var(TREE_TYPE(expr), get_name(expr)); tree tmp = create_tmp_var(TREE_TYPE(expr), get_name(expr));
DECL_IGNORED_P(tmp) = 1; DECL_IGNORED_P(tmp) = 1;
DECL_INITIAL(tmp) = expr; DECL_INITIAL(tmp) = expr;
...@@ -4056,7 +4058,36 @@ Unary_expression::do_get_tree(Translate_context* context) ...@@ -4056,7 +4058,36 @@ Unary_expression::do_get_tree(Translate_context* context)
build_pointer_type(TREE_TYPE(expr)), build_pointer_type(TREE_TYPE(expr)),
build1_loc(loc.gcc_location(), DECL_EXPR, build1_loc(loc.gcc_location(), DECL_EXPR,
void_type_node, tmp), void_type_node, tmp),
build_fold_addr_expr_loc(loc.gcc_location(), tmp)); build_fold_addr_expr_loc(loc.gcc_location(),
tmp));
}
else
{
tree tmp = build_decl(loc.gcc_location(), VAR_DECL,
create_tmp_var_name("A"), TREE_TYPE(expr));
DECL_EXTERNAL(tmp) = 0;
TREE_PUBLIC(tmp) = 0;
TREE_STATIC(tmp) = 1;
DECL_ARTIFICIAL(tmp) = 1;
TREE_ADDRESSABLE(tmp) = 1;
tree make_tmp;
if (!TREE_CONSTANT(expr))
make_tmp = fold_build2_loc(loc.gcc_location(), INIT_EXPR,
void_type_node, tmp, expr);
else
{
TREE_READONLY(tmp) = 1;
TREE_CONSTANT(tmp) = 1;
DECL_INITIAL(tmp) = expr;
make_tmp = NULL_TREE;
}
rest_of_decl_compilation(tmp, 1, 0);
tree addr = build_fold_addr_expr_loc(loc.gcc_location(), tmp);
if (make_tmp == NULL_TREE)
return addr;
return build2_loc(loc.gcc_location(), COMPOUND_EXPR,
TREE_TYPE(addr), make_tmp, addr);
}
} }
return build_fold_addr_expr_loc(loc.gcc_location(), expr); return build_fold_addr_expr_loc(loc.gcc_location(), expr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment