aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2010-05-21 10:02:07 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2010-05-21 10:02:07 +0000
commit46314d3e81d9f46274e20bac701671c5f3c5493e (patch)
tree2b828b4c72f7f8ac16899fa066373c29a62932a3 /gcc
parentf99fcb3ba5b2f9bae0d0e85e97e6e6e4ec3e5aa4 (diff)
downloadgcc-46314d3e81d9f46274e20bac701671c5f3c5493e.zip
gcc-46314d3e81d9f46274e20bac701671c5f3c5493e.tar.gz
gcc-46314d3e81d9f46274e20bac701671c5f3c5493e.tar.bz2
re PR middle-end/44101 (ICE compiling 25_algorithms/fill/4.cc on Tru64 UNIX V5.1B)
PR middle-end/44101 * gimplify.c (gimplify_init_constructor): Build a VIEW_CONVERT_EXPR around the uniquized constructor if its type requires a conversion. From-SVN: r159655
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimplify.c7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/other/const3.C23
4 files changed, 38 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f666191..ac091e5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 8f19ced..f5bd994 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 77bc135..a0740aa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..d47133b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/const3.C
@@ -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;
+}