diff options
author | Jason Merrill <jason@redhat.com> | 2013-01-03 13:31:23 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-01-03 13:31:23 -0500 |
commit | b53e05338485cebb06194831e75f46204707cdbb (patch) | |
tree | 3efef8cbafc75eacbe85bc24bd4a7681e6e8ceed | |
parent | 0506634a9387177b418e5abcb394c5d308a2b9e7 (diff) | |
download | gcc-b53e05338485cebb06194831e75f46204707cdbb.zip gcc-b53e05338485cebb06194831e75f46204707cdbb.tar.gz gcc-b53e05338485cebb06194831e75f46204707cdbb.tar.bz2 |
re PR c++/55856 (ICE on tuple with rvalue ref member)
PR c++/55856
* semantics.c (build_data_member_initialization): Handle DECL_EXPR.
From-SVN: r194865
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C | 16 |
3 files changed, 25 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e349084..dda06fd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2013-01-03 Jason Merrill <jason@redhat.com> + PR c++/55856 + * semantics.c (build_data_member_initialization): Handle DECL_EXPR. + PR c++/53650 * call.c (type_has_extended_temps): New. * cp-tree.h: Declare it. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index f649399..9f8119f 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5848,15 +5848,19 @@ build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec) member = TREE_OPERAND (t, 0); init = unshare_expr (TREE_OPERAND (t, 1)); } - else + else if (TREE_CODE (t) == CALL_EXPR) { - gcc_assert (TREE_CODE (t) == CALL_EXPR); member = CALL_EXPR_ARG (t, 0); /* We don't use build_cplus_new here because it complains about abstract bases. Leaving the call unwrapped means that it has the wrong type, but cxx_eval_constant_expression doesn't care. */ init = unshare_expr (t); } + else if (TREE_CODE (t) == DECL_EXPR) + /* Declaring a temporary, don't add it to the CONSTRUCTOR. */ + return true; + else + gcc_unreachable (); if (TREE_CODE (member) == INDIRECT_REF) member = TREE_OPERAND (member, 0); if (TREE_CODE (member) == NOP_EXPR) diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C new file mode 100644 index 0000000..4b526ea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor11.C @@ -0,0 +1,16 @@ +// PR c++/55856 +// { dg-options -std=c++11 } + +struct A +{ + A(const char *); +}; + +template <class T> +struct B +{ + T t; + template <class U> constexpr B(U&& u): t(u) { }; +}; + +B<A&&> b(""); |