Commit 89ca9e60 by Ian Lance Taylor

Check errors in binary comparisons and builtin calls.

From-SVN: r167872
parent 79cae72e
...@@ -6109,6 +6109,9 @@ Expression::comparison_tree(Translate_context* context, Operator op, ...@@ -6109,6 +6109,9 @@ Expression::comparison_tree(Translate_context* context, Operator op,
} }
} }
if (left_tree == error_mark_node || right_tree == error_mark_node)
return error_mark_node;
tree ret = fold_build2(code, boolean_type_node, left_tree, right_tree); tree ret = fold_build2(code, boolean_type_node, left_tree, right_tree);
if (CAN_HAVE_LOCATION_P(ret)) if (CAN_HAVE_LOCATION_P(ret))
SET_EXPR_LOCATION(ret, location); SET_EXPR_LOCATION(ret, location);
...@@ -7380,6 +7383,9 @@ Builtin_call_expression::do_get_tree(Translate_context* context) ...@@ -7380,6 +7383,9 @@ Builtin_call_expression::do_get_tree(Translate_context* context)
gcc_unreachable(); gcc_unreachable();
} }
if (val_tree == error_mark_node)
return error_mark_node;
tree type_tree = Type::lookup_integer_type("int")->get_tree(gogo); tree type_tree = Type::lookup_integer_type("int")->get_tree(gogo);
if (type_tree == TREE_TYPE(val_tree)) if (type_tree == TREE_TYPE(val_tree))
return val_tree; return val_tree;
...@@ -7506,7 +7512,8 @@ Builtin_call_expression::do_get_tree(Translate_context* context) ...@@ -7506,7 +7512,8 @@ Builtin_call_expression::do_get_tree(Translate_context* context)
void_type_node, void_type_node,
TREE_TYPE(arg), TREE_TYPE(arg),
arg); arg);
append_to_statement_list(call, &stmt_list); if (call != error_mark_node)
append_to_statement_list(call, &stmt_list);
} }
} }
...@@ -7665,6 +7672,8 @@ Builtin_call_expression::do_get_tree(Translate_context* context) ...@@ -7665,6 +7672,8 @@ Builtin_call_expression::do_get_tree(Translate_context* context)
arg1_tree = save_expr(arg1_tree); arg1_tree = save_expr(arg1_tree);
tree arg1_val = at->value_pointer_tree(gogo, arg1_tree); tree arg1_val = at->value_pointer_tree(gogo, arg1_tree);
tree arg1_len = at->length_tree(gogo, arg1_tree); tree arg1_len = at->length_tree(gogo, arg1_tree);
if (arg1_val == error_mark_node || arg1_len == error_mark_node)
return error_mark_node;
Type* arg2_type = arg2->type(); Type* arg2_type = arg2->type();
tree arg2_val; tree arg2_val;
...@@ -7682,6 +7691,8 @@ Builtin_call_expression::do_get_tree(Translate_context* context) ...@@ -7682,6 +7691,8 @@ Builtin_call_expression::do_get_tree(Translate_context* context)
arg2_val = String_type::bytes_tree(gogo, arg2_tree); arg2_val = String_type::bytes_tree(gogo, arg2_tree);
arg2_len = String_type::length_tree(gogo, arg2_tree); arg2_len = String_type::length_tree(gogo, arg2_tree);
} }
if (arg2_val == error_mark_node || arg2_len == error_mark_node)
return error_mark_node;
arg1_len = save_expr(arg1_len); arg1_len = save_expr(arg1_len);
arg2_len = save_expr(arg2_len); arg2_len = save_expr(arg2_len);
...@@ -7694,6 +7705,8 @@ Builtin_call_expression::do_get_tree(Translate_context* context) ...@@ -7694,6 +7705,8 @@ Builtin_call_expression::do_get_tree(Translate_context* context)
Type* element_type = at->element_type(); Type* element_type = at->element_type();
tree element_type_tree = element_type->get_tree(gogo); tree element_type_tree = element_type->get_tree(gogo);
if (element_type_tree == error_mark_node)
return error_mark_node;
tree element_size = TYPE_SIZE_UNIT(element_type_tree); tree element_size = TYPE_SIZE_UNIT(element_type_tree);
tree bytecount = fold_convert_loc(location, TREE_TYPE(element_size), tree bytecount = fold_convert_loc(location, TREE_TYPE(element_size),
len); len);
......
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