]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Use error_mark_node after error in convert
authorAndrew Pinski <pinskia@gmail.com>
Fri, 20 Oct 2023 21:49:32 +0000 (14:49 -0700)
committerAndrew Pinski <pinskia@gmail.com>
Mon, 23 Oct 2023 10:55:15 +0000 (03:55 -0700)
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
gcc/objc/objc-gnu-runtime-abi-01.cc
gcc/objc/objc-next-runtime-abi-01.cc
gcc/objc/objc-next-runtime-abi-02.cc

index 5357609d8f05ec722d6696994debb12adc15fc60..ac6af7026a75041c35bec304823113d82ff090e8 100644 (file)
@@ -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;
     }
 }
 
index fbf8307297a5dbf23a0652eda024b537e1540fdb..6f45283b307bf6baed3d60c71837923741ffb064 100644 (file)
@@ -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);
 
index 70ab5262e171526307a02c240a58858b1829eaeb..9e28976043eaba88d6a4b95cff3dcc423dd5d865 100644 (file)
@@ -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);
 
index 6548c0078e0afdc2522dd7597d5bc4aee27df439..723b47c9cf6f01f1ab4eaa5e8f00207536a567e8 100644 (file)
@@ -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);