aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-08-30 11:28:30 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-08-30 11:28:30 -0400
commitd05da2b9d529b199ff3589353e91ec4440f5ab1f (patch)
tree627d1ad552fd4c39a321a083b88fa281ac4f6dc7
parent5de3524042e0d20785518da4f740ace609c2eae4 (diff)
downloadgcc-d05da2b9d529b199ff3589353e91ec4440f5ab1f.zip
gcc-d05da2b9d529b199ff3589353e91ec4440f5ab1f.tar.gz
gcc-d05da2b9d529b199ff3589353e91ec4440f5ab1f.tar.bz2
re PR c++/50234 (internal compiler error: in cxx_eval_component_reference, at cp/semantics.c:6527)
PR c++/50234 * semantics.c (cxx_eval_component_reference): Handle value-initialization for omitted initializers. From-SVN: r178325
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C10
4 files changed, 29 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 315078a..9abac29 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2011-08-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/50234
+ * semantics.c (cxx_eval_component_reference): Handle
+ value-initialization for omitted initializers.
+
2011-08-29 Jason Merrill <jason@redhat.com>
PR c++/50224
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 07f53b5..1ad991f 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -6518,7 +6518,8 @@ cxx_eval_component_reference (const constexpr_call *call, tree t,
if (field == part)
return value;
}
- if (TREE_CODE (TREE_TYPE (whole)) == UNION_TYPE)
+ if (TREE_CODE (TREE_TYPE (whole)) == UNION_TYPE
+ && CONSTRUCTOR_NELTS (whole) > 0)
{
/* DR 1188 says we don't have to deal with this. */
if (!allow_non_constant)
@@ -6527,8 +6528,12 @@ cxx_eval_component_reference (const constexpr_call *call, tree t,
*non_constant_p = true;
return t;
}
- gcc_unreachable();
- return error_mark_node;
+
+ /* If there's no explicit init for this field, it's value-initialized. */
+ value = build_value_init (TREE_TYPE (t), tf_warning_or_error);
+ return cxx_eval_constant_expression (call, value,
+ allow_non_constant, addr,
+ non_constant_p);
}
/* Subroutine of cxx_eval_constant_expression.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2449a63..237deac 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-08-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/50234
+ * g++.dg/cpp0x/constexpr-value3.C: New.
+
2011-08-30 Richard Guenther <rguenther@suse.de>
PR middle-end/48571
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C
new file mode 100644
index 0000000..38d8993
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C
@@ -0,0 +1,10 @@
+// PR c++/50234
+// { dg-options -std=c++0x }
+
+#define SA(X) static_assert((X),#X)
+
+struct A { int i; };
+
+constexpr int f(A a) { return a.i; }
+
+SA(f({}) == 0);