From 4745e4eb75aed535cc05f3393dd1209ffd8bac09 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 20 Sep 2007 23:21:03 +0200 Subject: [PATCH] re PR c++/33496 (ICE with sizeof for invalid argument pack) PR c++/33496 * pt.c (tsubst_copy) : Handle error_mark_node returned from tsubst_pack_expansion. (tsubst_copy_and_build) : Likewise. (tsubst_copy_and_build) : Likewise. * g++.dg/cpp0x/variadic76.C: New test. * g++.dg/cpp0x/variadic77.C: New test. * g++.dg/cpp0x/variadic78.C: New test. From-SVN: r128630 --- gcc/cp/pt.c | 8 +++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/variadic76.C | 13 +++++++++++++ gcc/testsuite/g++.dg/cpp0x/variadic77.C | 22 ++++++++++++++++++++++ gcc/testsuite/g++.dg/cpp0x/variadic78.C | 23 +++++++++++++++++++++++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic76.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic77.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic78.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 17acbaf220d..8accea4afad 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9584,6 +9584,8 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) /* We only want to compute the number of arguments. */ tree expanded = tsubst_pack_expansion (TREE_OPERAND (t, 0), args, complain, in_decl); + if (expanded == error_mark_node) + return error_mark_node; return build_int_cst (size_type_node, TREE_VEC_LENGTH (expanded)); } /* Fall through */ @@ -10584,6 +10586,8 @@ tsubst_copy_and_build (tree t, /* We only want to compute the number of arguments. */ tree expanded = tsubst_pack_expansion (TREE_OPERAND (t, 0), args, complain, in_decl); + if (expanded == error_mark_node) + return error_mark_node; return build_int_cst (size_type_node, TREE_VEC_LENGTH (expanded)); } /* Fall through */ @@ -10976,7 +10980,9 @@ tsubst_copy_and_build (tree t, ce->value = tsubst_pack_expansion (ce->value, args, complain, in_decl); - if (TREE_VEC_LENGTH (ce->value) == 1) + if (ce->value == error_mark_node) + ; + else if (TREE_VEC_LENGTH (ce->value) == 1) /* Just move the argument into place. */ ce->value = TREE_VEC_ELT (ce->value, 0); else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 675351d8dd3..f1186e80f6f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2007-09-20 Jakub Jelinek + PR c++/33496 + * g++.dg/cpp0x/variadic76.C: New test. + * g++.dg/cpp0x/variadic77.C: New test. + * g++.dg/cpp0x/variadic78.C: New test. + PR c/33238 PR c/27301 * gcc.c-torture/execute/20070919-1.c: New test. diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic76.C b/gcc/testsuite/g++.dg/cpp0x/variadic76.C new file mode 100644 index 00000000000..a9f8eabb34e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic76.C @@ -0,0 +1,13 @@ +// PR c++/33496 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template int foo () +{ + return sizeof... N (); // { dg-error "cannot be used as a function" } +} + +int bar () +{ + return foo<0> (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic77.C b/gcc/testsuite/g++.dg/cpp0x/variadic77.C new file mode 100644 index 00000000000..43f2d1e43d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic77.C @@ -0,0 +1,22 @@ +// PR c++/33496 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template struct pair +{ + int i, j; + pair () : i (M), j (N) {} +}; + +template struct S +{ + template static int foo () + { + return sizeof... (pair); // { dg-error "mismatched argument pack lengths" } + } +}; + +int bar () +{ + return S<0, 1, 2>::foo<0, 1> (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic78.C b/gcc/testsuite/g++.dg/cpp0x/variadic78.C new file mode 100644 index 00000000000..9e2b84ad0a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic78.C @@ -0,0 +1,23 @@ +// PR c++/33496 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template struct pair +{ + int i, j; + pair () : i (M), j (N) {} +}; + +template struct S +{ + template static int *foo () + { + static int x[] = { (M + N)... }; // { dg-error "mismatched argument pack lengths" } + return x; + } +}; + +int *bar () +{ + return S<0, 1, 2>::foo<0, 1> (); +} -- 2.30.2