PR middle-end/44101
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 May 2010 10:02:07 +0000 (10:02 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 May 2010 10:02:07 +0000 (10:02 +0000)
* gimplify.c (gimplify_init_constructor): Build a VIEW_CONVERT_EXPR
around the uniquized constructor if its type requires a conversion.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159655 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/const3.C [new file with mode: 0644]

index f666191..ac091e5 100644 (file)
@@ -1,3 +1,9 @@
+2010-05-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/44101
+       * gimplify.c (gimplify_init_constructor): Build a VIEW_CONVERT_EXPR
+       around the uniquized constructor if its type requires a conversion.
+
 2010-05-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/44205
index 8f19ced..f5bd994 100644 (file)
@@ -3813,8 +3813,11 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
                if (notify_temp_creation)
                  return GS_ERROR;
 
-               walk_tree (&ctor, force_labels_r, NULL, NULL);
-               TREE_OPERAND (*expr_p, 1) = tree_output_constant_def (ctor);
+               walk_tree (&ctor, force_labels_r, NULL, NULL);
+               ctor = tree_output_constant_def (ctor);
+               if (!useless_type_conversion_p (type, TREE_TYPE (ctor)))
+                 ctor = build1 (VIEW_CONVERT_EXPR, type, ctor);
+               TREE_OPERAND (*expr_p, 1) = ctor;
 
                /* This is no longer an assignment of a CONSTRUCTOR, but
                   we still may have processing to do on the LHS.  So
index 77bc135..a0740aa 100644 (file)
@@ -1,3 +1,7 @@
+2010-05-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * g++.dg/other/const3.C: New test.
+
 2010-05-20  Daniel Franke  <franke.daniel@gmail.com>
 
         PR fortran/38407
diff --git a/gcc/testsuite/g++.dg/other/const3.C b/gcc/testsuite/g++.dg/other/const3.C
new file mode 100644 (file)
index 0000000..d47133b
--- /dev/null
@@ -0,0 +1,23 @@
+// PR middle-end/44101
+// { dg-do compile }
+
+extern bool equal (int[], int[], const int[]);
+extern bool equal (wchar_t[], wchar_t[], const wchar_t[]);
+
+void foo(void)
+{
+  const int A1[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
+  const int N1 = sizeof(A1) / sizeof(int);
+  int i1[N1];
+
+  if (equal(i1, i1 + N1, A1))
+    return;
+
+  const wchar_t A3[] = {L'\3', L'\3', L'\3', L'\3', L'\3',
+   L'\3', L'\3', L'\3', L'\3', L'\3'};
+  const int N3 = sizeof(A3) / sizeof(wchar_t);
+  wchar_t i3[N3];
+
+  if (equal(i3, i3 + N3, A3))
+    return;
+}