OSDN Git Service

Backported from mainline
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 3 Sep 2012 16:04:19 +0000 (16:04 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 3 Sep 2012 16:04:19 +0000 (16:04 +0000)
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.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@190899 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-convert.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr54428.c [new file with mode: 0644]

index 5dbdac7..8ad6a6e 100644 (file)
@@ -1,6 +1,14 @@
 2012-09-03  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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/54363
index f4583c5..48d7375 100644 (file)
@@ -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;
            }
        }
index a83d770..2e0d9bf 100644 (file)
@@ -1,6 +1,11 @@
 2012-09-03  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2012-08-31  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/54428
+       * gcc.c-torture/compile/pr54428.c: New test.
+
        2012-08-24  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/54363
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54428.c b/gcc/testsuite/gcc.c-torture/compile/pr54428.c
new file mode 100644 (file)
index 0000000..84a5dbd
--- /dev/null
@@ -0,0 +1,9 @@
+/* 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;
+}