From 5b770a964ade161bf7ae6cd9e2a0cfa55ad8d8d3 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 23 Aug 2002 00:28:29 +0000 Subject: [PATCH] typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR and COND_EXPR specially; fix error message output. * 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. From-SVN: r56524 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/typeck.c | 23 ++++++++++++++++++++++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/inherit/cond1.C | 10 ++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/inherit/cond1.C 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 + + * typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR + and COND_EXPR specially; fix error message output. + 2002-08-22 Jason Merrill * 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 + + * testsuite/g++.dg/inherit/cond1.C: New test. + 2002-08-22 Geoffrey Keating * 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; +}