aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2001-01-25 08:35:21 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2001-01-25 08:35:21 +0100
commit324ffb8c3d49d2f17b88626b0b5b38194c2e4bf3 (patch)
treea55968fbce33880164faba01e3ad14fd4fc113d0 /gcc
parentcf480ba7da5dda6ca27d61f3b8d499fcd1ab1ebe (diff)
downloadgcc-324ffb8c3d49d2f17b88626b0b5b38194c2e4bf3.zip
gcc-324ffb8c3d49d2f17b88626b0b5b38194c2e4bf3.tar.gz
gcc-324ffb8c3d49d2f17b88626b0b5b38194c2e4bf3.tar.bz2
mangle.c (write_mangled_name, [...]): Mangle overloaded operators even in "C" linkage.
* mangle.c (write_mangled_name, write_encoding): Mangle overloaded operators even in "C" linkage. * method.c (set_mangled_name_for_decl): Likewise. * decl.c (grokfndecl): Call set_mangled_name_for_decl even for overloaded operators in "C" linkage. * g++.old-deja/g++.other/mangle2.C: New test. From-SVN: r39257
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/cp/mangle.c15
-rw-r--r--gcc/cp/method.c18
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/mangle2.C24
6 files changed, 67 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 69ac61d..8ba3cc7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2001-01-25 Jakub Jelinek <jakub@redhat.com>
+
+ * mangle.c (write_mangled_name, write_encoding): Mangle overloaded
+ operators even in "C" linkage.
+ * method.c (set_mangled_name_for_decl): Likewise.
+ * decl.c (grokfndecl): Call set_mangled_name_for_decl even for
+ overloaded operators in "C" linkage.
+
2001-01-24 Nathan Sidwell <nathan@codesourcery.com>
* pt.c (tsubst_decl): Remove IN_DECL parameter.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 6fcf9c4..761b843 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -8846,7 +8846,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
/* Plain overloading: will not be grok'd by grokclassfn. */
if (! ctype && ! processing_template_decl
- && !DECL_EXTERN_C_P (decl)
+ && (! DECL_EXTERN_C_P (decl) || DECL_OVERLOADED_OPERATOR_P (decl))
&& (! DECL_USE_TEMPLATE (decl) || name_mangling_version < 1))
set_mangled_name_for_decl (decl);
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index d0c8e69..10f0bc89 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -602,10 +602,14 @@ write_mangled_name (decl)
{
MANGLE_TRACE_TREE ("mangled-name", decl);
- if (DECL_LANG_SPECIFIC (decl) && DECL_EXTERN_C_FUNCTION_P (decl))
+ if (DECL_LANG_SPECIFIC (decl)
+ && DECL_EXTERN_C_FUNCTION_P (decl)
+ && ! DECL_OVERLOADED_OPERATOR_P (decl))
/* The standard notes:
"The <encoding> of an extern "C" function is treated like
- global-scope data, i.e. as its <source-name> without a type." */
+ global-scope data, i.e. as its <source-name> without a type."
+ We cannot write overloaded operators that way though,
+ because it contains characters invalid in assembler. */
write_source_name (DECL_NAME (decl));
else
/* C++ name; needs to be mangled. */
@@ -626,7 +630,12 @@ write_encoding (decl)
if (DECL_LANG_SPECIFIC (decl) && DECL_EXTERN_C_FUNCTION_P (decl))
{
- write_source_name (DECL_NAME (decl));
+ /* For overloaded operators write just the mangled name
+ without arguments. */
+ if (DECL_OVERLOADED_OPERATOR_P (decl))
+ write_name (decl, /*ignore_local_scope=*/0);
+ else
+ write_source_name (DECL_NAME (decl));
return;
}
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 3e6b3cc..17016a4 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1763,6 +1763,24 @@ set_mangled_name_for_decl (decl)
return;
}
+ if (DECL_EXTERN_C_P (decl))
+ {
+ /* In extern "C" we have to mangle at least overloaded operators,
+ because they contain characters invalid in assembler. */
+ enum tree_code code = DECL_OVERLOADED_OPERATOR_P (decl);
+ const char *name;
+
+ if (code)
+ {
+ if (DECL_ASSIGNMENT_OPERATOR_P (decl))
+ name = assignment_operator_name_info[(int) code].mangled_name;
+ else
+ name = operator_name_info[(int) code].mangled_name;
+ DECL_ASSEMBLER_NAME (decl) = get_identifier (name);
+ return;
+ }
+ }
+
parm_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
if (DECL_STATIC_FUNCTION_P (decl))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c68a93d..a8352d8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2001-01-25 Jakub Jelinek <jakub@redhat.com>
+
+ * g++.old-deja/g++.other/mangle2.C: New test.
+
2001-01-24 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.c-torture/compile/20010124-1.c: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.other/mangle2.C b/gcc/testsuite/g++.old-deja/g++.other/mangle2.C
new file mode 100644
index 0000000..25bab87
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/mangle2.C
@@ -0,0 +1,24 @@
+// Test for overloaded operators in "C" linkage
+// Build don't link:
+
+extern "C" {
+typedef struct b
+{
+ int a;
+} c;
+
+extern const c z;
+
+inline bool operator!=(const c& x, const c& y)
+{
+ return x.a != y.a;
+}
+};
+
+void foo();
+
+void bar(c x)
+{
+ if (x != z)
+ foo();
+}