aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-07-02 23:56:38 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2004-07-02 23:56:38 +0000
commitd9634d537130407bc8ea2ada9508e2386e1b714b (patch)
tree107d4bc8e7c8de072b0bf2b4d32c6f3a7f367652 /gcc
parent1568430fae5e11fe4496dcc194c9771f6e088bf1 (diff)
downloadgcc-d9634d537130407bc8ea2ada9508e2386e1b714b.zip
gcc-d9634d537130407bc8ea2ada9508e2386e1b714b.tar.gz
gcc-d9634d537130407bc8ea2ada9508e2386e1b714b.tar.bz2
re PR c++/16240 (g++ generates incorrect mangled name)
PR c++/16240 * mangle.c (write_template_arg): Correct mangling. PR c++/16240 * g++.dg/abi/mangle22.C: New test. * g++.dg/abi/mangle23.C: Likewise. From-SVN: r84033
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/mangle.c16
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle22.C9
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle23.C9
5 files changed, 39 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e226c7da..8e21875 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2004-07-02 Mark Mitchell <mark@codesourcery.com>
+ PR c++/16240
+ * mangle.c (write_template_arg): Correct mangling.
+
PR c++/16297
* decl.c (grokdeclarator): Robustify.
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index 81ac4ad..97d4309 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -2203,12 +2203,20 @@ write_template_arg (tree node)
write_template_arg_literal (node);
else if (DECL_P (node))
{
- /* G++ 3.2 incorrectly mangled non-type template arguments of
- enumeration type using their names. */
- if (code == CONST_DECL)
+ /* Until ABI version 2, non-type template arguments of
+ enumeration type were mangled using their names. */
+ if (code == CONST_DECL && !abi_version_at_least (2))
G.need_abi_warning = 1;
write_char ('L');
- write_char ('Z');
+ /* Until ABI version 3, the underscore before the mangled name
+ was incorrectly omitted. */
+ if (!abi_version_at_least (3))
+ {
+ G.need_abi_warning = 1;
+ write_char ('Z');
+ }
+ else
+ write_string ("_Z");
write_encoding (node);
write_char ('E');
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9aeee5c..8638c0e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2004-07-02 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/16240
+ * g++.dg/abi/mangle22.C: New test.
+ * g++.dg/abi/mangle23.C: Likewise.
+
2004-07-02 David Billinghurst (David.Billinghurst@riotinto.com)
PR fortran/16290
diff --git a/gcc/testsuite/g++.dg/abi/mangle22.C b/gcc/testsuite/g++.dg/abi/mangle22.C
new file mode 100644
index 0000000..93ddd1e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle22.C
@@ -0,0 +1,9 @@
+// PR c++/16240
+// { dg-options "-fabi-version=3" }
+
+void foo(char);
+template<void (&)(char)> struct CB {};
+
+void g(CB<foo> i) {}
+
+// { dg-final { scan-assembler "\n_?_Z1g2CBIL_Z3foocEE\[: \t\n\]" } }
diff --git a/gcc/testsuite/g++.dg/abi/mangle23.C b/gcc/testsuite/g++.dg/abi/mangle23.C
new file mode 100644
index 0000000..c17f54b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/mangle23.C
@@ -0,0 +1,9 @@
+// PR c++/16240
+// { dg-options "-fabi-version=2" }
+
+void foo(char);
+template<void (&)(char)> struct CB {};
+
+void g(CB<foo> i) {}
+
+// { dg-final { scan-assembler "\n_?_Z1g2CBILZ3foocEE\[: \t\n\]" } }