From: jakub Date: Wed, 4 Feb 2009 16:50:22 +0000 (+0000) Subject: PR c++/39095 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=59280dedbd1a4253efbf148efa31a9fa01027efd;p=thirdparty%2Fgcc.git 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. * g++.dg/abi/mangle31.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143933 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c2765daac816..2a08d8bbae4f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2009-02-04 Jakub Jelinek + + 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 * typeck.c (cp_build_unary_op): Only complain about taking address diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index a7b466217ebd..f51136ac3d5c 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 20c74d882201..c63ce3f0429f 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 25dedae83a0a..37b578345503 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-02-04 Jakub Jelinek + + PR c++/39095 + * g++.dg/abi/mangle31.C: New test. + 2009-02-03 Joseph Myers 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 000000000000..4be2e0b03fc9 --- /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" } }