re PR c++/47022 (ICE: in tsubst_copy, at cp/pt.c:11682)
authorJakub Jelinek <jakub@redhat.com>
Fri, 7 Jan 2011 11:49:44 +0000 (12:49 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 7 Jan 2011 11:49:44 +0000 (12:49 +0100)
PR c++/47022
* pt.c (tsubst_copy_and_build): Use tsubst instead of tsubst_copy
for the second build_x_va_arg argument.

* g++.dg/template/stdarg1.C: New test.

From-SVN: r168564

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/stdarg1.C [new file with mode: 0644]

index 67411a5fe09e61450ae4cacc21e1c0eb94a06c77..35d8864cd582075761a7bd1962551011aaa59643 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/47022
+       * pt.c (tsubst_copy_and_build): Use tsubst instead of tsubst_copy
+       for the second build_x_va_arg argument.
+
 2011-01-05  Tom Tromey  <tromey@redhat.com>
 
        * typeck.c (cp_build_addr_expr_1): Update call to lvalue_error.
index ae6aed0fad98012daadc93d4fec77645739bd667..d9dbbe0aa857d67447cbbc0244f64d3fa83fa11e 100644 (file)
@@ -13239,8 +13239,7 @@ tsubst_copy_and_build (tree t,
 
     case VA_ARG_EXPR:
       return build_x_va_arg (RECUR (TREE_OPERAND (t, 0)),
-                            tsubst_copy (TREE_TYPE (t), args, complain,
-                                         in_decl));
+                            tsubst (TREE_TYPE (t), args, complain, in_decl));
 
     case OFFSETOF_EXPR:
       return finish_offsetof (RECUR (TREE_OPERAND (t, 0)));
index 0a1c3d0de06f1c6cfbff9207a4334acf945b08ee..2bab56a9dede7433df015bba74eb65731f6aabe4 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/47022
+       * g++.dg/template/stdarg1.C: New test.
+
 2011-01-06  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/47195
diff --git a/gcc/testsuite/g++.dg/template/stdarg1.C b/gcc/testsuite/g++.dg/template/stdarg1.C
new file mode 100644 (file)
index 0000000..ddc8c78
--- /dev/null
@@ -0,0 +1,53 @@
+// PR c++/47022
+// { dg-do compile }
+
+#include <cstdarg>
+
+template <typename T>
+void
+f1 (T *p, va_list ap)
+{
+  *p = va_arg (ap, long double);
+  *p += va_arg (ap, double);
+}
+
+template <typename T>
+void
+f2 (T *p, va_list ap)
+{
+  *p = __real__ va_arg (ap, _Complex int);
+  *p += __imag__ va_arg (ap, _Complex double);
+  *p += __imag__ va_arg (ap, _Complex long double);
+}
+
+template <typename T>
+void
+f3 (T *p, va_list ap)
+{
+  *p = va_arg (ap, T);
+}
+
+void
+foo (int x, va_list ap)
+{
+  if (x == 0)
+    {
+      long double ld;
+      f1 (&ld, ap);
+    }
+  else if (x == 1)
+    {
+      int i;
+      f2 (&i, ap);
+    }
+  else if (x == 2)
+    {
+      long double ld;
+      f3 (&ld, ap);
+    }
+  else if (x == 3)
+    {
+      _Complex double cd;
+      f3 (&cd, ap);
+    }
+}