aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2011-02-16 20:45:15 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2011-02-16 21:45:15 +0100
commitebcb4bc3047888b1c9a655255c56257ff32dbc0b (patch)
tree038b0cf57a6931a7d0f470c056ac27966a0af411
parent036e0d4f8fa0326a048e59f7fe44ef04150fef05 (diff)
downloadgcc-ebcb4bc3047888b1c9a655255c56257ff32dbc0b.zip
gcc-ebcb4bc3047888b1c9a655255c56257ff32dbc0b.tar.gz
gcc-ebcb4bc3047888b1c9a655255c56257ff32dbc0b.tar.bz2
re PR c++/47326 ([C++0x] ICE in tsubst_copy (triggered by dependency of return type on parameter pack size))
PR c++/47326 gcc/cp/ PR c++/47326 * pt.c (tsubst_copy)<case SIZEOF_EXPR>: Ensure that even pack expansion arguments are not evaluated. gcc/testsuite/ PR c++/47326 * g++.dg/cpp0x/variadic106.C: New test. From-SVN: r170222
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic106.C22
4 files changed, 43 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d2972eb..dca9612 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2011-02-16 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/47326
+ * pt.c (tsubst_copy)<case SIZEOF_EXPR>: Ensure that even pack
+ expansion arguments are not evaluated.
+
2011-02-16 Jakub Jelinek <jakub@redhat.com>
PR c++/47704
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index fe3e954..aa956c8 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -11382,11 +11382,18 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
case SIZEOF_EXPR:
if (PACK_EXPANSION_P (TREE_OPERAND (t, 0)))
{
- /* We only want to compute the number of arguments. */
- tree expanded = tsubst_pack_expansion (TREE_OPERAND (t, 0), args,
- complain, in_decl);
+
+ tree expanded;
int len = 0;
+ ++cp_unevaluated_operand;
+ ++c_inhibit_evaluation_warnings;
+ /* We only want to compute the number of arguments. */
+ expanded = tsubst_pack_expansion (TREE_OPERAND (t, 0), args,
+ complain, in_decl);
+ --cp_unevaluated_operand;
+ --c_inhibit_evaluation_warnings;
+
if (TREE_CODE (expanded) == TREE_VEC)
len = TREE_VEC_LENGTH (expanded);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a25d496..e11bdf3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-16 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/47326
+ * g++.dg/cpp0x/variadic106.C: New test.
+
2011-02-16 Jakub Jelinek <jakub@redhat.com>
PR libfortran/47757
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic106.C b/gcc/testsuite/g++.dg/cpp0x/variadic106.C
new file mode 100644
index 0000000..80ec084
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic106.C
@@ -0,0 +1,22 @@
+// Origin: PR c++/47326
+// { dg-options "-std=c++0x" }
+// { dg-do compile }
+
+template <int _N>
+struct A
+{
+ typedef int value_type;
+};
+
+template <typename... _ARGS>
+auto
+f (_ARGS... args) -> typename A<sizeof...(args)>::value_type
+{
+ return 12;
+}
+
+int
+main()
+{
+ f(1,2);
+}