diff options
| -rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
| -rw-r--r-- | gcc/cp/mangle.c | 31 | ||||
| -rw-r--r-- | gcc/cp/operators.def | 3 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/abi/mangle31.C | 35 |
5 files changed, 67 insertions, 16 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c2765daac81..2a08d8bbae4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2009-02-04 Jakub Jelinek <jakub@redhat.com> + + PR c++/39095 + * operators.def: Use COMPONENT_REF code for ->/pt operator again, + remove ./dt operator. + * mangle.c (write_expression): Handle COMPONENT_REF after handling + ADDR_EXPR, for COMPONENT_REF without ARROW_EXPR inside of it + write_string ("dt") instead of using operators.def. + 2009-02-03 Jason Merrill <jason@redhat.com> * typeck.c (cp_build_unary_op): Only complain about taking address diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index a7b466217eb..f51136ac3d5 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -2298,20 +2298,6 @@ write_expression (tree expr) write_template_args (template_args); } } - else if (code == COMPONENT_REF) - { - tree ob = TREE_OPERAND (expr, 0); - - if (TREE_CODE (ob) == ARROW_EXPR) - { - code = ARROW_EXPR; - ob = TREE_OPERAND (ob, 0); - } - - write_string (operator_name_info[(int)code].mangled_name); - write_expression (ob); - write_member_name (TREE_OPERAND (expr, 1)); - } else { int i; @@ -2334,6 +2320,23 @@ write_expression (tree expr) code = TREE_CODE (expr); } + if (code == COMPONENT_REF) + { + tree ob = TREE_OPERAND (expr, 0); + + if (TREE_CODE (ob) == ARROW_EXPR) + { + write_string (operator_name_info[(int)code].mangled_name); + ob = TREE_OPERAND (ob, 0); + } + else + write_string ("dt"); + + write_expression (ob); + write_member_name (TREE_OPERAND (expr, 1)); + return; + } + /* If it wasn't any of those, recursively expand the expression. */ write_string (operator_name_info[(int) code].mangled_name); diff --git a/gcc/cp/operators.def b/gcc/cp/operators.def index 20c74d88220..c63ce3f0429 100644 --- a/gcc/cp/operators.def +++ b/gcc/cp/operators.def @@ -125,8 +125,7 @@ DEF_SIMPLE_OPERATOR ("&&", TRUTH_ANDIF_EXPR, "aa", 2) DEF_SIMPLE_OPERATOR ("||", TRUTH_ORIF_EXPR, "oo", 2) DEF_SIMPLE_OPERATOR (",", COMPOUND_EXPR, "cm", 2) DEF_SIMPLE_OPERATOR ("->*", MEMBER_REF, "pm", 2) -DEF_SIMPLE_OPERATOR ("->", ARROW_EXPR, "pt", 2) -DEF_SIMPLE_OPERATOR (".", COMPONENT_REF, "dt", 2) +DEF_SIMPLE_OPERATOR ("->", COMPONENT_REF, "pt", 2) DEF_SIMPLE_OPERATOR ("[]", ARRAY_REF, "ix", 2) DEF_SIMPLE_OPERATOR ("++", POSTINCREMENT_EXPR, "pp", 2) DEF_SIMPLE_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", 2) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 25dedae83a0..37b57834550 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-02-04 Jakub Jelinek <jakub@redhat.com> + + PR c++/39095 + * g++.dg/abi/mangle31.C: New test. + 2009-02-03 Joseph Myers <joseph@codesourcery.com> PR c/29129 diff --git a/gcc/testsuite/g++.dg/abi/mangle31.C b/gcc/testsuite/g++.dg/abi/mangle31.C new file mode 100644 index 00000000000..4be2e0b03fc --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle31.C @@ -0,0 +1,35 @@ +// PR c++/39095 +// { dg-do compile } + +struct B +{ + int b; +}; + +struct A +{ + B *operator->(); + A (); + B b; +}; + +A::A () +{ +} + +B * +A::operator->() +{ + return &b; +} + +A a; + +int +foo () +{ + return a->b; +} + +// { dg-final { scan-assembler "_ZN1AptEv" } } +// { dg-final { scan-assembler-not "_ZN1AdtEv" } } |

