summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2009-02-04 16:50:22 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2009-02-04 16:50:22 +0000
commit59280dedbd1a4253efbf148efa31a9fa01027efd (patch)
tree9a4e4de9a60f6b8c400fb1e352863fd9b69294d5
parentfe8988230a6a608f95e24472a5d8f98cba6edc20 (diff)
downloadgcc-59280dedbd1a4253efbf148efa31a9fa01027efd.tar.gz
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
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/mangle.c31
-rw-r--r--gcc/cp/operators.def3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/abi/mangle31.C35
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" } }