diff options
author | Dodji Seketeli <dodji@redhat.com> | 2011-02-16 20:45:15 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2011-02-16 21:45:15 +0100 |
commit | ebcb4bc3047888b1c9a655255c56257ff32dbc0b (patch) | |
tree | 038b0cf57a6931a7d0f470c056ac27966a0af411 /gcc | |
parent | 036e0d4f8fa0326a048e59f7fe44ef04150fef05 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic106.C | 22 |
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); +} |