diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-08-31 21:00:59 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-08-31 21:00:59 +0200 |
commit | d409320ca8b8a9e121e56a636084604b6089ea60 (patch) | |
tree | a5737acf8dc02d85ba026d10d52d0c174a265645 /gcc/c | |
parent | 2c84f67d8458beba886d3cf319327bf44060a9ad (diff) | |
download | gcc-d409320ca8b8a9e121e56a636084604b6089ea60.zip gcc-d409320ca8b8a9e121e56a636084604b6089ea60.tar.gz gcc-d409320ca8b8a9e121e56a636084604b6089ea60.tar.bz2 |
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
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/c/c-convert.c | 29 |
2 files changed, 23 insertions, 14 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 108c0d3..11f9be7 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,11 @@ +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> PR c/54355 diff --git a/gcc/c/c-convert.c b/gcc/c/c-convert.c index f4583c5..48d7375 100644 --- a/gcc/c/c-convert.c +++ b/gcc/c/c-convert.c @@ -1,6 +1,6 @@ /* Language-level data type conversion for GNU C. 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. @@ -92,7 +92,9 @@ convert (tree type, tree expr) 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); if (TREE_CODE (TREE_TYPE (expr)) == ERROR_MARK) return error_mark_node; @@ -135,24 +137,23 @@ convert (tree type, tree expr) but for the C FE c_save_expr needs to be called instead. */ if (TREE_CODE (TREE_TYPE (e)) == COMPLEX_TYPE) { - tree subtype = TREE_TYPE (type); - tree elt_type = TREE_TYPE (TREE_TYPE (e)); - - if (TYPE_MAIN_VARIANT (elt_type) != TYPE_MAIN_VARIANT (subtype) - && TREE_CODE (e) != COMPLEX_EXPR) + if (TREE_CODE (e) != COMPLEX_EXPR) { + tree subtype = TREE_TYPE (type); + tree elt_type = TREE_TYPE (TREE_TYPE (e)); + if (in_late_binary_op) e = save_expr (e); else e = c_save_expr (e); ret - = fold_build2 (COMPLEX_EXPR, type, - convert (subtype, - fold_build1 (REALPART_EXPR, - elt_type, e)), - convert (subtype, - fold_build1 (IMAGPART_EXPR, - elt_type, e))); + = fold_build2_loc (loc, COMPLEX_EXPR, type, + convert (subtype, + fold_build1 (REALPART_EXPR, + elt_type, e)), + convert (subtype, + fold_build1 (IMAGPART_EXPR, + elt_type, e))); goto maybe_fold; } } |