diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-11-20 07:26:11 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-11-20 07:26:11 +0100 |
commit | 63d34078b671ef7f3666daea632596f0885ee840 (patch) | |
tree | a1484ba038821600a058165256579857c900269d /gcc | |
parent | cb96cf3b9d2dbcf559f06db3eb6b2072629a821c (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/overload/template3.C | 15 |
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" } } */ |