summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-01-07 11:49:44 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-01-07 11:49:44 +0000
commit98e9a2ed325898294c02b3cec2d0c0a024c2af49 (patch)
treed291264fa490c8d3846683eb61e314c2dda9a43e
parent1f7fbd3de89005994796c4160b28f293c8735b23 (diff)
downloadppe42-gcc-98e9a2ed325898294c02b3cec2d0c0a024c2af49.tar.gz
ppe42-gcc-98e9a2ed325898294c02b3cec2d0c0a024c2af49.zip
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168564 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/stdarg1.C53
4 files changed, 65 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 67411a5fe09..35d8864cd58 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index ae6aed0fad9..d9dbbe0aa85 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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)));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0a1c3d0de06..2bab56a9ded 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..ddc8c786246
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/stdarg1.C
@@ -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);
+ }
+}
OpenPOWER on IntegriCloud