aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-12-07 22:31:25 -0500
committerJason Merrill <jason@gcc.gnu.org>2012-12-07 22:31:25 -0500
commit4eaee921faac4b20bcc81988ec2b1af4cc087efc (patch)
tree266f07a610c2b0f8c5124330bbd1f057eb07f0ff /gcc
parent3da2b176b387f367a02f5299607204ee6b27e359 (diff)
downloadgcc-4eaee921faac4b20bcc81988ec2b1af4cc087efc.zip
gcc-4eaee921faac4b20bcc81988ec2b1af4cc087efc.tar.gz
gcc-4eaee921faac4b20bcc81988ec2b1af4cc087efc.tar.bz2
re PR c++/55419 (ICE in gimplify_init_ctor_preeval, at gimplify.c:3587)
PR c++/55419 * tree.c (build_target_expr): Don't set TREE_CONSTANT. From-SVN: r194317
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/tree.c2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C27
3 files changed, 32 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index cee5db6..78e7d40 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2012-12-07 Jason Merrill <jason@redhat.com>
+
+ PR c++/55419
+ * tree.c (build_target_expr): Don't set TREE_CONSTANT.
+
2012-12-07 Aldy Hernandez <aldyh@redhat.com>
PR c++/55513
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index ca209eb..00fe53f 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -329,8 +329,6 @@ build_target_expr (tree decl, tree value, tsubst_flags_t complain)
side-effects, then the optimizer should be able to get rid of
whatever code is generated anyhow. */
TREE_SIDE_EFFECTS (t) = 1;
- if (literal_type_p (type))
- TREE_CONSTANT (t) = TREE_CONSTANT (value);
return t;
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C
new file mode 100644
index 0000000..6b822a1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist6.C
@@ -0,0 +1,27 @@
+// PR c++/55419
+// { dg-options -std=c++11 }
+
+struct P
+{
+ P () = default;
+ explicit constexpr P (int x) : p (x) {}
+ int p;
+};
+
+struct Q
+{
+ constexpr Q () : q (0x7f) {}
+ int q;
+};
+
+struct R
+{
+ Q q;
+ P p;
+};
+
+void
+foo (R *x)
+{
+ *x = {};
+}