* rtti.c (tinfo_name): Fix lengths for private case.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 1 Nov 2009 05:06:52 +0000 (05:06 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 1 Nov 2009 05:06:52 +0000 (05:06 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153789 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/rtti.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/rtti/typeid9.C [new file with mode: 0644]

index 594b2c6..8ea0001 100644 (file)
@@ -1,5 +1,9 @@
 2009-10-31  Jason Merrill  <jason@redhat.com>
 
+       * rtti.c (tinfo_name): Fix lengths for private case.
+
+2009-10-31  Jason Merrill  <jason@redhat.com>
+
        PR c++/41754
        * call.c (compare_ics): Avoid bad union use when
        comparing two ck_lists.
index 2926f97..c7af74a 100644 (file)
@@ -364,10 +364,10 @@ tinfo_name (tree type, bool mark_private)
   if (mark_private)
     {
       /* Inject '*' at beginning of name to force pointer comparison.  */
-      char* buf = (char*) XALLOCAVEC (char, length + 1);
+      char* buf = (char*) XALLOCAVEC (char, length + 2);
       buf[0] = '*';
-      memcpy (buf + 1, name, length);
-      name_string = build_string (length + 1, buf);
+      memcpy (buf + 1, name, length + 1);
+      name_string = build_string (length + 2, buf);
     }
   else
     name_string = build_string (length + 1, name);
index e26126e..aedb60b 100644 (file)
@@ -1,5 +1,7 @@
 2009-10-31  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/rtti/typeid9.C: New.
+
        PR c++/41754
        * g++.dg/cpp0x/initlist25.C: New.
 
diff --git a/gcc/testsuite/g++.dg/rtti/typeid9.C b/gcc/testsuite/g++.dg/rtti/typeid9.C
new file mode 100644 (file)
index 0000000..381252d
--- /dev/null
@@ -0,0 +1,21 @@
+// Test that the typeid name for a local class is properly null-terminated.
+// { dg-do run }
+
+#include <string.h>
+#include <typeinfo>
+#include <stdio.h>
+
+int f()
+{
+  struct A {}; struct B {};
+  const std::type_info &ti = typeid(A);
+  const std::type_info &ti2 = typeid(B);
+  puts (ti.name());
+  puts (ti2.name());
+  return strcmp (ti.name(), "Z1fvE1A") || strcmp (ti2.name(), "Z1fvE1B");
+}
+
+int main()
+{
+  return f();
+}