diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2001-11-18 06:24:45 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2001-11-18 06:24:45 +0000 |
commit | 873ff98777cfd6685aae1aac33d2bc4d52bcd781 (patch) | |
tree | 088f153453be5db54057e007758e8f560c599b5d | |
parent | 6f684b536827ea2e00d45fa88b8be9b301bfd8e0 (diff) | |
download | gcc-873ff98777cfd6685aae1aac33d2bc4d52bcd781.zip gcc-873ff98777cfd6685aae1aac33d2bc4d52bcd781.tar.gz gcc-873ff98777cfd6685aae1aac33d2bc4d52bcd781.tar.bz2 |
mangle.c (write_expression): Handle CAST_EXPR, STATIC_CAST_EXPR, CONST_CAST_EXPR.
* mangle.c (write_expression): Handle CAST_EXPR, STATIC_CAST_EXPR,
CONST_CAST_EXPR.
* operators.def: Add CAST_EXPR, STATIC_CAST_EXPR, CONST_CAST_EXPR.
From-SVN: r47135
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/mangle.c | 24 | ||||
-rw-r--r-- | gcc/cp/operators.def | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle3.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle4.C | 26 |
5 files changed, 73 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e2d2fbe..6503ad8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2001-11-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + * mangle.c (write_expression): Handle CAST_EXPR, STATIC_CAST_EXPR, + CONST_CAST_EXPR. + * operators.def: Add CAST_EXPR, STATIC_CAST_EXPR, CONST_CAST_EXPR. + 2001-11-16 Neil Booth <neil@daikokuya.demon.co.uk> * cp-tree.h (print_class_statistics): Restore. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 0f6500e..5466ca9 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1818,18 +1818,32 @@ write_expression (expr) /* If it wasn't any of those, recursively expand the expression. */ write_string (operator_name_info[(int) code].mangled_name); - /* Handle pointers-to-members specially. */ - if (code == SCOPE_REF) + switch (code) { + case CAST_EXPR: + write_type (TREE_TYPE (expr)); + write_expression (TREE_VALUE (TREE_OPERAND (expr, 0))); + break; + + case STATIC_CAST_EXPR: + case CONST_CAST_EXPR: + write_type (TREE_TYPE (expr)); + write_expression (TREE_OPERAND (expr, 0)); + break; + + /* Handle pointers-to-members specially. */ + case SCOPE_REF: write_type (TREE_OPERAND (expr, 0)); if (TREE_CODE (TREE_OPERAND (expr, 1)) == IDENTIFIER_NODE) write_source_name (TREE_OPERAND (expr, 1)); else write_encoding (TREE_OPERAND (expr, 1)); + break; + + default: + for (i = 0; i < TREE_CODE_LENGTH (code); ++i) + write_expression (TREE_OPERAND (expr, i)); } - else - for (i = 0; i < TREE_CODE_LENGTH (code); ++i) - write_expression (TREE_OPERAND (expr, i)); } } diff --git a/gcc/cp/operators.def b/gcc/cp/operators.def index ddae93a..8e0f7b2 100644 --- a/gcc/cp/operators.def +++ b/gcc/cp/operators.def @@ -102,6 +102,9 @@ DEF_SIMPLE_OPERATOR ("alignof", ALIGNOF_EXPR, "v17alignof", 1) /* The cast operator. */ DEF_SIMPLE_OPERATOR ("", TYPE_EXPR, "cv", 1) +DEF_SIMPLE_OPERATOR ("", CAST_EXPR, "cv", 1) +DEF_SIMPLE_OPERATOR ("", CONST_CAST_EXPR, "cv", 1) +DEF_SIMPLE_OPERATOR ("", STATIC_CAST_EXPR, "cv", 1) /* Binary operators. */ DEF_SIMPLE_OPERATOR ("+", PLUS_EXPR, "pl", 2) diff --git a/gcc/testsuite/g++.dg/abi/mangle3.C b/gcc/testsuite/g++.dg/abi/mangle3.C new file mode 100644 index 0000000..a20b877 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle3.C @@ -0,0 +1,19 @@ +// Test mangling of type casts +// { dg-do compile } + +template<int i> class A {}; +template<bool b> class B {}; + +template<int i> void f(A<i> &, B<bool(i)> &) {} +template<int i> void g(A<i> &, B<static_cast<bool>(i)> &) {} + +int main() +{ + A<1> a; + B<true> b; + f(a, b); + g(a, b); +} + +// { dg-final { scan-assembler "\n_?_Z1fILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z1gILi1EEvR1AIXT_EER1BIXcvbT_EE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle4.C b/gcc/testsuite/g++.dg/abi/mangle4.C new file mode 100644 index 0000000..e098127 --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle4.C @@ -0,0 +1,26 @@ +// Test mangling of type casts +// { dg-do compile } + +class A {}; +class B : A {}; + +template<const A* a> class C {}; +template<const B* b> class D {}; +template<B* b> class E {}; + +template<const B* b> void f(D<b> &, C<static_cast<const A*>(b)> &) {} +template<const B* b> void g(D<b> &, E<const_cast<B*>(b)> &) {} + +B b; + +int main() +{ + C<static_cast<const A*>(&b)> c; + D<&b> d; + E<const_cast<B*>(&b)> e; + f(d, c); + g(d, e); +} + +// { dg-final { scan-assembler "\n_?_Z1fIXadL_Z1bEEEvR1DIXT_EER1CIXcvPK1AT_EE\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z1gIXadL_Z1bEEEvR1DIXT_EER1EIXcvP1BT_EE\[: \t\n\]" } } |