summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2007-11-20 06:26:11 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2007-11-20 06:26:11 +0000
commit299a31a8a883dae7a1a5753d26cc7a71a98f428f (patch)
treea1484ba038821600a058165256579857c900269d
parent877e82f648bab65b7d0ccbb0c32b8b8221880eaf (diff)
downloadppe42-gcc-299a31a8a883dae7a1a5753d26cc7a71a98f428f.tar.gz
ppe42-gcc-299a31a8a883dae7a1a5753d26cc7a71a98f428f.zip
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130308 138bc75d-0d04-0410-961f-82ee72b054a4
-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 193931ddfc1..d8e95c68261 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 5e1335f439a..4b09e856459 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 e93fa8acfa6..585c7209b68 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 00000000000..90ccfd8add6
--- /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" } } */
OpenPOWER on IntegriCloud