diff options
author | Jason Merrill <jason@redhat.com> | 2011-08-30 11:28:30 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-08-30 11:28:30 -0400 |
commit | d05da2b9d529b199ff3589353e91ec4440f5ab1f (patch) | |
tree | 627d1ad552fd4c39a321a083b88fa281ac4f6dc7 | |
parent | 5de3524042e0d20785518da4f740ace609c2eae4 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C | 10 |
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); |