OSDN Git Service

Fix for PR c++/40808
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Oct 2009 21:38:50 +0000 (21:38 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Oct 2009 21:38:50 +0000 (21:38 +0000)
gcc/cp/ChangeLog:

PR c++/40808
* mangle.c (write_template_args): Allow mangling of empty template
argument list. Updated function comments.

gcc/testsuite/ChangeLog:

PR c++/40808
* g++.dg/abi/mangle34.C: New test

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153517 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/mangle34.C [new file with mode: 0644]

index 70cdad3..3ce735b 100644 (file)
@@ -1,3 +1,9 @@
+2009-10-23  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/40808
+       * mangle.c (write_template_args): Allow mangling of empty template
+       argument list. Updated function comments.
+
 2009-10-23  Jason Merrill  <jason@redhat.com>
 
        * semantics.c (lambda_expr_this_capture): Use thisify_lambda_field.
 2009-10-23  Jason Merrill  <jason@redhat.com>
 
        * semantics.c (lambda_expr_this_capture): Use thisify_lambda_field.
index f9a5503..d4bcbac 100644 (file)
@@ -2284,21 +2284,22 @@ write_class_enum_type (const tree type)
 /* Non-terminal <template-args>.  ARGS is a TREE_VEC of template
    arguments.
 
 /* Non-terminal <template-args>.  ARGS is a TREE_VEC of template
    arguments.
 
-     <template-args> ::= I <template-arg>+ E  */
+     <template-args> ::= I <template-arg>* E  */
 
 static void
 write_template_args (tree args)
 {
   int i;
 
 static void
 write_template_args (tree args)
 {
   int i;
-  int length = TREE_VEC_LENGTH (args);
+  int length = 0;
 
   MANGLE_TRACE_TREE ("template-args", args);
 
   write_char ('I');
 
 
   MANGLE_TRACE_TREE ("template-args", args);
 
   write_char ('I');
 
-  gcc_assert (length > 0);
+  if (args)
+    length = TREE_VEC_LENGTH (args);
 
 
-  if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
+  if (args && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
     {
       /* We have nested template args.  We want the innermost template
         argument list.  */
     {
       /* We have nested template args.  We want the innermost template
         argument list.  */
index 4d6eb81..c44b4d7 100644 (file)
@@ -1,3 +1,8 @@
+2009-10-23  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/40808
+       * g++.dg/abi/mangle34.C: New test
+
 2009-10-23  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/lambda/lambda-nested2.C: New.
 2009-10-23  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/lambda/lambda-nested2.C: New.
diff --git a/gcc/testsuite/g++.dg/abi/mangle34.C b/gcc/testsuite/g++.dg/abi/mangle34.C
new file mode 100644 (file)
index 0000000..08c3bc0
--- /dev/null
@@ -0,0 +1,41 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR c++/40808
+// { dg-do compile }
+// This tests the mangling of empty template argument list in a template
+// id.
+// { dg-final { scan-assembler "_ZNK5DummyclI3GenEENT_3SigIE10ResultTypeERKS2_" } }
+
+
+struct Void {};
+
+template <class R> struct FunType {
+  typedef R ResultType;
+};
+
+struct WrongNumberOfSigArgs {};
+
+template <typename R> struct CFunType {
+  template <class Dummy1=Void, class Dummy2=Void> struct Sig : public
+FunType<WrongNumberOfSigArgs> {};
+  template <class Dummy> struct Sig<Void,Dummy> : public FunType<R> {};
+};
+
+struct Dummy {
+  template <typename F> typename F::template Sig<>::ResultType operator()(F
+const& f) const {
+    return typename F::template Sig<>::ResultType(0);
+  }
+};
+
+struct Gen: public CFunType<int> {
+  int operator()() const {return 0;}
+  Gen() {}
+};
+
+int myfunction() {
+  return Dummy()(Gen());
+}
+
+int main() {
+  myfunction();
+}