Commit d409320c by Jakub Jelinek Committed by Jakub Jelinek

re PR c/54428 (ICE in gimplify_expr, at gimplify.c:7591)

	PR c/54428
	* c-convert.c (convert): Don't call fold_convert_loc if
	TYPE_MAIN_VARIANT of a COMPLEX_TYPE is the same, unless e
	is a COMPLEX_EXPR.  Remove TYPE_MAIN_VARIANT check from
	COMPLEX_TYPE -> COMPLEX_TYPE conversion.

	* gcc.c-torture/compile/pr54428.c: New test.

From-SVN: r190840
parent 2c84f67d
2012-08-31 Jakub Jelinek <jakub@redhat.com>
PR c/54428
* c-convert.c (convert): Don't call fold_convert_loc if
TYPE_MAIN_VARIANT of a COMPLEX_TYPE is the same, unless e
is a COMPLEX_EXPR. Remove TYPE_MAIN_VARIANT check from
COMPLEX_TYPE -> COMPLEX_TYPE conversion.
2012-08-24 Jakub Jelinek <jakub@redhat.com> 2012-08-24 Jakub Jelinek <jakub@redhat.com>
PR c/54355 PR c/54355
......
/* Language-level data type conversion for GNU C. /* Language-level data type conversion for GNU C.
Copyright (C) 1987, 1988, 1991, 1998, 2002, 2003, 2004, 2005, 2007, 2008, Copyright (C) 1987, 1988, 1991, 1998, 2002, 2003, 2004, 2005, 2007, 2008,
2009, 2010 Free Software Foundation, Inc. 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -92,7 +92,9 @@ convert (tree type, tree expr) ...@@ -92,7 +92,9 @@ convert (tree type, tree expr)
STRIP_TYPE_NOPS (e); STRIP_TYPE_NOPS (e);
if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (expr))) if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (expr))
&& (TREE_CODE (TREE_TYPE (expr)) != COMPLEX_TYPE
|| TREE_CODE (e) == COMPLEX_EXPR))
return fold_convert_loc (loc, type, expr); return fold_convert_loc (loc, type, expr);
if (TREE_CODE (TREE_TYPE (expr)) == ERROR_MARK) if (TREE_CODE (TREE_TYPE (expr)) == ERROR_MARK)
return error_mark_node; return error_mark_node;
...@@ -135,24 +137,23 @@ convert (tree type, tree expr) ...@@ -135,24 +137,23 @@ convert (tree type, tree expr)
but for the C FE c_save_expr needs to be called instead. */ but for the C FE c_save_expr needs to be called instead. */
if (TREE_CODE (TREE_TYPE (e)) == COMPLEX_TYPE) if (TREE_CODE (TREE_TYPE (e)) == COMPLEX_TYPE)
{ {
tree subtype = TREE_TYPE (type); if (TREE_CODE (e) != COMPLEX_EXPR)
tree elt_type = TREE_TYPE (TREE_TYPE (e));
if (TYPE_MAIN_VARIANT (elt_type) != TYPE_MAIN_VARIANT (subtype)
&& TREE_CODE (e) != COMPLEX_EXPR)
{ {
tree subtype = TREE_TYPE (type);
tree elt_type = TREE_TYPE (TREE_TYPE (e));
if (in_late_binary_op) if (in_late_binary_op)
e = save_expr (e); e = save_expr (e);
else else
e = c_save_expr (e); e = c_save_expr (e);
ret ret
= fold_build2 (COMPLEX_EXPR, type, = fold_build2_loc (loc, COMPLEX_EXPR, type,
convert (subtype, convert (subtype,
fold_build1 (REALPART_EXPR, fold_build1 (REALPART_EXPR,
elt_type, e)), elt_type, e)),
convert (subtype, convert (subtype,
fold_build1 (IMAGPART_EXPR, fold_build1 (IMAGPART_EXPR,
elt_type, e))); elt_type, e)));
goto maybe_fold; goto maybe_fold;
} }
} }
......
2012-08-31 Jakub Jelinek <jakub@redhat.com>
PR c/54428
* gcc.c-torture/compile/pr54428.c: New test.
2012-08-31 Ollie Wild <aaw@google.com> 2012-08-31 Ollie Wild <aaw@google.com>
PR c++/54197 PR c++/54197
......
/* PR c/54428 */
typedef double _Complex C;
C
foo (C x, C y, double z, C w)
{
return y - z * __builtin_cpow (x, 75) * w;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment