From 1c06710a55e72ca4c0aea67070b23072d8450839 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 21 Mar 2001 17:19:54 +0000 Subject: [PATCH] mangle.c (mangle_decl_string): Mangle the names of overloaded operators, even when they have `extern "C"' linkage. * mangle.c (mangle_decl_string): Mangle the names of overloaded operators, even when they have `extern "C"' linkage. From-SVN: r40690 --- gcc/cp/ChangeLog | 5 ++++ gcc/cp/mangle.c | 2 ++ .../g++.old-deja/g++.other/mangle2.C | 24 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/mangle2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 15ff7b546bb..3488b1149ef 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2001-03-21 Mark Mitchell + + * mangle.c (mangle_decl_string): Mangle the names of overloaded + operators, even when they have `extern "C"' linkage. + 2001-03-19 Mark Mitchell * class.c (get_vtable_decl): Use SET_DECL_ASSEMBLER_NAME, diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 4d63f768b35..101f4123852 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -2071,6 +2071,8 @@ mangle_decl_string (decl) write_type (TREE_TYPE (decl)); else if (/* The names of `extern "C"' functions are not mangled. */ (TREE_CODE (decl) == FUNCTION_DECL + /* But overloaded operator names *are* mangled. */ + && !DECL_OVERLOADED_OPERATOR_P (decl) /* If there's no DECL_LANG_SPECIFIC, it's a function built by language-independent code, which never builds functions with C++ linkage. */ 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 00000000000..25bab87a249 --- /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(); +}