Use error_mark_node after error in convert
Checks
Commit Message
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.
---
gcc/convert.cc | 12 ++++++------
gcc/objc/objc-gnu-runtime-abi-01.cc | 3 +++
gcc/objc/objc-next-runtime-abi-01.cc | 3 +++
gcc/objc/objc-next-runtime-abi-02.cc | 3 +++
4 files changed, 15 insertions(+), 6 deletions(-)
Comments
On Mon, Oct 23, 2023 at 12:22 AM Andrew Pinski <pinskia@gmail.com> wrote:
>
> 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.
OK.
> 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.
> ---
> gcc/convert.cc | 12 ++++++------
> gcc/objc/objc-gnu-runtime-abi-01.cc | 3 +++
> gcc/objc/objc-next-runtime-abi-01.cc | 3 +++
> gcc/objc/objc-next-runtime-abi-02.cc | 3 +++
> 4 files changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/gcc/convert.cc b/gcc/convert.cc
> index 5357609d8f0..ac6af7026a7 100644
> --- a/gcc/convert.cc
> +++ b/gcc/convert.cc
> @@ -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;
> }
> }
>
> diff --git a/gcc/objc/objc-gnu-runtime-abi-01.cc b/gcc/objc/objc-gnu-runtime-abi-01.cc
> index fbf8307297a..6f45283b307 100644
> --- a/gcc/objc/objc-gnu-runtime-abi-01.cc
> +++ b/gcc/objc/objc-gnu-runtime-abi-01.cc
> @@ -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);
>
> diff --git a/gcc/objc/objc-next-runtime-abi-01.cc b/gcc/objc/objc-next-runtime-abi-01.cc
> index 70ab5262e17..9e28976043e 100644
> --- a/gcc/objc/objc-next-runtime-abi-01.cc
> +++ b/gcc/objc/objc-next-runtime-abi-01.cc
> @@ -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);
>
> diff --git a/gcc/objc/objc-next-runtime-abi-02.cc b/gcc/objc/objc-next-runtime-abi-02.cc
> index 6548c0078e0..723b47c9cf6 100644
> --- a/gcc/objc/objc-next-runtime-abi-02.cc
> +++ b/gcc/objc/objc-next-runtime-abi-02.cc
> @@ -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);
>
> --
> 2.39.3
>
@@ -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);