From: Kriang Lerdsuwanakij Date: Sun, 18 Nov 2001 06:24:45 +0000 (+0000) Subject: mangle.c (write_expression): Handle CAST_EXPR, STATIC_CAST_EXPR, CONST_CAST_EXPR. X-Git-Tag: prereleases/libstdc++-3.0.95~882 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=873ff98777cfd6685aae1aac33d2bc4d52bcd781;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e2d2fbe060bd..6503ad8e6225 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2001-11-17 Kriang Lerdsuwanakij + + * 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 * cp-tree.h (print_class_statistics): Restore. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 0f6500ee4688..5466ca90bf10 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 ddae93a6840b..8e0f7b2478e0 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 000000000000..a20b877f477b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle3.C @@ -0,0 +1,19 @@ +// Test mangling of type casts +// { dg-do compile } + +template class A {}; +template class B {}; + +template void f(A &, B &) {} +template void g(A &, B(i)> &) {} + +int main() +{ + A<1> a; + B 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 000000000000..e0981273b2e9 --- /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 class C {}; +template class D {}; +template class E {}; + +template void f(D &, C(b)> &) {} +template void g(D &, E(b)> &) {} + +B b; + +int main() +{ + C(&b)> c; + D<&b> d; + E(&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\]" } }