On Fri, 19 Aug 2011, Jakub Jelinek wrote:

> On Fri, Aug 19, 2011 at 03:55:12PM +0000, Joseph S. Myers wrote:
> > Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  Applied
> > to mainline.
> 
> The new tests ICE on i686-linux:
> FAIL: gcc.dg/builtin-complex-err-1.c (internal compiler error)
> FAIL: gcc.dg/builtin-complex-err-2.c (internal compiler error)
> FAIL: gcc.dg/torture/builtin-complex-1.c  -O*  (internal compiler error)
> 
> All the ICEs are on
>     case EXCESS_PRECISION_EXPR:
>       /* Each case where an operand with excess precision may be
>          encountered must remove the EXCESS_PRECISION_EXPR around
>          inner operands and possibly put one around the whole
>          expression or possibly convert to the semantic type (which
>          c_fully_fold does); we cannot tell at this stage which is
>          appropriate in any particular case.  */
>       gcc_unreachable ();
> in c_fully_fold_internal.

I've applied this patch that will hopefully fix the problem by
converting operands of __builtin_complex to their semantic types.
Bootstrapped with no regressions on x86_64-unknown-linux-gnu.

2011-08-19  Joseph Myers  <jos...@codesourcery.com>

        * c-parser.c (c_parser_postfix_expression): Convert operands of
        __builtin_complex to their semantic types.

Index: c-parser.c
===================================================================
--- c-parser.c  (revision 177911)
+++ c-parser.c  (working copy)
@@ -6428,7 +6428,13 @@ c_parser_postfix_expression (c_parser *p
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
                                     "expected %<)%>");
          mark_exp_read (e1.value);
+         if (TREE_CODE (e1.value) == EXCESS_PRECISION_EXPR)
+           e1.value = convert (TREE_TYPE (e1.value),
+                               TREE_OPERAND (e1.value, 0));
          mark_exp_read (e2.value);
+         if (TREE_CODE (e2.value) == EXCESS_PRECISION_EXPR)
+           e2.value = convert (TREE_TYPE (e2.value),
+                               TREE_OPERAND (e2.value, 0));
          if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (e1.value))
              || DECIMAL_FLOAT_TYPE_P (TREE_TYPE (e1.value))
              || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (e2.value))

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

Reply via email to