From ebcb4bc3047888b1c9a655255c56257ff32dbc0b Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Wed, 16 Feb 2011 20:45:15 +0000 Subject: [PATCH] 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): Ensure that even pack expansion arguments are not evaluated. gcc/testsuite/ PR c++/47326 * g++.dg/cpp0x/variadic106.C: New test. From-SVN: r170222 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 13 ++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/variadic106.C | 22 ++++++++++++++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic106.C 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 + + PR c++/47326 + * pt.c (tsubst_copy): Ensure that even pack + expansion arguments are not evaluated. + 2011-02-16 Jakub Jelinek 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 + + PR c++/47326 + * g++.dg/cpp0x/variadic106.C: New test. + 2011-02-16 Jakub Jelinek 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 +struct A +{ + typedef int value_type; +}; + +template +auto +f (_ARGS... args) -> typename A::value_type +{ + return 12; +} + +int +main() +{ + f(1,2); +} -- 2.7.4