PR c++/84839 - ICE with decltype of parameter pack.
authorJason Merrill <jason@redhat.com>
Tue, 13 Mar 2018 18:57:10 +0000 (14:57 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 13 Mar 2018 18:57:10 +0000 (14:57 -0400)
* pt.c (tsubst_pack_expansion): Set cp_unevaluated_operand while
instantiating dummy parms.

From-SVN: r258500

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/variadic-nested2.C [new file with mode: 0644]

index 0da60a3e99bf9a09110bdfb66b2e678cb1e38ea4..6e2958bc8e9bae18b33750778a555570bf09c07a 100644 (file)
@@ -1,5 +1,9 @@
 2018-03-13  Jason Merrill  <jason@redhat.com>
 
+       PR c++/84839 - ICE with decltype of parameter pack.
+       * pt.c (tsubst_pack_expansion): Set cp_unevaluated_operand while
+       instantiating dummy parms.
+
        * parser.c (cp_parser_simple_type_specifier): Pedwarn about auto
        parameter even without -Wpedantic.
 
index 4640ca08ce003188dbe6057ddd7ee1d4989a03dd..fdc1c9a7a7580472a177672308b4e6b03e6e2777 100644 (file)
@@ -11717,7 +11717,9 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain,
            {
              /* This parameter pack was used in an unevaluated context.  Just
                 make a dummy decl, since it's only used for its type.  */
+             ++cp_unevaluated_operand;
              arg_pack = tsubst_decl (parm_pack, args, complain);
+             --cp_unevaluated_operand;
              if (arg_pack && DECL_PACK_P (arg_pack))
                /* Partial instantiation of the parm_pack, we can't build
                   up an argument pack yet.  */
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-nested2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-nested2.C
new file mode 100644 (file)
index 0000000..ce18f99
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/84839
+// { dg-do compile { target c++11 } }
+
+template<typename... T>
+struct S {
+    using fptr = void(*)(T... x, decltype(x)... y);
+};
+
+using F = S<int>::fptr;