tstellar / rpms / gcc

Forked from rpms/gcc 4 years ago
Clone
0d16b69
2007-11-20  Jakub Jelinek  <jakub@redhat.com>
0d16b69
0d16b69
	PR c++/33962
0d16b69
	* pt.c (more_specialized_fn): Don't segfault if one or
0d16b69
	both argument list end with ellipsis.
0d16b69
0d16b69
	* g++.dg/overload/template3.C: New test.
0d16b69
0d16b69
--- gcc/cp/pt.c	(revision 130307)
0d16b69
+++ gcc/cp/pt.c	(revision 130308)
0d16b69
@@ -13523,6 +13523,10 @@ more_specialized_fn (tree pat1, tree pat
0d16b69
 
0d16b69
       args1 = TREE_CHAIN (args1);
0d16b69
       args2 = TREE_CHAIN (args2);
0d16b69
+
0d16b69
+      /* Stop when an ellipsis is seen.  */
0d16b69
+      if (args1 == NULL_TREE || args2 == NULL_TREE)
0d16b69
+	break;
0d16b69
     }
0d16b69
 
0d16b69
   processing_template_decl--;
0d16b69
--- gcc/testsuite/g++.dg/overload/template3.C	(revision 0)
0d16b69
+++ gcc/testsuite/g++.dg/overload/template3.C	(revision 130308)
0d16b69
@@ -0,0 +1,15 @@
0d16b69
+// PR c++/33962
0d16b69
+// { dg-do compile }
0d16b69
+
0d16b69
+template <class T> struct A;
0d16b69
+
0d16b69
+template <class U> void foo (const U &x, ...);
0d16b69
+template <class T> void foo (const A<T> &x, ...);
0d16b69
+
0d16b69
+void bar (const A<int> &x, const char *y)
0d16b69
+{
0d16b69
+  foo (x, y);
0d16b69
+}
0d16b69
+
0d16b69
+/* { dg-final { scan-assembler "_Z3fooIiEvRK1AIT_Ez" } } */
0d16b69
+/* { dg-final { scan-assembler-not "_Z3fooI1AIiEEvRKT_z" } } */