diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-02-04 17:50:22 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-02-04 17:50:22 +0100 |
commit | ee429f8459118f0286430a8f86884055ae954694 (patch) | |
tree | 9a4e4de9a60f6b8c400fb1e352863fd9b69294d5 | |
parent | 5b43bf058b51b25a6e90692bc61b3efad883b7e7 (diff) | |
download | gcc-ee429f8459118f0286430a8f86884055ae954694.zip gcc-ee429f8459118f0286430a8f86884055ae954694.tar.gz gcc-ee429f8459118f0286430a8f86884055ae954694.tar.bz2 |
re PR c++/39095 (Mangling changes break ABI)
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.
From-SVN: r143933
-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 c2765da..2a08d8b 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 a7b4662..f51136a 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 20c74d8..c63ce3f 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 25dedae..37b5783 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 0000000..4be2e0b --- /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" } } |