Use error_mark_node after error in convert
While working on PR c/111903, I Noticed that convert will convert integer_zero_node to that type after an error instead of returning error_mark_node. From what I can tell this was the old way of not having error recovery since other places in this file does return error_mark_node and the places I am replacing date from when the file was imported into the repro (either via a gcc2 merge or earlier). I also had to update the objc front-end to allow for the error_mark_node change, I suspect you could hit the ICE without this change though. Bootstrapped and tested on x86_64-linux-gnu with no regressions. gcc/ChangeLog: * convert.cc (convert_to_pointer_1): Return error_mark_node after an error. (convert_to_real_1): Likewise. (convert_to_integer_1): Likewise. (convert_to_complex_1): Likewise. gcc/objc/ChangeLog: * objc-gnu-runtime-abi-01.cc (build_objc_method_call): Allow for error_operand after call to build_c_cast. * objc-next-runtime-abi-01.cc (build_objc_method_call): Likewise. * objc-next-runtime-abi-02.cc (build_v2_build_objc_method_call): Likewise.
This commit is contained in:
parent
13c0d05247
commit
85e930ac85
4 changed files with 15 additions and 6 deletions
|
@ -96,7 +96,7 @@ convert_to_pointer_1 (tree type, tree expr, bool fold_p)
|
|||
|
||||
default:
|
||||
error ("cannot convert to a pointer type");
|
||||
return convert_to_pointer_1 (type, integer_zero_node, fold_p);
|
||||
return error_mark_node;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -332,11 +332,11 @@ convert_to_real_1 (tree type, tree expr, bool fold_p)
|
|||
case POINTER_TYPE:
|
||||
case REFERENCE_TYPE:
|
||||
error ("pointer value used where a floating-point was expected");
|
||||
return convert_to_real_1 (type, integer_zero_node, fold_p);
|
||||
return error_mark_node;
|
||||
|
||||
default:
|
||||
error ("aggregate value used where a floating-point was expected");
|
||||
return convert_to_real_1 (type, integer_zero_node, fold_p);
|
||||
return error_mark_node;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -959,7 +959,7 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
|
|||
|
||||
default:
|
||||
error ("aggregate value used where an integer was expected");
|
||||
return convert (type, integer_zero_node);
|
||||
return error_mark_node;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1053,11 +1053,11 @@ convert_to_complex_1 (tree type, tree expr, bool fold_p)
|
|||
case POINTER_TYPE:
|
||||
case REFERENCE_TYPE:
|
||||
error ("pointer value used where a complex was expected");
|
||||
return convert_to_complex_1 (type, integer_zero_node, fold_p);
|
||||
return error_mark_node;
|
||||
|
||||
default:
|
||||
error ("aggregate value used where a complex was expected");
|
||||
return convert_to_complex_1 (type, integer_zero_node, fold_p);
|
||||
return error_mark_node;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -700,6 +700,9 @@ build_objc_method_call (location_t loc, int super_flag, tree method_prototype,
|
|||
|
||||
lookup_object = build_c_cast (loc, rcv_p, lookup_object);
|
||||
|
||||
if (error_operand_p (lookup_object))
|
||||
return error_mark_node;
|
||||
|
||||
/* Use SAVE_EXPR to avoid evaluating the receiver twice. */
|
||||
lookup_object = save_expr (lookup_object);
|
||||
|
||||
|
|
|
@ -846,6 +846,9 @@ build_objc_method_call (location_t loc, int super_flag, tree method_prototype,
|
|||
|
||||
lookup_object = build_c_cast (loc, rcv_p, lookup_object);
|
||||
|
||||
if (error_operand_p (lookup_object))
|
||||
return error_mark_node;
|
||||
|
||||
/* Use SAVE_EXPR to avoid evaluating the receiver twice. */
|
||||
lookup_object = save_expr (lookup_object);
|
||||
|
||||
|
|
|
@ -1729,6 +1729,9 @@ build_v2_build_objc_method_call (int super, tree method_prototype,
|
|||
|
||||
lookup_object = build_c_cast (loc, rcv_p, lookup_object);
|
||||
|
||||
if (error_operand_p (lookup_object))
|
||||
return error_mark_node;
|
||||
|
||||
/* Use SAVE_EXPR to avoid evaluating the receiver twice. */
|
||||
lookup_object = save_expr (lookup_object);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue