diff --git a/gcc/convert.cc b/gcc/convert.cc
index 64b7001843cd92746e5b236cea64d626c60c7462..5357609d8f05ec722d6696994debb12adc15fc60 100644
--- a/gcc/convert.cc
+++ b/gcc/convert.cc
@@ -1006,8 +1006,13 @@ convert_to_complex_1 (tree type, tree expr, bool fold_p)
     case ENUMERAL_TYPE:
     case BOOLEAN_TYPE:
     case BITINT_TYPE:
-      return build2 (COMPLEX_EXPR, type, convert (subtype, expr),
-		     convert (subtype, integer_zero_node));
+      {
+	tree real = convert (subtype, expr);
+	tree imag = convert (subtype, integer_zero_node);
+	if (error_operand_p (real) || error_operand_p (imag))
+	  return error_mark_node;
+	return build2 (COMPLEX_EXPR, type, real, imag);
+      }
 
     case COMPLEX_TYPE:
       {
diff --git a/gcc/testsuite/gcc.target/i386/float16-8.c b/gcc/testsuite/gcc.target/i386/float16-8.c
new file mode 100644
index 0000000000000000000000000000000000000000..003f82e71469878a80a2453dcfe57cbc3747495b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/float16-8.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-mno-sse" } */
+/* PR c/111903 */
+
+int i;
+_Float16 f;
+int bar(...);
+void
+foo (void)
+{
+  i /= bar ((_Complex _Float16) f); /* { dg-error "" } */
+}