summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2002-08-23 00:28:29 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2002-08-23 00:28:29 +0000
commitb37a0edc3e1f8d53064d50f77296899cb890c9e0 (patch)
tree9cc24570bcc521efa7653573ea5eac21dd59fe34
parent852c026b8dde4dd1af018b2a6234a93f1f2c621e (diff)
downloadppe42-gcc-b37a0edc3e1f8d53064d50f77296899cb890c9e0.tar.gz
ppe42-gcc-b37a0edc3e1f8d53064d50f77296899cb890c9e0.zip
* typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR
and COND_EXPR specially; fix error message output. * testsuite/g++.dg/inherit/cond1.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@56524 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/typeck.c23
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/inherit/cond1.C10
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2933da88b6b..cb95b6d33b7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2002-08-22 Mark Mitchell <mark@codesourcery.com>
+
+ * typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR
+ and COND_EXPR specially; fix error message output.
+
2002-08-22 Jason Merrill <jason@redhat.com>
* pt.c (tsubst_expr): RETURN_EXPR is now RETURN_STMT_EXPR.
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index eaa79a0da7e..624b379cf71 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -1859,6 +1859,27 @@ build_class_member_access_expr (tree object, tree member,
my_friendly_assert (DECL_P (member) || BASELINK_P (member),
20020801);
+ /* Transform `(a, b).x' into `a, b.x' and `(a ? b : c).x' into
+ `a ? b.x : c.x'. These transformations should not really be
+ necessary, but they are. */
+ if (TREE_CODE (object) == COMPOUND_EXPR)
+ {
+ result = build_class_member_access_expr (TREE_OPERAND (object, 1),
+ member, access_path,
+ preserve_reference);
+ return build (COMPOUND_EXPR, TREE_TYPE (result),
+ TREE_OPERAND (object, 0), result);
+ }
+ else if (TREE_CODE (object) == COND_EXPR)
+ return (build_conditional_expr
+ (TREE_OPERAND (object, 0),
+ build_class_member_access_expr (TREE_OPERAND (object, 1),
+ member, access_path,
+ preserve_reference),
+ build_class_member_access_expr (TREE_OPERAND (object, 2),
+ member, access_path,
+ preserve_reference)));
+
/* [expr.ref]
The type of the first expression shall be "class object" (of a
@@ -2135,7 +2156,7 @@ finish_class_member_access_expr (tree object, tree name)
if (TREE_CODE (scope) == NAMESPACE_DECL)
{
error ("`%D::%D' is not a member of `%T'",
- scope, member, object_type);
+ scope, name, object_type);
return error_mark_node;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1fdf1bcf746..00a92134d45 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-08-22 Mark Mitchell <mark@codesourcery.com>
+
+ * testsuite/g++.dg/inherit/cond1.C: New test.
+
2002-08-22 Geoffrey Keating <geoffk@redhat.com>
* gcc.dg/noncompile/incomplete-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/inherit/cond1.C b/gcc/testsuite/g++.dg/inherit/cond1.C
new file mode 100644
index 00000000000..843c72ca308
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/cond1.C
@@ -0,0 +1,10 @@
+// Origin: jason@redhat.com
+// { dg-do compile }
+
+struct A { A(); A(const A&); int i; };
+struct B: public A { };
+
+int f (bool b, A& ar, B& br)
+{
+ return (b?ar:br).i;
+}
OpenPOWER on IntegriCloud