aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-11-20 07:26:11 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-11-20 07:26:11 +0100
commit63d34078b671ef7f3666daea632596f0885ee840 (patch)
treea1484ba038821600a058165256579857c900269d /gcc
parentcb96cf3b9d2dbcf559f06db3eb6b2072629a821c (diff)
downloadgcc-63d34078b671ef7f3666daea632596f0885ee840.zip
gcc-63d34078b671ef7f3666daea632596f0885ee840.tar.gz
gcc-63d34078b671ef7f3666daea632596f0885ee840.tar.bz2
re PR c++/33962 (ICE at call to overloaded template function with variable-length function argument list)
PR c++/33962 * pt.c (more_specialized_fn): Don't segfault if one or both argument list end with ellipsis. * g++.dg/overload/template3.C: New test. From-SVN: r130308
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/overload/template3.C15
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 193931d..d8e95c6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2007-11-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/33962
+ * pt.c (more_specialized_fn): Don't segfault if one or
+ both argument list end with ellipsis.
+
2007-11-18 Jakub Jelinek <jakub@redhat.com>
PR c++/30988
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5e1335f..4b09e85 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -13523,6 +13523,10 @@ more_specialized_fn (tree pat1, tree pat2, int len)
args1 = TREE_CHAIN (args1);
args2 = TREE_CHAIN (args2);
+
+ /* Stop when an ellipsis is seen. */
+ if (args1 == NULL_TREE || args2 == NULL_TREE)
+ break;
}
processing_template_decl--;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e93fa8a..585c720 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/33962
+ * g++.dg/overload/template3.C: New test.
+
2007-11-19 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/33317
diff --git a/gcc/testsuite/g++.dg/overload/template3.C b/gcc/testsuite/g++.dg/overload/template3.C
new file mode 100644
index 0000000..90ccfd8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/template3.C
@@ -0,0 +1,15 @@
+// PR c++/33962
+// { dg-do compile }
+
+template <class T> struct A;
+
+template <class U> void foo (const U &x, ...);
+template <class T> void foo (const A<T> &x, ...);
+
+void bar (const A<int> &x, const char *y)
+{
+ foo (x, y);
+}
+
+/* { dg-final { scan-assembler "_Z3fooIiEvRK1AIT_Ez" } } */
+/* { dg-final { scan-assembler-not "_Z3fooI1AIiEEvRKT_z" } } */