A conditional expression between DFP and non-DFP floating-point
produces an ICE.  This patch fixes this by making
build_conditional_expr return early when c_common_type produces an
error.

Bootstrapped with no regressions on x86_64-pc-linux-gnu.  Applied to 
mainline.

gcc/c:
2016-06-20  Joseph Myers  <jos...@codesourcery.com>

        PR c/71601
        * c-typeck.c (build_conditional_expr): Return error_mark_node if
        c_common_type returns error_mark_node.

gcc/testsuite:
2016-06-20  Joseph Myers  <jos...@codesourcery.com>

        PR c/71601
        * gcc.dg/dfp/usual-arith-conv-bad-3.c: New test.

Index: gcc/c/c-typeck.c
===================================================================
--- gcc/c/c-typeck.c    (revision 237589)
+++ gcc/c/c-typeck.c    (working copy)
@@ -4846,6 +4846,8 @@ build_conditional_expr (location_t colon_loc, tree
               || code2 == COMPLEX_TYPE))
     {
       result_type = c_common_type (type1, type2);
+      if (result_type == error_mark_node)
+       return error_mark_node;
       do_warn_double_promotion (result_type, type1, type2,
                                "implicit conversion from %qT to %qT to "
                                "match other result of conditional",
Index: gcc/testsuite/gcc.dg/dfp/usual-arith-conv-bad-3.c
===================================================================
--- gcc/testsuite/gcc.dg/dfp/usual-arith-conv-bad-3.c   (nonexistent)
+++ gcc/testsuite/gcc.dg/dfp/usual-arith-conv-bad-3.c   (working copy)
@@ -0,0 +1,13 @@
+/* Test error for conditional expression between DFP and other
+   floating operand.  */
+/* { dg-do compile } */
+
+_Decimal32 a;
+float b;
+int i;
+
+void
+f (void)
+{
+  (void) (i ? a : b); /* { dg-error "mix operands" } */
+}

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to